OSDN Git Service

[CodeGenPrepare] Clean up dbg.value use-before-def as late as possible
authorVedant Kumar <vsk@apple.com>
Tue, 21 Aug 2018 23:43:08 +0000 (23:43 +0000)
committerVedant Kumar <vsk@apple.com>
Tue, 21 Aug 2018 23:43:08 +0000 (23:43 +0000)
CodeGenPrepare has a strategy for moving dbg.values so that a value's
definition always dominates its debug users. This cleanup was happening
too early (before certain CGP transforms were run), resulting in some
dbg.value use-before-def errors.

Perform this cleanup as late as possible to avoid use-before-def.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@340370 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CodeGenPrepare.cpp
test/Transforms/CodeGenPrepare/X86/select.ll

index 7d7d48b..fd26345 100644 (file)
@@ -426,11 +426,6 @@ bool CodeGenPrepare::runOnFunction(Function &F) {
   // unconditional branch.
   EverMadeChange |= eliminateMostlyEmptyBlocks(F);
 
-  // llvm.dbg.value is far away from the value then iSel may not be able
-  // handle it properly. iSel will drop llvm.dbg.value if it can not
-  // find a node corresponding to the value.
-  EverMadeChange |= placeDbgValues(F);
-
   if (!DisableBranchOpts)
     EverMadeChange |= splitBranchCondition(F);
 
@@ -518,6 +513,10 @@ bool CodeGenPrepare::runOnFunction(Function &F) {
       EverMadeChange |= simplifyOffsetableRelocate(*I);
   }
 
+  // Do this last to clean up use-before-def scenarios introduced by other
+  // preparatory transforms.
+  EverMadeChange |= placeDbgValues(F);
+
   return EverMadeChange;
 }
 
index 9abb286..2c81de9 100644 (file)
@@ -38,12 +38,12 @@ define float @fdiv_true_sink(float %a, float %b) {
 ;
 ; DEBUG-LABEL: @fdiv_true_sink(
 ; DEBUG-NEXT:  entry:
-; DEBUG-NEXT:    call void @llvm.dbg.value(metadata float [[DIV:%[^,]+]]
 ; DEBUG-NEXT:    [[CMP:%.*]] = fcmp ogt float [[A:%.*]], 1.000000e+00
 ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i1 [[CMP]]
 ; DEBUG-NEXT:    br i1 [[CMP]], label [[SELECT_TRUE_SINK:%.*]], label [[SELECT_END:%[^,]+]]
 ; DEBUG:       select.true.sink:
-; DEBUG-NEXT:    [[DIV]] = fdiv float [[A]], [[B:%.*]]
+; DEBUG-NEXT:    [[DIV:%.*]] = fdiv float [[A]], [[B:%.*]]
+; DEBUG-NEXT:    call void @llvm.dbg.value(metadata float [[DIV]]
 ; DEBUG-NEXT:    br label [[SELECT_END]]
 ; DEBUG:       select.end:
 ; DEBUG-NEXT:    [[SEL:%.*]] = phi float [ [[DIV]], [[SELECT_TRUE_SINK]] ], [ 2.000000e+00, [[ENTRY:%.*]] ]