xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/early-ifcvt.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -x86-early-ifcvt -stress-early-ifcvt | FileCheck %s
2*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-apple-macosx10.8.0"
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; CHECK: mm2
5*9880d681SAndroid Build Coastguard Workerdefine i32 @mm2(i32* nocapture %p, i32 %n) nounwind uwtable readonly ssp {
6*9880d681SAndroid Build Coastguard Workerentry:
7*9880d681SAndroid Build Coastguard Worker  br label %do.body
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; CHECK: do.body
10*9880d681SAndroid Build Coastguard Worker; Loop body has no branches before the backedge.
11*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: LBB
12*9880d681SAndroid Build Coastguard Workerdo.body:
13*9880d681SAndroid Build Coastguard Worker  %max.0 = phi i32 [ 0, %entry ], [ %max.1, %do.cond ]
14*9880d681SAndroid Build Coastguard Worker  %min.0 = phi i32 [ 0, %entry ], [ %min.1, %do.cond ]
15*9880d681SAndroid Build Coastguard Worker  %n.addr.0 = phi i32 [ %n, %entry ], [ %dec, %do.cond ]
16*9880d681SAndroid Build Coastguard Worker  %p.addr.0 = phi i32* [ %p, %entry ], [ %incdec.ptr, %do.cond ]
17*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i32, i32* %p.addr.0, i64 1
18*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %p.addr.0, align 4
19*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %0, %max.0
20*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %do.cond, label %if.else
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerif.else:
23*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp slt i32 %0, %min.0
24*9880d681SAndroid Build Coastguard Worker  %.min.0 = select i1 %cmp1, i32 %0, i32 %min.0
25*9880d681SAndroid Build Coastguard Worker  br label %do.cond
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerdo.cond:
28*9880d681SAndroid Build Coastguard Worker  %max.1 = phi i32 [ %0, %do.body ], [ %max.0, %if.else ]
29*9880d681SAndroid Build Coastguard Worker  %min.1 = phi i32 [ %min.0, %do.body ], [ %.min.0, %if.else ]
30*9880d681SAndroid Build Coastguard Worker; CHECK: decl %esi
31*9880d681SAndroid Build Coastguard Worker; CHECK: jne LBB
32*9880d681SAndroid Build Coastguard Worker  %dec = add i32 %n.addr.0, -1
33*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %dec, 0
34*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %do.end, label %do.body
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Workerdo.end:
37*9880d681SAndroid Build Coastguard Worker  %sub = sub nsw i32 %max.1, %min.1
38*9880d681SAndroid Build Coastguard Worker  ret i32 %sub
39*9880d681SAndroid Build Coastguard Worker}
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker; CHECK: multipreds
42*9880d681SAndroid Build Coastguard Worker; Deal with alternative tail predecessors
43*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: LBB
44*9880d681SAndroid Build Coastguard Worker; CHECK: cmov
45*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: LBB
46*9880d681SAndroid Build Coastguard Worker; CHECK: cmov
47*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: LBB
48*9880d681SAndroid Build Coastguard Worker; CHECK: fprintf
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerdefine void @multipreds(i32 %sw) nounwind uwtable ssp {
51*9880d681SAndroid Build Coastguard Workerentry:
52*9880d681SAndroid Build Coastguard Worker  switch i32 %sw, label %if.then29 [
53*9880d681SAndroid Build Coastguard Worker    i32 0, label %if.then37
54*9880d681SAndroid Build Coastguard Worker    i32 127, label %if.end41
55*9880d681SAndroid Build Coastguard Worker  ]
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerif.then29:
58*9880d681SAndroid Build Coastguard Worker  br label %if.end41
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerif.then37:
61*9880d681SAndroid Build Coastguard Worker  br label %if.end41
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerif.end41:
64*9880d681SAndroid Build Coastguard Worker  %exit_status.0 = phi i32 [ 2, %if.then29 ], [ 0, %if.then37 ], [ 66, %entry ]
65*9880d681SAndroid Build Coastguard Worker  call void (...) @fprintf(i32 %exit_status.0) nounwind
66*9880d681SAndroid Build Coastguard Worker  unreachable
67*9880d681SAndroid Build Coastguard Worker}
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Workerdeclare void @fprintf(...) nounwind
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker; CHECK: BZ2_decompress
72*9880d681SAndroid Build Coastguard Worker; This test case contains irreducible control flow, so MachineLoopInfo doesn't
73*9880d681SAndroid Build Coastguard Worker; recognize the cycle in the CFG. This would confuse MachineTraceMetrics.
74*9880d681SAndroid Build Coastguard Workerdefine void @BZ2_decompress(i8* %s) nounwind ssp {
75*9880d681SAndroid Build Coastguard Workerentry:
76*9880d681SAndroid Build Coastguard Worker  switch i32 undef, label %sw.default [
77*9880d681SAndroid Build Coastguard Worker    i32 39, label %if.end.sw.bb2050_crit_edge
78*9880d681SAndroid Build Coastguard Worker    i32 36, label %sw.bb1788
79*9880d681SAndroid Build Coastguard Worker    i32 37, label %if.end.sw.bb1855_crit_edge
80*9880d681SAndroid Build Coastguard Worker    i32 40, label %sw.bb2409
81*9880d681SAndroid Build Coastguard Worker    i32 38, label %sw.bb1983
82*9880d681SAndroid Build Coastguard Worker    i32 44, label %if.end.sw.bb3058_crit_edge
83*9880d681SAndroid Build Coastguard Worker  ]
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerif.end.sw.bb3058_crit_edge:                       ; preds = %entry
86*9880d681SAndroid Build Coastguard Worker  br label %save_state_and_return
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workerif.end.sw.bb1855_crit_edge:                       ; preds = %entry
89*9880d681SAndroid Build Coastguard Worker  br label %save_state_and_return
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerif.end.sw.bb2050_crit_edge:                       ; preds = %entry
92*9880d681SAndroid Build Coastguard Worker  br label %sw.bb2050
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workersw.bb1788:                                        ; preds = %entry
95*9880d681SAndroid Build Coastguard Worker  br label %save_state_and_return
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workersw.bb1983:                                        ; preds = %entry
98*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %save_state_and_return, label %if.then1990
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Workerif.then1990:                                      ; preds = %sw.bb1983
101*9880d681SAndroid Build Coastguard Worker  br label %while.body2038
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerwhile.body2038:                                   ; preds = %sw.bb2050, %if.then1990
104*9880d681SAndroid Build Coastguard Worker  %groupPos.8 = phi i32 [ 0, %if.then1990 ], [ %groupPos.9, %sw.bb2050 ]
105*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %save_state_and_return, label %if.end2042
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerif.end2042:                                       ; preds = %while.body2038
108*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if.end2048, label %while.end2104
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workerif.end2048:                                       ; preds = %if.end2042
111*9880d681SAndroid Build Coastguard Worker  %bsLive2054.pre = getelementptr inbounds i8, i8* %s, i32 8
112*9880d681SAndroid Build Coastguard Worker  br label %sw.bb2050
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workersw.bb2050:                                        ; preds = %if.end2048, %if.end.sw.bb2050_crit_edge
115*9880d681SAndroid Build Coastguard Worker  %groupPos.9 = phi i32 [ 0, %if.end.sw.bb2050_crit_edge ], [ %groupPos.8, %if.end2048 ]
116*9880d681SAndroid Build Coastguard Worker  %and2064 = and i32 undef, 1
117*9880d681SAndroid Build Coastguard Worker  br label %while.body2038
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerwhile.end2104:                                    ; preds = %if.end2042
120*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %save_state_and_return, label %if.end2117
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Workerif.end2117:                                       ; preds = %while.end2104
123*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %while.body2161.lr.ph, label %while.body2145.lr.ph
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerwhile.body2145.lr.ph:                             ; preds = %if.end2117
126*9880d681SAndroid Build Coastguard Worker  br label %save_state_and_return
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workerwhile.body2161.lr.ph:                             ; preds = %if.end2117
129*9880d681SAndroid Build Coastguard Worker  br label %save_state_and_return
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workersw.bb2409:                                        ; preds = %entry
132*9880d681SAndroid Build Coastguard Worker  br label %save_state_and_return
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Workersw.default:                                       ; preds = %entry
135*9880d681SAndroid Build Coastguard Worker  call void @BZ2_bz__AssertH__fail() nounwind
136*9880d681SAndroid Build Coastguard Worker  br label %save_state_and_return
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Workersave_state_and_return:
139*9880d681SAndroid Build Coastguard Worker  %groupPos.14 = phi i32 [ 0, %sw.default ], [ %groupPos.8, %while.body2038 ], [ %groupPos.8, %while.end2104 ], [ 0, %if.end.sw.bb3058_crit_edge ], [ 0, %if.end.sw.bb1855_crit_edge ], [ %groupPos.8, %while.body2161.lr.ph ], [ %groupPos.8, %while.body2145.lr.ph ], [ 0, %sw.bb2409 ], [ 0, %sw.bb1788 ], [ 0, %sw.bb1983 ]
140*9880d681SAndroid Build Coastguard Worker  store i32 %groupPos.14, i32* undef, align 4
141*9880d681SAndroid Build Coastguard Worker  ret void
142*9880d681SAndroid Build Coastguard Worker}
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerdeclare void @BZ2_bz__AssertH__fail()
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker; Make sure we don't speculate on div/idiv instructions
147*9880d681SAndroid Build Coastguard Worker; CHECK: test_idiv
148*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmov
149*9880d681SAndroid Build Coastguard Workerdefine i32 @test_idiv(i32 %a, i32 %b) nounwind uwtable readnone ssp {
150*9880d681SAndroid Build Coastguard Worker  %1 = icmp eq i32 %b, 0
151*9880d681SAndroid Build Coastguard Worker  br i1 %1, label %4, label %2
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker; <label>:2                                       ; preds = %0
154*9880d681SAndroid Build Coastguard Worker  %3 = sdiv i32 %a, %b
155*9880d681SAndroid Build Coastguard Worker  br label %4
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker; <label>:4                                       ; preds = %0, %2
158*9880d681SAndroid Build Coastguard Worker  %5 = phi i32 [ %3, %2 ], [ %a, %0 ]
159*9880d681SAndroid Build Coastguard Worker  ret i32 %5
160*9880d681SAndroid Build Coastguard Worker}
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Worker; CHECK: test_div
163*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmov
164*9880d681SAndroid Build Coastguard Workerdefine i32 @test_div(i32 %a, i32 %b) nounwind uwtable readnone ssp {
165*9880d681SAndroid Build Coastguard Worker  %1 = icmp eq i32 %b, 0
166*9880d681SAndroid Build Coastguard Worker  br i1 %1, label %4, label %2
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker; <label>:2                                       ; preds = %0
169*9880d681SAndroid Build Coastguard Worker  %3 = udiv i32 %a, %b
170*9880d681SAndroid Build Coastguard Worker  br label %4
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Worker; <label>:4                                       ; preds = %0, %2
173*9880d681SAndroid Build Coastguard Worker  %5 = phi i32 [ %3, %2 ], [ %a, %0 ]
174*9880d681SAndroid Build Coastguard Worker  ret i32 %5
175*9880d681SAndroid Build Coastguard Worker}
176