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);
+ }
}
Type* mSimd32Int8Ty;
void SetTargetWidth(uint32_t width);
+ void SetTempAlloca(Value* inst);
+ bool IsTempAlloca(Value* inst);
#include "gen_builder.hpp"
#include "gen_builder_meta.hpp"
// 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));