Skip to content

[KeyInstr][JumpThreading] Remap atoms after threading #133487

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

Merged
merged 2 commits into from
May 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions llvm/lib/Transforms/Scalar/JumpThreading.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2469,6 +2469,7 @@ void JumpThreadingPass::threadEdge(BasicBlock *BB,
{DominatorTree::Insert, PredBB, NewBB},
{DominatorTree::Delete, PredBB, BB}});

remapSourceAtoms(ValueMapping, NewBB->begin(), NewBB->end());
updateSSA(BB, NewBB, ValueMapping);

// At this point, the IR is fully up to date and consistent. Do a quick scan
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,41 @@

;; Modified from llvm/test/Transforms/JumpThreading/thread-two-bbs.ll
;;
;; JumpThreading duplicates bb.cond2 to thread through bb.file to bb.f2 or exit.
;; JumpThreading duplicates bb.cond2 to thread through bb.file to bb.file,
;; bb.f2 or exit.
;;
;; Check the duplicated instructions get remapped atom groups.

; CHECK: bb.cond2:
; CHECK-NEXT: call void @f1()
; CHECK-NEXT: %tobool1 = icmp eq i32 %cond2, 0, !dbg [[G1R2:!.*]]
; CHECK-NEXT: br i1 %tobool1, label %exit, label %exit, !dbg [[G1R1:!.*]]
; CHECK-NEXT: br i1 %tobool1, label %bb.file, label %exit, !dbg [[G1R1:!.*]]

; CHECK: bb.cond2.thread:
; CHECK-NEXT: %tobool12 = icmp eq i32 %cond2, 0, !dbg [[G2R2:!.*]]
; CHECK-NEXT: br i1 %tobool12, label %bb.f2, label %exit, !dbg [[G2R1:!.*]]
; CHECK-NEXT: %tobool12 = icmp eq i32 %cond2, 0, !dbg [[G3R2:!.*]]
; CHECK-NEXT: br i1 %tobool12, label %bb.f2, label %exit, !dbg [[G3R1:!.*]]

;; After the transform %ptr is null through bb.cond2 and @a through
;; bb.cond2.thread. Thread bb.cond2.thread->bb.f2 through bb.file.
;; Check the duplicated store gets a remapped atom group too.

; CHECK: bb.file:
; CHECK-NEXT: %ptr3 = phi ptr [ null, %bb.cond2 ]
; CHECK-NEXT: store ptr %ptr3, ptr %p, align 4, !dbg [[G2R1:!.*]]

; CHECK: bb.f2:
; CHECK-NEXT: store ptr @a, ptr %p, align 4, !dbg [[G4R1:!.*]]

; CHECK: [[G1R2]] = !DILocation(line: 1, column: 1, scope: ![[#]], atomGroup: 1, atomRank: 2)
; CHECK: [[G1R1]] = !DILocation(line: 1, column: 1, scope: ![[#]], atomGroup: 1, atomRank: 1)
; CHECK: [[G2R2]] = !DILocation(line: 1, column: 1, scope: ![[#]], atomGroup: 2, atomRank: 2)
; CHECK: [[G2R1]] = !DILocation(line: 1, column: 1, scope: ![[#]], atomGroup: 2, atomRank: 1)
; CHECK: [[G3R2]] = !DILocation(line: 1, column: 1, scope: ![[#]], atomGroup: 3, atomRank: 2)
; CHECK: [[G3R1]] = !DILocation(line: 1, column: 1, scope: ![[#]], atomGroup: 3, atomRank: 1)
; CHECK: [[G2R1]] = !DILocation(line: 2, column: 1, scope: ![[#]], atomGroup: 2, atomRank: 1)
; CHECK: [[G4R1]] = !DILocation(line: 2, column: 1, scope: ![[#]], atomGroup: 4, atomRank: 1)

@a = global i32 0, align 4

define void @foo(i32 %cond1, i32 %cond2) !dbg !5 {
define void @foo(i32 %cond1, i32 %cond2, ptr %p) !dbg !5 {
entry:
%tobool = icmp eq i32 %cond1, 0
br i1 %tobool, label %bb.cond2, label %bb.f1
Expand All @@ -37,6 +51,7 @@ bb.cond2: ; preds = %bb.f1, %entry
br i1 %tobool1, label %bb.file, label %exit, !dbg !10

bb.file: ; preds = %bb.cond2
store ptr %ptr, ptr %p, align 4, !dbg !11
%cmp = icmp eq ptr %ptr, null
br i1 %cmp, label %exit, label %bb.f2

Expand Down Expand Up @@ -66,3 +81,4 @@ declare void @f2()
!7 = !{}
!9 = !DILocation(line: 1, column: 1, scope: !5, atomGroup: 1, atomRank: 2)
!10 = !DILocation(line: 1, column: 1, scope: !5, atomGroup: 1, atomRank: 1)
!11 = !DILocation(line: 2, column: 1, scope: !5, atomGroup: 2, atomRank: 1)
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
; RUN: opt %s --passes=jump-threading -S -o - -S | FileCheck %s

;; +-> T1 -+
;; | v +-> T2.
;; Entry -+ Merge -+
;; | ^ +-> F2.
;; +-> F1 -+
;;
;; Thread T1 -> T2 and F1 -> F2 through Merge.
;;
;; +-> T1 (+ Merge + T2).
;; |
;; Entry -+
;; |
;; +-> F1 (+ Merge + F2).
;;
;; Check the duplicated instructions atoms are remapped.

; CHECK: T2:
; CHECK-NEXT: %v1 = call i32 @f1()
; CHECK-NEXT: %C3 = add i32 %v1, 1, !dbg [[G2R2:!.*]]
; CHECK-NEXT: store i32 %C3, ptr %p, align 4, !dbg [[G2R1:!.*]]

; CHECK: F2:
; CHECK-NEXT: %v2 = call i32 @f2()
; CHECK-NEXT: %C = add i32 %v2, 1, !dbg [[G1R2:!.*]]
; CHECK-NEXT: store i32 %C, ptr %p, align 4, !dbg [[G1R1:!.*]]

; CHECK: [[G2R2]] = !DILocation(line: 8, column: 1, scope: ![[#]], atomGroup: 2, atomRank: 2)
; CHECK: [[G2R1]] = !DILocation(line: 8, column: 1, scope: ![[#]], atomGroup: 2, atomRank: 1)
; CHECK: [[G1R2]] = !DILocation(line: 8, column: 1, scope: ![[#]], atomGroup: 1, atomRank: 2)
; CHECK: [[G1R1]] = !DILocation(line: 8, column: 1, scope: ![[#]], atomGroup: 1, atomRank: 1)

define i32 @test1(i1 %cond, ptr %p) !dbg !5 {
br i1 %cond, label %T1, label %F1

T1: ; preds = %0
%v1 = call i32 @f1()
br label %Merge

F1: ; preds = %0
%v2 = call i32 @f2()
br label %Merge

Merge: ; preds = %F1, %T1
%A = phi i1 [ true, %T1 ], [ false, %F1 ]
%B = phi i32 [ %v1, %T1 ], [ %v2, %F1 ]
%C = add i32 %B, 1, !dbg !8
store i32 %C, ptr %p, align 4, !dbg !9
br i1 %A, label %T2, label %F2

T2: ; preds = %Merge
call void @f3()
ret i32 %B

F2: ; preds = %Merge
ret i32 %B
}

declare i32 @f1()
declare i32 @f2()
declare void @f3()

!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: "test.ll", directory: "/")
!2 = !{i32 12}
!3 = !{i32 0}
!4 = !{i32 2, !"Debug Info Version", i32 3}
!5 = distinct !DISubprogram(name: "test1", linkageName: "test1", scope: null, file: !1, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0)
!6 = !DISubroutineType(types: !7)
!7 = !{}
!8 = !DILocation(line: 8, column: 1, scope: !5, atomGroup: 1, atomRank: 2)
!9 = !DILocation(line: 8, column: 1, scope: !5, atomGroup: 1, atomRank: 1)