Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 39601a6

Browse filesBrowse files
authored
Bail out jump threading on indirect branches only (#117778)
Remove check for PHI in pred as pointed out in #103688 Reduced the testcase to remove redundant phi in pred Fixes: #102351
1 parent 7ae61a3 commit 39601a6
Copy full SHA for 39601a6

File tree

Expand file treeCollapse file tree

2 files changed

+60
-84
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+60
-84
lines changed

‎llvm/lib/Transforms/Utils/Local.cpp

Copy file name to clipboardExpand all lines: llvm/lib/Transforms/Utils/Local.cpp
+1-2Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,8 +1034,7 @@ CanRedirectPredsOfEmptyBBToSucc(BasicBlock *BB, BasicBlock *Succ,
10341034
return false;
10351035

10361036
if (any_of(BBPreds, [](const BasicBlock *Pred) {
1037-
return isa<PHINode>(Pred->begin()) &&
1038-
isa<IndirectBrInst>(Pred->getTerminator());
1037+
return isa<IndirectBrInst>(Pred->getTerminator());
10391038
}))
10401039
return false;
10411040

+59-82Lines changed: 59 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,104 +1,81 @@
1-
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --prefix-filecheck-ir-name pref --version 5
22
; RUN: opt < %s -passes=simplifycfg -S | FileCheck %s
33

4-
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
5-
target triple = "x86_64-unknown-linux-gnu"
6-
7-
define dso_local noundef i32 @main() {
8-
; CHECK-LABEL: define dso_local noundef i32 @main() {
4+
define i32 @foo.1(i32 %arg, ptr %arg1) {
5+
; CHECK-LABEL: define i32 @foo.1(
6+
; CHECK-SAME: i32 [[ARG:%.*]], ptr [[ARG1:%.*]]) {
97
; CHECK-NEXT: [[BB:.*]]:
108
; CHECK-NEXT: [[ALLOCA:%.*]] = alloca [2 x ptr], align 16
11-
; CHECK-NEXT: store ptr blockaddress(@main, %[[BB4:.*]]), ptr [[ALLOCA]], align 16, !tbaa [[TBAA0:![0-9]+]]
9+
; CHECK-NEXT: store ptr blockaddress(@foo.1, %[[BB8:.*]]), ptr [[ALLOCA]], align 16
1210
; CHECK-NEXT: [[GETELEMENTPTR:%.*]] = getelementptr inbounds [2 x ptr], ptr [[ALLOCA]], i64 0, i64 1
13-
; CHECK-NEXT: store ptr blockaddress(@main, %[[BB10:.*]]), ptr [[GETELEMENTPTR]], align 8, !tbaa [[TBAA0]]
14-
; CHECK-NEXT: br label %[[BB1:.*]]
15-
; CHECK: [[BB1]]:
16-
; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[PHI8:%.*]], %[[BB7:.*]] ]
17-
; CHECK-NEXT: [[PHI2:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[PHI9:%.*]], %[[BB7]] ]
18-
; CHECK-NEXT: switch i32 [[PHI]], label %[[BB7]] [
19-
; CHECK-NEXT: i32 0, label %[[BB12:.*]]
20-
; CHECK-NEXT: i32 1, label %[[BB4]]
21-
; CHECK-NEXT: i32 2, label %[[BB6:.*]]
11+
; CHECK-NEXT: store ptr blockaddress(@foo.1, %[[BB16:.*]]), ptr [[GETELEMENTPTR]], align 8
12+
; CHECK-NEXT: br label %[[PREFBB2:.*]]
13+
; CHECK: [[PREFBB2]]:
14+
; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[PHI14:%.*]], %[[BB13:.*]] ]
15+
; CHECK-NEXT: [[PHI3:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[PHI15:%.*]], %[[BB13]] ]
16+
; CHECK-NEXT: switch i32 [[PHI]], label %[[BB13]] [
17+
; CHECK-NEXT: i32 0, label %[[PREFBB18:.*]]
18+
; CHECK-NEXT: i32 1, label %[[BB8]]
19+
; CHECK-NEXT: i32 2, label %[[PREFBB11:.*]]
2220
; CHECK-NEXT: ]
23-
; CHECK: [[BB4]]:
24-
; CHECK-NEXT: [[PHI5:%.*]] = phi i32 [ [[PHI13:%.*]], %[[BB12]] ], [ [[PHI2]], %[[BB1]] ]
25-
; CHECK-NEXT: br label %[[BB7]]
26-
; CHECK: [[BB6]]:
27-
; CHECK-NEXT: [[CALL:%.*]] = call i32 @foo(i32 noundef [[PHI2]])
28-
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[PHI2]], 1
29-
; CHECK-NEXT: br label %[[BB12]]
30-
; CHECK: [[BB7]]:
31-
; CHECK-NEXT: [[PHI8]] = phi i32 [ [[PHI]], %[[BB1]] ], [ 2, %[[BB4]] ]
32-
; CHECK-NEXT: [[PHI9]] = phi i32 [ [[PHI2]], %[[BB1]] ], [ [[PHI5]], %[[BB4]] ]
33-
; CHECK-NEXT: br label %[[BB1]], !llvm.loop [[LOOP4:![0-9]+]]
34-
; CHECK: [[BB10]]:
35-
; CHECK-NEXT: [[CALL11:%.*]] = call i32 @foo(i32 noundef [[PHI13]])
21+
; CHECK: [[BB8]]:
22+
; CHECK-NEXT: [[PHI10:%.*]] = phi i32 [ [[ARG]], %[[PREFBB18]] ], [ [[PHI3]], %[[PREFBB2]] ]
23+
; CHECK-NEXT: br label %[[BB13]]
24+
; CHECK: [[PREFBB11]]:
25+
; CHECK-NEXT: [[CALL:%.*]] = call i32 @wombat(i32 noundef [[PHI3]])
26+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[PHI3]], 1
27+
; CHECK-NEXT: br label %[[PREFBB18]]
28+
; CHECK: [[BB13]]:
29+
; CHECK-NEXT: [[PHI14]] = phi i32 [ [[PHI]], %[[PREFBB2]] ], [ 2, %[[BB8]] ]
30+
; CHECK-NEXT: [[PHI15]] = phi i32 [ [[PHI3]], %[[PREFBB2]] ], [ [[PHI10]], %[[BB8]] ]
31+
; CHECK-NEXT: br label %[[PREFBB2]]
32+
; CHECK: [[BB16]]:
33+
; CHECK-NEXT: [[CALL17:%.*]] = call i32 @wombat(i32 noundef [[ARG]])
3634
; CHECK-NEXT: ret i32 0
37-
; CHECK: [[BB12]]:
38-
; CHECK-NEXT: [[PHI13]] = phi i32 [ [[ADD]], %[[BB6]] ], [ [[PHI2]], %[[BB1]] ]
39-
; CHECK-NEXT: [[SEXT:%.*]] = sext i32 [[PHI13]] to i64
40-
; CHECK-NEXT: [[GETELEMENTPTR14:%.*]] = getelementptr inbounds [2 x ptr], ptr [[ALLOCA]], i64 0, i64 [[SEXT]]
41-
; CHECK-NEXT: [[LOAD:%.*]] = load ptr, ptr [[GETELEMENTPTR14]], align 8, !tbaa [[TBAA0]]
42-
; CHECK-NEXT: indirectbr ptr [[LOAD]], [label %[[BB4]], label %bb10]
35+
; CHECK: [[PREFBB18]]:
36+
; CHECK-NEXT: [[LOAD:%.*]] = load ptr, ptr [[ARG1]], align 8
37+
; CHECK-NEXT: indirectbr ptr [[LOAD]], [label %[[BB8]], label %bb16]
4338
;
4439
bb:
4540
%alloca = alloca [2 x ptr], align 16
46-
store ptr blockaddress(@main, %bb4), ptr %alloca, align 16, !tbaa !0
41+
store ptr blockaddress(@foo.1, %bb8), ptr %alloca, align 16
4742
%getelementptr = getelementptr inbounds [2 x ptr], ptr %alloca, i64 0, i64 1
48-
store ptr blockaddress(@main, %bb10), ptr %getelementptr, align 8, !tbaa !0
49-
br label %bb1
43+
store ptr blockaddress(@foo.1, %bb16), ptr %getelementptr, align 8
44+
br label %bb2
5045

51-
bb1: ; preds = %bb7, %bb
52-
%phi = phi i32 [ 0, %bb ], [ %phi8, %bb7 ]
53-
%phi2 = phi i32 [ 0, %bb ], [ %phi9, %bb7 ]
54-
switch i32 %phi, label %bb7 [
55-
i32 0, label %bb3
56-
i32 1, label %bb4
57-
i32 2, label %bb6
46+
bb2: ; preds = %bb13, %bb
47+
%phi = phi i32 [ 0, %bb ], [ %phi14, %bb13 ]
48+
%phi3 = phi i32 [ 0, %bb ], [ %phi15, %bb13 ]
49+
switch i32 %phi, label %bb13 [
50+
i32 0, label %bb5
51+
i32 1, label %bb8
52+
i32 2, label %bb11
5853
]
5954

60-
bb3: ; preds = %bb1
61-
br label %bb12
55+
bb5: ; preds = %bb2
56+
br label %bb18
6257

63-
bb4: ; preds = %bb12, %bb1
64-
%phi5 = phi i32 [ %phi13, %bb12 ], [ %phi2, %bb1 ]
65-
br label %bb7
58+
bb8: ; preds = %bb18, %bb2
59+
%phi10 = phi i32 [ %arg, %bb18 ], [ %phi3, %bb2 ]
60+
br label %bb13
6661

67-
bb6: ; preds = %bb1
68-
%call = call i32 @foo(i32 noundef %phi2)
69-
%add = add nsw i32 %phi2, 1
70-
br label %bb12
62+
bb11: ; preds = %bb2
63+
%call = call i32 @wombat(i32 noundef %phi3)
64+
%add = add nsw i32 %phi3, 1
65+
br label %bb18
7166

72-
bb7: ; preds = %bb4, %bb1
73-
%phi8 = phi i32 [ %phi, %bb1 ], [ 2, %bb4 ]
74-
%phi9 = phi i32 [ %phi2, %bb1 ], [ %phi5, %bb4 ]
75-
br label %bb1, !llvm.loop !4
67+
bb13: ; preds = %bb8, %bb2
68+
%phi14 = phi i32 [ %phi, %bb2 ], [ 2, %bb8 ]
69+
%phi15 = phi i32 [ %phi3, %bb2 ], [ %phi10, %bb8 ]
70+
br label %bb2
7671

77-
bb10: ; preds = %bb12
78-
%call11 = call i32 @foo(i32 noundef %phi13)
72+
bb16: ; preds = %bb18
73+
%call17 = call i32 @wombat(i32 noundef %arg)
7974
ret i32 0
8075

81-
bb12: ; preds = %bb6, %bb3
82-
%phi13 = phi i32 [ %add, %bb6 ], [ %phi2, %bb3 ]
83-
%sext = sext i32 %phi13 to i64
84-
%getelementptr14 = getelementptr inbounds [2 x ptr], ptr %alloca, i64 0, i64 %sext
85-
%load = load ptr, ptr %getelementptr14, align 8, !tbaa !0
86-
indirectbr ptr %load, [label %bb4, label %bb10]
76+
bb18: ; preds = %bb11, %bb5
77+
%load = load ptr, ptr %arg1, align 8
78+
indirectbr ptr %load, [label %bb8, label %bb16]
8779
}
8880

89-
declare i32 @foo(i32)
90-
91-
!0 = !{!1, !1, i64 0}
92-
!1 = !{!"any pointer", !2, i64 0}
93-
!2 = !{!"omnipotent char", !3, i64 0}
94-
!3 = !{!"Simple C++ TBAA"}
95-
!4 = !{!5, !5, i64 0}
96-
!5 = !{!"int", !2, i64 0}
97-
;.
98-
; CHECK: [[TBAA0]] = !{[[META1:![0-9]+]], [[META1]], i64 0}
99-
; CHECK: [[META1]] = !{!"any pointer", [[META2:![0-9]+]], i64 0}
100-
; CHECK: [[META2]] = !{!"omnipotent char", [[META3:![0-9]+]], i64 0}
101-
; CHECK: [[META3]] = !{!"Simple C++ TBAA"}
102-
; CHECK: [[LOOP4]] = !{[[META5:![0-9]+]], [[META5]], i64 0}
103-
; CHECK: [[META5]] = !{!"int", [[META2]], i64 0}
104-
;.
81+
declare i32 @wombat(i32)

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.