From: George Kyriazis Date: Thu, 5 Apr 2018 20:59:54 +0000 (-0500) Subject: swr/rast: Fix alloca usage in jitter X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=aa482014e542de21785b2a4386ebbfc4a8e8df1d;p=mesa.git swr/rast: Fix alloca usage in jitter 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. Reviewed-by: Bruce Cherniak --- 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(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(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));