Skip to content

Commit e9a56ab

Browse files
committed
[PhaseOrdering] Add test with removable chained conditions.
Based on https://godbolt.org/z/hTnra7zdY, which is a slightly more complicated version of the example from https://discourse.llvm.org/t/why-does-llvm-not-perform-range-analysis-on-integer-values/74341
1 parent 52b7045 commit e9a56ab

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

llvm/test/Transforms/PhaseOrdering/runtime-check-removal.ll

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,81 @@ loop.latch:
5656
exit:
5757
ret void
5858
}
59+
60+
61+
define void @chained_conditions(i64 noundef %a, i64 noundef %b, i64 noundef %c, i64 noundef %d) #0 {
62+
; CHECK-LABEL: @chained_conditions(
63+
; CHECK-NEXT: entry:
64+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[A:%.*]], 2048
65+
; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i64 [[B:%.*]], 1024
66+
; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[CMP]], [[CMP1]]
67+
; CHECK-NEXT: [[CMP3:%.*]] = icmp ugt i64 [[C:%.*]], 1024
68+
; CHECK-NEXT: [[OR_COND1:%.*]] = or i1 [[OR_COND]], [[CMP3]]
69+
; CHECK-NEXT: br i1 [[OR_COND1]], label [[IF_END10:%.*]], label [[IF_END:%.*]]
70+
; CHECK: if.end:
71+
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[B]], [[A]]
72+
; CHECK-NEXT: [[ADD4:%.*]] = add nuw nsw i64 [[ADD]], [[C]]
73+
; CHECK-NEXT: [[CMP5_NOT:%.*]] = icmp uge i64 [[ADD4]], [[D:%.*]]
74+
; CHECK-NEXT: [[CMP8_NOT:%.*]] = icmp ult i64 [[A]], [[D]]
75+
; CHECK-NEXT: [[OR_COND7:%.*]] = or i1 [[CMP5_NOT]], [[CMP8_NOT]]
76+
; CHECK-NEXT: br i1 [[OR_COND7]], label [[IF_END10]], label [[IF_THEN9:%.*]]
77+
; CHECK: if.then9:
78+
; CHECK-NEXT: tail call void @bar()
79+
; CHECK-NEXT: br label [[IF_END10]]
80+
; CHECK: if.end10:
81+
; CHECK-NEXT: ret void
82+
;
83+
entry:
84+
%a.addr = alloca i64, align 8
85+
%b.addr = alloca i64, align 8
86+
%c.addr = alloca i64, align 8
87+
%d.addr = alloca i64, align 8
88+
store i64 %a, ptr %a.addr, align 8
89+
store i64 %b, ptr %b.addr, align 8
90+
store i64 %c, ptr %c.addr, align 8
91+
store i64 %d, ptr %d.addr, align 8
92+
%0 = load i64, ptr %a.addr, align 8
93+
%cmp = icmp ugt i64 %0, 2048
94+
br i1 %cmp, label %if.then, label %lor.lhs.false
95+
96+
lor.lhs.false: ; preds = %entry
97+
%1 = load i64, ptr %b.addr, align 8
98+
%cmp1 = icmp ugt i64 %1, 1024
99+
br i1 %cmp1, label %if.then, label %lor.lhs.false2
100+
101+
lor.lhs.false2: ; preds = %lor.lhs.false
102+
%2 = load i64, ptr %c.addr, align 8
103+
%cmp3 = icmp ugt i64 %2, 1024
104+
br i1 %cmp3, label %if.then, label %if.end
105+
106+
if.then: ; preds = %lor.lhs.false2, %lor.lhs.false, %entry
107+
br label %if.end10
108+
109+
if.end: ; preds = %lor.lhs.false2
110+
%3 = load i64, ptr %a.addr, align 8
111+
%4 = load i64, ptr %b.addr, align 8
112+
%add = add i64 %3, %4
113+
%5 = load i64, ptr %c.addr, align 8
114+
%add4 = add i64 %add, %5
115+
%6 = load i64, ptr %d.addr, align 8
116+
%cmp5 = icmp uge i64 %add4, %6
117+
br i1 %cmp5, label %if.then6, label %if.end7
118+
119+
if.then6: ; preds = %if.end
120+
br label %if.end10
121+
122+
if.end7: ; preds = %if.end
123+
%7 = load i64, ptr %a.addr, align 8
124+
%8 = load i64, ptr %d.addr, align 8
125+
%cmp8 = icmp uge i64 %7, %8
126+
br i1 %cmp8, label %if.then9, label %if.end10
127+
128+
if.then9: ; preds = %if.end7
129+
call void @bar()
130+
br label %if.end10
131+
132+
if.end10: ; preds = %if.then, %if.then6, %if.then9, %if.end7
133+
ret void
134+
}
135+
136+
declare void @bar()

0 commit comments

Comments
 (0)