Fix issue where temporary allocas were getting hoisted to function entry unnecessarily. We now explicitly mark temporary allocas and skip hoisting during the hoist pass. Shuold reduce stack usage. --- src/gallium/drivers/swr/rasterizer/jitter/builder.cpp | 17 +++++++++++++++++ src/gallium/drivers/swr/rasterizer/jitter/builder.h | 2 ++ .../drivers/swr/rasterizer/jitter/builder_mem.cpp | 1 + 3 files changed, 20 insertions(+)
diff --git a/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp b/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp index 53947c3..bd81560 100644 --- a/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp +++ b/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp @@ -111,4 +111,21 @@ namespace SwrJit mSimdVectorIntTy = ArrayType::get(mSimdInt32Ty, 4); mSimdVectorTRTy = ArrayType::get(mSimdFP32Ty, 5); } + + /// @brief Mark this alloca as temporary to avoid hoisting later on + void Builder::SetTempAlloca(Value* inst) + { + AllocaInst* pAlloca = dyn_cast<AllocaInst>(inst); + SWR_ASSERT(pAlloca, "Unexpected non-alloca instruction"); + MDNode* N = MDNode::get(JM()->mContext, MDString::get(JM()->mContext, "is_temp_alloca")); + pAlloca->setMetadata("is_temp_alloca", N); + } + + bool Builder::IsTempAlloca(Value* inst) + { + AllocaInst* pAlloca = dyn_cast<AllocaInst>(inst); + SWR_ASSERT(pAlloca, "Unexpected non-alloca instruction"); + + return (pAlloca->getMetadata("is_temp_alloca") != nullptr); + } } diff --git a/src/gallium/drivers/swr/rasterizer/jitter/builder.h b/src/gallium/drivers/swr/rasterizer/jitter/builder.h index 4c79bab..27a32bc 100644 --- a/src/gallium/drivers/swr/rasterizer/jitter/builder.h +++ b/src/gallium/drivers/swr/rasterizer/jitter/builder.h @@ -96,6 +96,8 @@ namespace SwrJit Type* mSimd32Int8Ty; void SetTargetWidth(uint32_t width); + void SetTempAlloca(Value* inst); + bool IsTempAlloca(Value* inst); #include "gen_builder.hpp" #include "gen_builder_meta.hpp" diff --git a/src/gallium/drivers/swr/rasterizer/jitter/builder_mem.cpp b/src/gallium/drivers/swr/rasterizer/jitter/builder_mem.cpp index c5f0b2b..eccf0ad 100644 --- a/src/gallium/drivers/swr/rasterizer/jitter/builder_mem.cpp +++ b/src/gallium/drivers/swr/rasterizer/jitter/builder_mem.cpp @@ -229,6 +229,7 @@ namespace SwrJit // store vSrc on the stack. this way we can select between a valid load address and the vSrc address Value* vSrcPtr = ALLOCA(vSrc->getType()); + SetTempAlloca(vSrcPtr); STORE(vSrc, vSrcPtr); vGather = UndefValue::get(VectorType::get(mDoubleTy, 4)); -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev