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 cd9806a..5d8637e 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
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev