aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/swr/rasterizer/jitter
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/swr/rasterizer/jitter')
-rw-r--r--src/gallium/drivers/swr/rasterizer/jitter/builder.cpp17
-rw-r--r--src/gallium/drivers/swr/rasterizer/jitter/builder.h2
-rw-r--r--src/gallium/drivers/swr/rasterizer/jitter/builder_mem.cpp1
3 files changed, 20 insertions, 0 deletions
diff --git a/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp b/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp
index 53947c317e2..bd815606fba 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 4c79bab964b..27a32bc3e39 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 c5f0b2b9fe0..eccf0ad0d6d 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));