-
Notifications
You must be signed in to change notification settings - Fork 13.4k
[KeyInstr][SimplifyCFG] Remap atoms after duplication for threading #133484
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-llvm-transforms Author: Orlando Cazalet-Hyams (OCHyams) ChangesGiven the same branch condition in
--> a --> c --> e --> into:
--> a --> c --> e --> Remap source atoms on instructions duplicated from Full diff: https://github.com/llvm/llvm-project/pull/133484.diff 2 Files Affected:
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index 1ba1e4ac81000..c83ff0260e297 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -3589,7 +3589,7 @@ foldCondBranchOnValueKnownInPredecessorImpl(BranchInst *BI, DomTreeUpdater *DTU,
// instructions into EdgeBB. We know that there will be no uses of the
// cloned instructions outside of EdgeBB.
BasicBlock::iterator InsertPt = EdgeBB->getFirstInsertionPt();
- DenseMap<Value *, Value *> TranslateMap; // Track translated values.
+ ValueToValueMapTy TranslateMap; // Track translated values.
TranslateMap[Cond] = CB;
// RemoveDIs: track instructions that we optimise away while folding, so
@@ -3609,11 +3609,11 @@ foldCondBranchOnValueKnownInPredecessorImpl(BranchInst *BI, DomTreeUpdater *DTU,
N->setName(BBI->getName() + ".c");
// Update operands due to translation.
- for (Use &Op : N->operands()) {
- DenseMap<Value *, Value *>::iterator PI = TranslateMap.find(Op);
- if (PI != TranslateMap.end())
- Op = PI->second;
- }
+ // Key Instructions: Remap all the atom groups.
+ if (const DebugLoc &DL = BBI->getDebugLoc())
+ mapAtomInstance(DL, TranslateMap);
+ RemapInstruction(N, TranslateMap,
+ RF_IgnoreMissingLocals | RF_NoModuleLevelChanges);
// Check for trivial simplification.
if (Value *V = simplifyInstruction(N, {DL, nullptr, nullptr, AC})) {
diff --git a/llvm/test/DebugInfo/KeyInstructions/Generic/simplifycfg-thread-phi.ll b/llvm/test/DebugInfo/KeyInstructions/Generic/simplifycfg-thread-phi.ll
new file mode 100644
index 0000000000000..f8477600c6418
--- /dev/null
+++ b/llvm/test/DebugInfo/KeyInstructions/Generic/simplifycfg-thread-phi.ll
@@ -0,0 +1,62 @@
+; RUN: opt %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S \
+; RUN: | FileCheck %s
+
+;; Generated using:
+;; opt -passes=debugify --debugify-atoms --debugify-level=locations \
+;; llvm/test/Transforms/SimplifyCFG/debug-info-thread-phi.ll
+;; With unused/untested metadata nodes removed.
+
+;; Check the duplicated store gets distinct atom info in each branch.
+
+; CHECK-LABEL: @bar(
+; CHECK: if.then:
+; CHECK: store i32 1{{.*}}, !dbg [[DBG1:!.*]]
+; CHECK: if.end.1.critedge:
+; CHECK: store i32 1{{.*}}, !dbg [[DBG2:!.*]]
+; CHECK: [[DBG1]] = !DILocation(line: 1{{.*}}, atomGroup: 1
+; CHECK: [[DBG2]] = !DILocation(line: 1{{.*}}, atomGroup: 2
+
+define void @bar(i32 %aa) !dbg !5 {
+entry:
+ %aa.addr = alloca i32, align 4
+ %bb = alloca i32, align 4
+ store i32 %aa, ptr %aa.addr, align 4
+ store i32 0, ptr %bb, align 4
+ %tobool = icmp ne i32 %aa, 0
+ br i1 %tobool, label %if.then, label %if.end
+
+if.then: ; preds = %entry
+ call void @foo()
+ br label %if.end
+
+if.end: ; preds = %if.then, %entry
+ store i32 1, ptr %bb, align 4, !dbg !8
+ br i1 %tobool, label %if.then.1, label %if.end.1
+
+if.then.1: ; preds = %if.end
+ call void @foo()
+ br label %if.end.1
+
+if.end.1: ; preds = %if.then.1, %if.end
+ store i32 2, ptr %bb, align 4
+ br label %for.end
+
+for.end: ; preds = %if.end.1
+ ret void
+}
+
+declare void @foo()
+
+!llvm.dbg.cu = !{!0}
+!llvm.debugify = !{!2, !3}
+!llvm.module.flags = !{!4}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
+!1 = !DIFile(filename: "llvm/test/Transforms/SimplifyCFG/debug-info-thread-phi.ll", directory: "/")
+!2 = !{i32 15}
+!3 = !{i32 0}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = distinct !DISubprogram(name: "bar", linkageName: "bar", scope: null, file: !1, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0)
+!6 = !DISubroutineType(types: !7)
+!7 = !{}
+!8 = !DILocation(line: 1, column: 1, scope: !5, atomGroup: 1, atomRank: 1)
|
@llvm/pr-subscribers-debuginfo Author: Orlando Cazalet-Hyams (OCHyams) ChangesGiven the same branch condition in
--> a --> c --> e --> into:
--> a --> c --> e --> Remap source atoms on instructions duplicated from Full diff: https://github.com/llvm/llvm-project/pull/133484.diff 2 Files Affected:
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index 1ba1e4ac81000..c83ff0260e297 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -3589,7 +3589,7 @@ foldCondBranchOnValueKnownInPredecessorImpl(BranchInst *BI, DomTreeUpdater *DTU,
// instructions into EdgeBB. We know that there will be no uses of the
// cloned instructions outside of EdgeBB.
BasicBlock::iterator InsertPt = EdgeBB->getFirstInsertionPt();
- DenseMap<Value *, Value *> TranslateMap; // Track translated values.
+ ValueToValueMapTy TranslateMap; // Track translated values.
TranslateMap[Cond] = CB;
// RemoveDIs: track instructions that we optimise away while folding, so
@@ -3609,11 +3609,11 @@ foldCondBranchOnValueKnownInPredecessorImpl(BranchInst *BI, DomTreeUpdater *DTU,
N->setName(BBI->getName() + ".c");
// Update operands due to translation.
- for (Use &Op : N->operands()) {
- DenseMap<Value *, Value *>::iterator PI = TranslateMap.find(Op);
- if (PI != TranslateMap.end())
- Op = PI->second;
- }
+ // Key Instructions: Remap all the atom groups.
+ if (const DebugLoc &DL = BBI->getDebugLoc())
+ mapAtomInstance(DL, TranslateMap);
+ RemapInstruction(N, TranslateMap,
+ RF_IgnoreMissingLocals | RF_NoModuleLevelChanges);
// Check for trivial simplification.
if (Value *V = simplifyInstruction(N, {DL, nullptr, nullptr, AC})) {
diff --git a/llvm/test/DebugInfo/KeyInstructions/Generic/simplifycfg-thread-phi.ll b/llvm/test/DebugInfo/KeyInstructions/Generic/simplifycfg-thread-phi.ll
new file mode 100644
index 0000000000000..f8477600c6418
--- /dev/null
+++ b/llvm/test/DebugInfo/KeyInstructions/Generic/simplifycfg-thread-phi.ll
@@ -0,0 +1,62 @@
+; RUN: opt %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S \
+; RUN: | FileCheck %s
+
+;; Generated using:
+;; opt -passes=debugify --debugify-atoms --debugify-level=locations \
+;; llvm/test/Transforms/SimplifyCFG/debug-info-thread-phi.ll
+;; With unused/untested metadata nodes removed.
+
+;; Check the duplicated store gets distinct atom info in each branch.
+
+; CHECK-LABEL: @bar(
+; CHECK: if.then:
+; CHECK: store i32 1{{.*}}, !dbg [[DBG1:!.*]]
+; CHECK: if.end.1.critedge:
+; CHECK: store i32 1{{.*}}, !dbg [[DBG2:!.*]]
+; CHECK: [[DBG1]] = !DILocation(line: 1{{.*}}, atomGroup: 1
+; CHECK: [[DBG2]] = !DILocation(line: 1{{.*}}, atomGroup: 2
+
+define void @bar(i32 %aa) !dbg !5 {
+entry:
+ %aa.addr = alloca i32, align 4
+ %bb = alloca i32, align 4
+ store i32 %aa, ptr %aa.addr, align 4
+ store i32 0, ptr %bb, align 4
+ %tobool = icmp ne i32 %aa, 0
+ br i1 %tobool, label %if.then, label %if.end
+
+if.then: ; preds = %entry
+ call void @foo()
+ br label %if.end
+
+if.end: ; preds = %if.then, %entry
+ store i32 1, ptr %bb, align 4, !dbg !8
+ br i1 %tobool, label %if.then.1, label %if.end.1
+
+if.then.1: ; preds = %if.end
+ call void @foo()
+ br label %if.end.1
+
+if.end.1: ; preds = %if.then.1, %if.end
+ store i32 2, ptr %bb, align 4
+ br label %for.end
+
+for.end: ; preds = %if.end.1
+ ret void
+}
+
+declare void @foo()
+
+!llvm.dbg.cu = !{!0}
+!llvm.debugify = !{!2, !3}
+!llvm.module.flags = !{!4}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
+!1 = !DIFile(filename: "llvm/test/Transforms/SimplifyCFG/debug-info-thread-phi.ll", directory: "/")
+!2 = !{i32 15}
+!3 = !{i32 0}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = distinct !DISubprogram(name: "bar", linkageName: "bar", scope: null, file: !1, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0)
+!6 = !DISubroutineType(types: !7)
+!7 = !{}
+!8 = !DILocation(line: 1, column: 1, scope: !5, atomGroup: 1, atomRank: 1)
|
RemapInstruction(N, TranslateMap, | ||
RF_IgnoreMissingLocals | RF_NoModuleLevelChanges); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If I understand right, RemapInstruction
with these operands and no materializer will never create a new value mapping, only ever return an existing mapping - is that correct?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah that should be the case here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
b848c42
to
4a943f2
Compare
Given the same branch condition in `a` and `c` SimplifyCFG converts: +> b -+ | v --> a --> c --> e --> | ^ +> d -+ into: +--> bcd ---+ | v --> a --> c --> e --> Remap source atoms on instructions duplicated from `c` into `bcd`.
e2d5b6e
to
a965e6e
Compare
…lvm#133484) Given the same branch condition in `a` and `c` SimplifyCFG converts: +> b -+ | v --> a --> c --> e --> | ^ +> d -+ into: +--> bcd ---+ | v --> a --> c --> e --> Remap source atoms on instructions duplicated from `c` into `bcd`. RFC: https://discourse.llvm.org/t/rfc-improving-is-stmt-placement-for-better-interactive-debugging/82668
Given the same branch condition in
a
andc
SimplifyCFG converts:into:
Remap source atoms on instructions duplicated from
c
intobcd
.