xref: /aosp_15_r20/external/llvm/test/Transforms/LICM/speculate.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -licm < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: opt -passes='require<aa>,require<targetir>,require<scalar-evolution>,loop(licm)' -S %s | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; UDiv is safe to speculate if the denominator is known non-zero.
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @safe_udiv(
7*9880d681SAndroid Build Coastguard Worker; CHECK:      %div = udiv i64 %x, 2
8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %for.body
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerdefine void @safe_udiv(i64 %x, i64 %m, i64 %n, i32* %p, i64* %q) nounwind {
11*9880d681SAndroid Build Coastguard Workerentry:
12*9880d681SAndroid Build Coastguard Worker  br label %for.body
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.inc
15*9880d681SAndroid Build Coastguard Worker  %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]
16*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %p, i64 %i.02
17*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx, align 4
18*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %0, 0
19*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %for.inc, label %if.then
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %for.body
22*9880d681SAndroid Build Coastguard Worker  %div = udiv i64 %x, 2
23*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds i64, i64* %q, i64 %i.02
24*9880d681SAndroid Build Coastguard Worker  store i64 %div, i64* %arrayidx1, align 8
25*9880d681SAndroid Build Coastguard Worker  br label %for.inc
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerfor.inc:                                          ; preds = %if.then, %for.body
28*9880d681SAndroid Build Coastguard Worker  %inc = add i64 %i.02, 1
29*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i64 %inc, %n
30*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.end
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.inc, %entry
33*9880d681SAndroid Build Coastguard Worker  ret void
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker; UDiv is unsafe to speculate if the denominator is not known non-zero.
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @unsafe_udiv(
39*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:  udiv
40*9880d681SAndroid Build Coastguard Worker; CHECK: for.body:
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerdefine void @unsafe_udiv(i64 %x, i64 %m, i64 %n, i32* %p, i64* %q) nounwind {
43*9880d681SAndroid Build Coastguard Workerentry:
44*9880d681SAndroid Build Coastguard Worker  br label %for.body
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.inc
47*9880d681SAndroid Build Coastguard Worker  %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]
48*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %p, i64 %i.02
49*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx, align 4
50*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %0, 0
51*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %for.inc, label %if.then
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %for.body
54*9880d681SAndroid Build Coastguard Worker  %div = udiv i64 %x, %m
55*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds i64, i64* %q, i64 %i.02
56*9880d681SAndroid Build Coastguard Worker  store i64 %div, i64* %arrayidx1, align 8
57*9880d681SAndroid Build Coastguard Worker  br label %for.inc
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerfor.inc:                                          ; preds = %if.then, %for.body
60*9880d681SAndroid Build Coastguard Worker  %inc = add i64 %i.02, 1
61*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i64 %inc, %n
62*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.end
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.inc, %entry
65*9880d681SAndroid Build Coastguard Worker  ret void
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker; SDiv is safe to speculate if the denominator is known non-zero and
69*9880d681SAndroid Build Coastguard Worker; known to have at least one zero bit.
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @safe_sdiv(
72*9880d681SAndroid Build Coastguard Worker; CHECK:      %div = sdiv i64 %x, 2
73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %for.body
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workerdefine void @safe_sdiv(i64 %x, i64 %m, i64 %n, i32* %p, i64* %q) nounwind {
76*9880d681SAndroid Build Coastguard Workerentry:
77*9880d681SAndroid Build Coastguard Worker  %and = and i64 %m, -3
78*9880d681SAndroid Build Coastguard Worker  br label %for.body
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.inc
81*9880d681SAndroid Build Coastguard Worker  %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]
82*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %p, i64 %i.02
83*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx, align 4
84*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %0, 0
85*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %for.inc, label %if.then
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %for.body
88*9880d681SAndroid Build Coastguard Worker  %div = sdiv i64 %x, 2
89*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds i64, i64* %q, i64 %i.02
90*9880d681SAndroid Build Coastguard Worker  store i64 %div, i64* %arrayidx1, align 8
91*9880d681SAndroid Build Coastguard Worker  br label %for.inc
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerfor.inc:                                          ; preds = %if.then, %for.body
94*9880d681SAndroid Build Coastguard Worker  %inc = add i64 %i.02, 1
95*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i64 %inc, %n
96*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.end
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.inc, %entry
99*9880d681SAndroid Build Coastguard Worker  ret void
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker; SDiv is unsafe to speculate if the denominator is not known non-zero.
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @unsafe_sdiv_a(
105*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:  sdiv
106*9880d681SAndroid Build Coastguard Worker; CHECK: for.body:
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Workerdefine void @unsafe_sdiv_a(i64 %x, i64 %m, i64 %n, i32* %p, i64* %q) nounwind {
109*9880d681SAndroid Build Coastguard Workerentry:
110*9880d681SAndroid Build Coastguard Worker  %or = or i64 %m, 1
111*9880d681SAndroid Build Coastguard Worker  br label %for.body
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.inc
114*9880d681SAndroid Build Coastguard Worker  %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]
115*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %p, i64 %i.02
116*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx, align 4
117*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %0, 0
118*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %for.inc, label %if.then
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %for.body
121*9880d681SAndroid Build Coastguard Worker  %div = sdiv i64 %x, %or
122*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds i64, i64* %q, i64 %i.02
123*9880d681SAndroid Build Coastguard Worker  store i64 %div, i64* %arrayidx1, align 8
124*9880d681SAndroid Build Coastguard Worker  br label %for.inc
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Workerfor.inc:                                          ; preds = %if.then, %for.body
127*9880d681SAndroid Build Coastguard Worker  %inc = add i64 %i.02, 1
128*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i64 %inc, %n
129*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.end
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.inc, %entry
132*9880d681SAndroid Build Coastguard Worker  ret void
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker; SDiv is unsafe to speculate if the denominator is not known to have a zero bit.
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @unsafe_sdiv_b(
138*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:  sdiv
139*9880d681SAndroid Build Coastguard Worker; CHECK: for.body:
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Workerdefine void @unsafe_sdiv_b(i64 %x, i64 %m, i64 %n, i32* %p, i64* %q) nounwind {
142*9880d681SAndroid Build Coastguard Workerentry:
143*9880d681SAndroid Build Coastguard Worker  %and = and i64 %m, -3
144*9880d681SAndroid Build Coastguard Worker  br label %for.body
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.inc
147*9880d681SAndroid Build Coastguard Worker  %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]
148*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %p, i64 %i.02
149*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx, align 4
150*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %0, 0
151*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %for.inc, label %if.then
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %for.body
154*9880d681SAndroid Build Coastguard Worker  %div = sdiv i64 %x, %and
155*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds i64, i64* %q, i64 %i.02
156*9880d681SAndroid Build Coastguard Worker  store i64 %div, i64* %arrayidx1, align 8
157*9880d681SAndroid Build Coastguard Worker  br label %for.inc
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Workerfor.inc:                                          ; preds = %if.then, %for.body
160*9880d681SAndroid Build Coastguard Worker  %inc = add i64 %i.02, 1
161*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i64 %inc, %n
162*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.end
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.inc, %entry
165*9880d681SAndroid Build Coastguard Worker  ret void
166*9880d681SAndroid Build Coastguard Worker}
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker; SDiv is unsafe to speculate inside an infinite loop.
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Workerdefine void @unsafe_sdiv_c(i64 %a, i64 %b, i64* %p) {
171*9880d681SAndroid Build Coastguard Workerentry:
172*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
173*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sdiv
174*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.body
175*9880d681SAndroid Build Coastguard Worker  br label %for.body
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Workerfor.body:
178*9880d681SAndroid Build Coastguard Worker  %c = icmp eq i64 %b, 0
179*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %backedge, label %if.then
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Workerif.then:
182*9880d681SAndroid Build Coastguard Worker  %d = sdiv i64 %a, %b
183*9880d681SAndroid Build Coastguard Worker  store i64 %d, i64* %p
184*9880d681SAndroid Build Coastguard Worker  br label %backedge
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Workerbackedge:
187*9880d681SAndroid Build Coastguard Worker  br label %for.body
188*9880d681SAndroid Build Coastguard Worker}
189