Ver Fonte

Use CreateTempAlloca to make sure alloca is in entry block. (#165)

Xiang Li há 8 anos atrás
pai
commit
cea8048912

+ 1 - 1
tools/clang/lib/CodeGen/CGExprCXX.cpp

@@ -236,7 +236,7 @@ RValue CodeGenFunction::EmitCXXMemberOrOperatorMemberCallExpr(
           llvm::Type *Ty = ConvertType(LV.getType());
 
           llvm::Constant *zero = Builder.getInt32(0);
-          llvm::Value *TmpThis = Builder.CreateAlloca(Ty);
+          llvm::Value *TmpThis = CreateTempAlloca(Ty);
           for (unsigned i = 0; i < Ty->getVectorNumElements(); i++) {
             llvm::Value *EltIdx = Elts->getAggregateElement(i);
             llvm::Value *EltGEP = Builder.CreateGEP(This, {zero, EltIdx});

+ 14 - 0
tools/clang/test/CodeGenHLSL/alloca_at_entry_blk.hlsl

@@ -0,0 +1,14 @@
+// RUN: %dxc -E main -T ps_6_0 %s
+
+
+int i;
+float4 v;
+float4 main() : SV_Target
+{
+    float4 vec = 0;
+
+    if (i > 0)
+        vec = v.xyzw[i];
+
+    return vec;
+}

+ 5 - 0
tools/clang/unittests/HLSL/CompilerTest.cpp

@@ -300,6 +300,7 @@ public:
   TEST_METHOD(CodeGenAbs1)
   TEST_METHOD(CodeGenAbs2)
   TEST_METHOD(CodeGenAllLit)
+  TEST_METHOD(CodeGenAllocaAtEntryBlk)
   TEST_METHOD(CodeGenAddUint64)
   TEST_METHOD(CodeGenArrayArg)
   TEST_METHOD(CodeGenArrayArg2)
@@ -1982,6 +1983,10 @@ TEST_F(CompilerTest, CodeGenAllLit) {
   CodeGenTest(L"..\\CodeGenHLSL\\all_lit.hlsl");
 }
 
+TEST_F(CompilerTest, CodeGenAllocaAtEntryBlk) {
+  CodeGenTest(L"..\\CodeGenHLSL\\alloca_at_entry_blk.hlsl");
+}
+
 TEST_F(CompilerTest, CodeGenAddUint64) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\AddUint64.hlsl");
 }