Browse Source

Fixed a bug where dbg.value are missing for PHIs (#2275)

Adam Yang 6 years ago
parent
commit
e68a18756c

+ 1 - 1
lib/Transforms/IPO/PassManagerBuilder.cpp

@@ -255,6 +255,7 @@ static void addHLSLPasses(bool HLSLHighLevel, unsigned OptLevel, hlsl::HLSLExten
   // mem2reg
   // Special Mem2Reg pass that only happens if optimization is
   // enabled or loop unroll is needed.
+  MPM.add(createLoopRotatePass()); // Rotate the loops before, mem2reg, since it messes up dbg.value's
   MPM.add(createDxilConditionalMem2RegPass(NoOpt));
 
   if (!NoOpt) {
@@ -270,7 +271,6 @@ static void addHLSLPasses(bool HLSLHighLevel, unsigned OptLevel, hlsl::HLSLExten
   // struct members.
   // Needs to happen before resources are lowered and before HL
   // module is gone.
-  MPM.add(createLoopRotatePass());
   MPM.add(createDxilLoopUnrollPass(1024));
 
   // Default unroll pass. This is purely for optimizing loops without

+ 23 - 0
lib/Transforms/Utils/PromoteMemoryToRegister.cpp

@@ -664,10 +664,12 @@ void PromoteMem2Reg::run() {
 
   const DataLayout &DL = F.getParent()->getDataLayout();
 
+#if 0 // HLSL Change // Do not remove dbg.declares here.
   // Remove alloca's dbg.declare instrinsics from the function.
   for (unsigned i = 0, e = AllocaDbgDeclares.size(); i != e; ++i)
     if (DbgDeclareInst *DDI = AllocaDbgDeclares[i])
       DDI->eraseFromParent();
+#endif // HLSL Change
 
   // Loop over all of the PHI nodes and see if there are any that we can get
   // rid of because they merge all of the same incoming values.  This can
@@ -759,6 +761,27 @@ void PromoteMem2Reg::run() {
     }
   }
 
+// HLSL Change - Begin
+  // Create dbg.value instructions for all generated PHI nodes.
+  for (DenseMap<std::pair<unsigned, unsigned>, PHINode *>::iterator
+           I = NewPhiNodes.begin(),
+           E = NewPhiNodes.end();
+       I != E; ++I) {
+    PHINode *PN = I->second;
+    unsigned AllocaNum = I->first.second;
+    DbgDeclareInst *DDI = AllocaDbgDeclares[AllocaNum];
+    if (!DDI) continue;
+
+    DIBuilder DIB(*PN->getModule());
+    DIB.insertDbgValueIntrinsic(PN, 0, DDI->getVariable(), DDI->getExpression(), DDI->getDebugLoc(), PN->getParent()->getFirstNonPHI());
+  }
+
+  // Remove alloca's dbg.declare instrinsics from the function.
+  for (unsigned i = 0, e = AllocaDbgDeclares.size(); i != e; ++i)
+    if (DbgDeclareInst *DDI = AllocaDbgDeclares[i])
+      DDI->eraseFromParent();
+// HLSL Change - End
+
   NewPhiNodes.clear();
 }
 

+ 26 - 0
tools/clang/test/CodeGenHLSL/debug/dbg_value_phi_branch.hlsl

@@ -0,0 +1,26 @@
+// RUN: %dxc -E main -T ps_6_0 %s -Zi -O3 | FileCheck %s
+
+// CHECK-LABEL: @main()
+
+// CHECK: phi float [
+// CHECK: phi float [
+// CHECK: phi float [
+// CHECK: phi float [
+// CHECK: call void @llvm.dbg.value(metadata float
+// CHECK: call void @llvm.dbg.value(metadata float
+// CHECK: call void @llvm.dbg.value(metadata float
+// CHECK: call void @llvm.dbg.value(metadata float
+
+
+// Exclude quoted source file (see readme)
+// CHECK-LABEL: {{!"[^"]*\\0A[^"]*"}}
+
+[RootSignature("")]
+float4 main(int a : A, float4 b : B) : SV_Target {
+  float4 result = b;
+  [branch]
+  if (a > 10)
+    result *= 4;
+  return result;
+}
+

+ 41 - 0
tools/clang/test/CodeGenHLSL/debug/dbg_value_phi_loop.hlsl

@@ -0,0 +1,41 @@
+// RUN: %dxc -E main -T ps_6_0 %s -Zi -O3 | FileCheck %s
+
+// CHECK-LABEL: @main()
+
+// CHECK: phi float [
+// CHECK: phi float [
+// CHECK: phi float [
+// CHECK: phi float [
+// CHECK: call void @llvm.dbg.value(metadata float
+// CHECK: call void @llvm.dbg.value(metadata float
+// CHECK: call void @llvm.dbg.value(metadata float
+// CHECK: call void @llvm.dbg.value(metadata float
+// CHECK: fmul
+// CHECK: fmul
+// CHECK: fmul
+// CHECK: fmul
+// CHECK: call void @llvm.dbg.value(metadata float
+// CHECK: call void @llvm.dbg.value(metadata float
+// CHECK: call void @llvm.dbg.value(metadata float
+// CHECK: call void @llvm.dbg.value(metadata float
+
+// CHECK: phi float [
+// CHECK: phi float [
+// CHECK: phi float [
+// CHECK: phi float [
+// CHECK: call void @llvm.dbg.value(metadata float
+// CHECK: call void @llvm.dbg.value(metadata float
+// CHECK: call void @llvm.dbg.value(metadata float
+// CHECK: call void @llvm.dbg.value(metadata float
+
+// Exclude quoted source file (see readme)
+// CHECK-LABEL: {{!"[^"]*\\0A[^"]*"}}
+
+[RootSignature("")]
+float4 main(int a : A) : SV_Target {
+  float4 result = float4(1,1,1,1);
+  for (int i = 0; i < a; i++)
+    result *= 4;
+  return result;
+}
+