Skip to content

Commit e6ebd28

Browse files
committed
[ConstraintElim] Add phase ordering tests for pipeline adjustment.
Phaseordering tests for pipeline adjustment in D158843.
1 parent c4a3157 commit e6ebd28

File tree

1 file changed

+251
-0
lines changed

1 file changed

+251
-0
lines changed
Lines changed: 251 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
2+
; RUN: opt -passes='default<O2>' -S %s | FileCheck %s
3+
4+
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
5+
target triple = "arm64-apple-macosx"
6+
7+
define i1 @test_order_1(ptr %this, ptr noalias %other, i1 %tobool9.not, i32 %call) {
8+
; CHECK-LABEL: define i1 @test_order_1(
9+
; CHECK-SAME: ptr nocapture writeonly [[THIS:%.*]], ptr noalias [[OTHER:%.*]], i1 [[TOBOOL9_NOT:%.*]], i32 [[CALL:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
10+
; CHECK-NEXT: entry:
11+
; CHECK-NEXT: br i1 [[TOBOOL9_NOT]], label [[EXIT:%.*]], label [[FOR_COND_PREHEADER:%.*]]
12+
; CHECK: for.cond.preheader:
13+
; CHECK-NEXT: [[CMP40_NOT4:%.*]] = icmp slt i32 [[CALL]], 1
14+
; CHECK-NEXT: br i1 [[CMP40_NOT4]], label [[FOR_COND41_PREHEADER_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]
15+
; CHECK: for.cond41.preheader.preheader:
16+
; CHECK-NEXT: [[TMP0:%.*]] = sext i32 [[CALL]] to i64
17+
; CHECK-NEXT: br label [[FOR_COND41_PREHEADER:%.*]]
18+
; CHECK: for.cond:
19+
; CHECK-NEXT: [[INDVARS_IV_NEXT:%.*]] = add nsw i64 [[INDVARS_IV:%.*]], 1
20+
; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[INDVARS_IV_NEXT]], 4294967295
21+
; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[TMP1]], 1
22+
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]], label [[FOR_COND41_PREHEADER]]
23+
; CHECK: for.cond41.preheader:
24+
; CHECK-NEXT: [[INDVARS_IV]] = phi i64 [ [[TMP0]], [[FOR_COND41_PREHEADER_PREHEADER]] ], [ [[INDVARS_IV_NEXT]], [[FOR_COND:%.*]] ]
25+
; CHECK-NEXT: [[CALL432:%.*]] = load volatile i32, ptr [[OTHER]], align 4
26+
; CHECK-NEXT: [[CMP443:%.*]] = icmp sgt i32 [[CALL432]], 0
27+
; CHECK-NEXT: br i1 [[CMP443]], label [[FOR_BODY45_LR_PH:%.*]], label [[FOR_COND]]
28+
; CHECK: for.body45.lr.ph:
29+
; CHECK-NEXT: [[ARRAYIDX_I_I:%.*]] = getelementptr ptr, ptr [[OTHER]], i64 [[INDVARS_IV]]
30+
; CHECK-NEXT: br label [[FOR_BODY45:%.*]]
31+
; CHECK: for.cond.cleanup.loopexit:
32+
; CHECK-NEXT: [[CMP40_NOT:%.*]] = icmp slt i64 [[INDVARS_IV]], 0
33+
; CHECK-NEXT: br label [[FOR_COND_CLEANUP]]
34+
; CHECK: for.cond.cleanup:
35+
; CHECK-NEXT: [[CMP40_NOT_LCSSA:%.*]] = phi i1 [ false, [[FOR_COND_PREHEADER]] ], [ [[CMP40_NOT]], [[FOR_COND_CLEANUP_LOOPEXIT]] ]
36+
; CHECK-NEXT: store i32 0, ptr [[THIS]], align 4
37+
; CHECK-NEXT: br label [[EXIT]]
38+
; CHECK: for.body45:
39+
; CHECK-NEXT: [[CALL49:%.*]] = load volatile i1, ptr [[ARRAYIDX_I_I]], align 1
40+
; CHECK-NEXT: [[CALL43:%.*]] = load volatile i32, ptr [[OTHER]], align 4
41+
; CHECK-NEXT: [[CMP44:%.*]] = icmp sgt i32 [[CALL43]], 0
42+
; CHECK-NEXT: br i1 [[CMP44]], label [[FOR_BODY45]], label [[FOR_COND]]
43+
; CHECK: exit:
44+
; CHECK-NEXT: [[TMP2:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[CMP40_NOT_LCSSA]], [[FOR_COND_CLEANUP]] ]
45+
; CHECK-NEXT: ret i1 [[TMP2]]
46+
;
47+
entry:
48+
%retval1 = alloca i1, i32 0, align 1
49+
br i1 %tobool9.not, label %exit, label %for.cond
50+
51+
for.cond: ; preds = %for.inc57, %entry
52+
%0 = phi i32 [ %inc58, %for.inc57 ], [ %call, %entry ]
53+
%cmp40.not = icmp sgt i32 %0, 0
54+
br i1 %cmp40.not, label %for.cond.cleanup, label %for.cond41
55+
56+
for.cond.cleanup: ; preds = %for.cond
57+
store i32 0, ptr %this, align 4
58+
br label %cleanup59
59+
60+
for.cond41: ; preds = %for.body45, %for.cond
61+
%call43 = load volatile i32, ptr %other, align 4
62+
%cmp44 = icmp sgt i32 %call43, 0
63+
br i1 %cmp44, label %for.body45, label %for.end
64+
65+
for.body45: ; preds = %for.cond41
66+
%idxprom.i.i = sext i32 %0 to i64
67+
%arrayidx.i.i = getelementptr ptr, ptr %other, i64 %idxprom.i.i
68+
%call49 = load volatile i1, ptr %arrayidx.i.i, align 1
69+
br label %for.cond41
70+
71+
for.end: ; preds = %for.cond41
72+
br i1 %tobool9.not, label %cleanup59, label %for.inc57
73+
74+
for.inc57: ; preds = %for.end
75+
%inc58 = add nsw i32 %0, 1
76+
br label %for.cond
77+
78+
cleanup59: ; preds = %for.end, %for.cond.cleanup
79+
%cleanup.dest60 = phi i32 [ 0, %for.end ], [ 2, %for.cond.cleanup ]
80+
%cond1 = icmp eq i32 %cleanup.dest60, 2
81+
br i1 %cond1, label %for.end61, label %exit
82+
83+
for.end61: ; preds = %cleanup59
84+
store i1 false, ptr %retval1, align 1
85+
br label %exit
86+
87+
exit: ; preds = %for.end61, %cleanup59, %entry
88+
%1 = phi i1 [ false, %for.end61 ], [ true, %cleanup59 ], [ false, %entry ]
89+
ret i1 %1
90+
}
91+
92+
%struct = type { ptr, i64, i64 }
93+
94+
@.str.78 = constant [12 x i8] c"--test-info\00"
95+
@.str.79 = constant [14 x i8] c"--test-noinfo\00"
96+
@.str.80 = constant [18 x i8] c"--test-nocompress\00"
97+
98+
declare i64 @strlen(ptr)
99+
100+
define void @test2(ptr %this) #0 {
101+
; CHECK-LABEL: define void @test2(
102+
; CHECK-SAME: ptr nocapture writeonly [[THIS:%.*]]) local_unnamed_addr #[[ATTR2:[0-9]+]] {
103+
; CHECK-NEXT: entry:
104+
; CHECK-NEXT: [[CALL1_I_I:%.*]] = tail call i1 @test2_fn4(i8 undef)
105+
; CHECK-NEXT: [[CALL2_I_I:%.*]] = load i64, ptr inttoptr (i64 8 to ptr), align 8
106+
; CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[CALL1_I_I]], i64 [[CALL2_I_I]], i64 0
107+
; CHECK-NEXT: switch i64 [[COND_I_I]], label [[COMMON_RET:%.*]] [
108+
; CHECK-NEXT: i64 11, label [[IF_END_I:%.*]]
109+
; CHECK-NEXT: i64 13, label [[TEST2_FN2_EXIT12:%.*]]
110+
; CHECK-NEXT: i64 17, label [[IF_END_I31:%.*]]
111+
; CHECK-NEXT: ]
112+
; CHECK: if.end.i:
113+
; CHECK-NEXT: [[CALL8_I_I:%.*]] = tail call fastcc i32 @test2_fn6()
114+
; CHECK-NEXT: [[TRUNC_I_I:%.*]] = trunc i32 [[CALL8_I_I]] to i8
115+
; CHECK-NEXT: [[CALL1_I1_I:%.*]] = tail call i1 @test2_fn4(i8 [[TRUNC_I_I]])
116+
; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[CALL1_I1_I]], true
117+
; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP0]])
118+
; CHECK-NEXT: br label [[COMMON_RET]]
119+
; CHECK: test2_fn2.exit12:
120+
; CHECK-NEXT: [[CALL8_I_I8:%.*]] = tail call fastcc i32 @test2_fn6()
121+
; CHECK-NEXT: [[TRUNC_I_I9:%.*]] = trunc i32 [[CALL8_I_I8]] to i8
122+
; CHECK-NEXT: [[CALL1_I1_I10:%.*]] = tail call i1 @test2_fn4(i8 [[TRUNC_I_I9]])
123+
; CHECK-NEXT: [[TMP1:%.*]] = xor i1 [[CALL1_I1_I10]], true
124+
; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP1]])
125+
; CHECK-NEXT: [[CMP4_I11:%.*]] = icmp eq i32 [[CALL8_I_I8]], 0
126+
; CHECK-NEXT: br i1 [[CMP4_I11]], label [[TEST2_FN2_EXIT24:%.*]], label [[COMMON_RET]]
127+
; CHECK: common.ret:
128+
; CHECK-NEXT: ret void
129+
; CHECK: test2_fn2.exit24:
130+
; CHECK-NEXT: store i8 0, ptr [[THIS]], align 4
131+
; CHECK-NEXT: br label [[COMMON_RET]]
132+
; CHECK: if.end.i31:
133+
; CHECK-NEXT: [[DOTPRE:%.*]] = tail call fastcc i32 @test2_fn6()
134+
; CHECK-NEXT: [[DOTPRE38:%.*]] = trunc i32 [[DOTPRE]] to i8
135+
; CHECK-NEXT: [[DOTPRE39:%.*]] = tail call i1 @test2_fn4(i8 [[DOTPRE38]])
136+
; CHECK-NEXT: [[DOTPRE40:%.*]] = xor i1 [[DOTPRE39]], true
137+
; CHECK-NEXT: tail call void @llvm.assume(i1 [[DOTPRE40]])
138+
; CHECK-NEXT: br label [[COMMON_RET]]
139+
;
140+
entry:
141+
%call16 = call i1 @test2_fn2(ptr @.str.78)
142+
%call17 = call i1 @test2_fn2(ptr @.str.79)
143+
br i1 %call17, label %if.then18, label %if.else21
144+
145+
common.ret: ; preds = %if.else21, %if.then18
146+
ret void
147+
148+
if.then18: ; preds = %entry
149+
%call19 = call i1 @test2_fn2(ptr @.str.78)
150+
%frombool20 = zext i1 %call19 to i8
151+
store i8 %frombool20, ptr %this, align 4
152+
br label %common.ret
153+
154+
if.else21: ; preds = %entry
155+
%call22 = call i1 @test2_fn2(ptr @.str.80)
156+
br label %common.ret
157+
}
158+
159+
define i1 @test2_fn2(ptr %__rhs) #0 {
160+
; CHECK-LABEL: define i1 @test2_fn2(
161+
; CHECK-SAME: ptr nocapture readonly [[__RHS:%.*]]) local_unnamed_addr #[[ATTR3:[0-9]+]] {
162+
; CHECK-NEXT: entry:
163+
; CHECK-NEXT: [[CALL:%.*]] = tail call i64 @strlen(ptr noundef nonnull dereferenceable(1) [[__RHS]])
164+
; CHECK-NEXT: [[CALL1_I:%.*]] = tail call i1 @test2_fn4(i8 undef)
165+
; CHECK-NEXT: [[CALL2_I:%.*]] = load i64, ptr inttoptr (i64 8 to ptr), align 8
166+
; CHECK-NEXT: [[COND_I:%.*]] = select i1 [[CALL1_I]], i64 [[CALL2_I]], i64 0
167+
; CHECK-NEXT: [[CMP2_NOT:%.*]] = icmp eq i64 [[CALL]], [[COND_I]]
168+
; CHECK-NEXT: br i1 [[CMP2_NOT]], label [[IF_END:%.*]], label [[CLEANUP:%.*]]
169+
; CHECK: if.end:
170+
; CHECK-NEXT: [[CALL8_I:%.*]] = tail call fastcc i32 @test2_fn6()
171+
; CHECK-NEXT: [[TRUNC_I:%.*]] = trunc i32 [[CALL8_I]] to i8
172+
; CHECK-NEXT: [[CALL1_I1:%.*]] = tail call i1 @test2_fn4(i8 [[TRUNC_I]])
173+
; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[CALL1_I1]], true
174+
; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP0]])
175+
; CHECK-NEXT: [[CMP4:%.*]] = icmp eq i32 [[CALL8_I]], 0
176+
; CHECK-NEXT: br label [[CLEANUP]]
177+
; CHECK: cleanup:
178+
; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i1 [ [[CMP4]], [[IF_END]] ], [ false, [[ENTRY:%.*]] ]
179+
; CHECK-NEXT: ret i1 [[RETVAL_0]]
180+
;
181+
entry:
182+
%call = call i64 @strlen(ptr %__rhs)
183+
%call1 = call i64 @test2_fn3(ptr null)
184+
%cmp2.not = icmp eq i64 %call, %call1
185+
br i1 %cmp2.not, label %if.end, label %cleanup
186+
187+
if.end: ; preds = %entry
188+
%call3 = call i32 @test2_fn5()
189+
%cmp4 = icmp eq i32 %call3, 0
190+
br label %cleanup
191+
192+
cleanup: ; preds = %if.end, %entry
193+
%retval.0 = phi i1 [ %cmp4, %if.end ], [ false, %entry ]
194+
ret i1 %retval.0
195+
}
196+
197+
declare void @llvm.assume(i1 noundef)
198+
199+
define internal i64 @test2_fn3(ptr align 8 dereferenceable(24) %this) #0 {
200+
entry:
201+
%l = load i8, ptr %this
202+
%call1 = call i1 @test2_fn4(i8 %l)
203+
br i1 %call1, label %cond.true, label %cond.end
204+
205+
cond.true: ; preds = %entry
206+
%__size_ = getelementptr %struct, ptr %this, i64 0, i32 1
207+
%call2 = load i64, ptr %__size_, align 8
208+
209+
br label %cond.end
210+
211+
cond.end: ; preds = %cond.true, %entry
212+
%cond = phi i64 [ %call2, %cond.true ], [ 0, %entry ]
213+
ret i64 %cond
214+
}
215+
216+
define i1 @test2_fn4(i8 %bf.load) {
217+
; CHECK-LABEL: define i1 @test2_fn4(
218+
; CHECK-SAME: i8 [[BF_LOAD:%.*]]) local_unnamed_addr #[[ATTR5:[0-9]+]] {
219+
; CHECK-NEXT: entry:
220+
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp slt i8 [[BF_LOAD]], 0
221+
; CHECK-NEXT: ret i1 [[TOBOOL]]
222+
;
223+
entry:
224+
%tobool = icmp slt i8 %bf.load, 0
225+
ret i1 %tobool
226+
}
227+
228+
define internal i32 @test2_fn5() #0 {
229+
entry:
230+
%call8 = call i32 @test2_fn6()
231+
%trunc = trunc i32 %call8 to i8
232+
%call1 = call i1 @test2_fn4(i8 %trunc)
233+
%0 = xor i1 %call1, true
234+
call void @llvm.assume(i1 %0)
235+
ret i32 %call8
236+
}
237+
238+
define internal i32 @test2_fn6() {
239+
; CHECK-LABEL: define internal fastcc i32 @test2_fn6(
240+
; CHECK-SAME: ) unnamed_addr #[[ATTR5]] {
241+
; CHECK-NEXT: entry:
242+
; CHECK-NEXT: ret i32 0
243+
;
244+
entry:
245+
%call = call i32 @memcmp(ptr @.str.79, ptr @.str.79, i64 2)
246+
ret i32 %call
247+
}
248+
249+
declare i32 @memcmp(ptr, ptr, i64)
250+
251+
attributes #0 = { "target-cpu"="apple-m1" }

0 commit comments

Comments
 (0)