Browse Source

Keep unused pointer in TranslateHLSubscript, it will be removed in TranslateSubscriptOperation. (#188)

Xiang Li 8 years ago
parent
commit
bd16165aa7

+ 2 - 1
lib/HLSL/HLModule.cpp

@@ -1086,7 +1086,8 @@ void HLModule::MergeGepUse(Value *V) {
     }
     }
   }
   }
   if (V->user_empty()) {
   if (V->user_empty()) {
-    if (Instruction *I = dyn_cast<Instruction>(V))
+    // Only remove GEP here, root ptr will be removed by DCE.
+    if (GetElementPtrInst *I = dyn_cast<GetElementPtrInst>(V))
       I->eraseFromParent();
       I->eraseFromParent();
   }
   }
 }
 }

+ 28 - 0
tools/clang/test/CodeGenHLSL/unusedCB.hlsl

@@ -0,0 +1,28 @@
+// RUN: %dxc -E main -T ps_6_0 %s
+
+struct Input
+{
+    float2 v : TEXCOORD0;
+};
+
+float4 a;
+
+float4 test(float b, float c) {
+  float4 r = 0;
+  if (c > 1) {
+    r += 2;
+    // This block will be removed because b is 1.
+    // The use of a will be removed, but gep to a is not.
+    if (b > 1)
+       r += a;
+  }
+
+  return r;
+}
+
+float4 main(Input input) : SV_Target
+{
+    if ((input.v[1]) > 1)
+       return test(1, input.v.x);
+    return input.v[0];
+}

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

@@ -562,6 +562,7 @@ public:
   TEST_METHOD(CodeGenUintSample)
   TEST_METHOD(CodeGenUintSample)
   TEST_METHOD(CodeGenUmaxObjectAtomic)
   TEST_METHOD(CodeGenUmaxObjectAtomic)
   TEST_METHOD(CodeGenUnsignedShortHandMatrixVector)
   TEST_METHOD(CodeGenUnsignedShortHandMatrixVector)
+  TEST_METHOD(CodeGenUnusedCB)
   TEST_METHOD(CodeGenUpdateCounter)
   TEST_METHOD(CodeGenUpdateCounter)
   TEST_METHOD(CodeGenUpperCaseRegister1);
   TEST_METHOD(CodeGenUpperCaseRegister1);
   TEST_METHOD(CodeGenVcmp)
   TEST_METHOD(CodeGenVcmp)
@@ -3023,6 +3024,10 @@ TEST_F(CompilerTest, CodeGenUnsignedShortHandMatrixVector) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\unsignedShortHandMatrixVector.hlsl");
   CodeGenTestCheck(L"..\\CodeGenHLSL\\unsignedShortHandMatrixVector.hlsl");
 }
 }
 
 
+TEST_F(CompilerTest, CodeGenUnusedCB) {
+  CodeGenTestCheck(L"..\\CodeGenHLSL\\unusedCB.hlsl");
+}
+
 TEST_F(CompilerTest, CodeGenUpdateCounter) {
 TEST_F(CompilerTest, CodeGenUpdateCounter) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\updateCounter.hlsl");
   CodeGenTestCheck(L"..\\CodeGenHLSL\\updateCounter.hlsl");
 }
 }