xref: /llvm-project/llvm/test/CodeGen/AArch64/typepromotion-phisret.ll (revision db158c7c830807caeeb0691739c41f1d522029e9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=aarch64 %s -o - | FileCheck %s
3
4define void @phi_feeding_phi_args(i8 %a, i8 %b) {
5; CHECK-LABEL: phi_feeding_phi_args:
6; CHECK:       // %bb.0: // %entry
7; CHECK-NEXT:    and w8, w0, #0xff
8; CHECK-NEXT:    and w9, w1, #0xff
9; CHECK-NEXT:    cmp w8, w9
10; CHECK-NEXT:    csel w8, w8, w9, hi
11; CHECK-NEXT:  .LBB0_1: // %loop
12; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
13; CHECK-NEXT:    lsl w9, w8, #1
14; CHECK-NEXT:    sub w10, w8, #2
15; CHECK-NEXT:    cmp w8, #254
16; CHECK-NEXT:    csel w8, w10, w9, lo
17; CHECK-NEXT:    cmp w8, #255
18; CHECK-NEXT:    b.ne .LBB0_1
19; CHECK-NEXT:  // %bb.2: // %exit
20; CHECK-NEXT:    ret
21entry:
22  %0 = icmp ugt i8 %a, %b
23  br i1 %0, label %preheader, label %empty
24
25empty:                                            ; preds = %entry
26  br label %preheader
27
28preheader:                                        ; preds = %empty, %entry
29  %1 = phi i8 [ %a, %entry ], [ %b, %empty ]
30  br label %loop
31
32loop:                                             ; preds = %if.end, %preheader
33  %val = phi i8 [ %1, %preheader ], [ %inc2, %if.end ]
34  %cmp = icmp ult i8 %val, -2
35  br i1 %cmp, label %if.then, label %if.else
36
37if.then:                                          ; preds = %loop
38  %inc = sub nuw i8 %val, 2
39  br label %if.end
40
41if.else:                                          ; preds = %loop
42  %inc1 = shl nuw i8 %val, 1
43  br label %if.end
44
45if.end:                                           ; preds = %if.else, %if.then
46  %inc2 = phi i8 [ %inc, %if.then ], [ %inc1, %if.else ]
47  %cmp1 = icmp eq i8 %inc2, -1
48  br i1 %cmp1, label %exit, label %loop
49
50exit:                                             ; preds = %if.end
51  ret void
52}
53
54define void @phi_feeding_phi_zeroext_args(i8 zeroext %a, i8 zeroext %b) {
55; CHECK-LABEL: phi_feeding_phi_zeroext_args:
56; CHECK:       // %bb.0: // %entry
57; CHECK-NEXT:    cmp w0, w1
58; CHECK-NEXT:    csel w8, w0, w1, hi
59; CHECK-NEXT:  .LBB1_1: // %loop
60; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
61; CHECK-NEXT:    lsl w9, w8, #1
62; CHECK-NEXT:    sub w10, w8, #2
63; CHECK-NEXT:    cmp w8, #254
64; CHECK-NEXT:    csel w8, w10, w9, lo
65; CHECK-NEXT:    cmp w8, #255
66; CHECK-NEXT:    b.ne .LBB1_1
67; CHECK-NEXT:  // %bb.2: // %exit
68; CHECK-NEXT:    ret
69entry:
70  %0 = icmp ugt i8 %a, %b
71  br i1 %0, label %preheader, label %empty
72
73empty:                                            ; preds = %entry
74  br label %preheader
75
76preheader:                                        ; preds = %empty, %entry
77  %1 = phi i8 [ %a, %entry ], [ %b, %empty ]
78  br label %loop
79
80loop:                                             ; preds = %if.end, %preheader
81  %val = phi i8 [ %1, %preheader ], [ %inc2, %if.end ]
82  %cmp = icmp ult i8 %val, -2
83  br i1 %cmp, label %if.then, label %if.else
84
85if.then:                                          ; preds = %loop
86  %inc = sub nuw i8 %val, 2
87  br label %if.end
88
89if.else:                                          ; preds = %loop
90  %inc1 = shl nuw i8 %val, 1
91  br label %if.end
92
93if.end:                                           ; preds = %if.else, %if.then
94  %inc2 = phi i8 [ %inc, %if.then ], [ %inc1, %if.else ]
95  %cmp1 = icmp eq i8 %inc2, -1
96  br i1 %cmp1, label %exit, label %loop
97
98exit:                                             ; preds = %if.end
99  ret void
100}
101
102define void @phi_i16() {
103; CHECK-LABEL: phi_i16:
104; CHECK:       // %bb.0: // %entry
105; CHECK-NEXT:    mov w8, wzr
106; CHECK-NEXT:    mov w9, #1 // =0x1
107; CHECK-NEXT:  .LBB2_1: // %loop
108; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
109; CHECK-NEXT:    cmp w8, #128
110; CHECK-NEXT:    cinc w10, w9, lo
111; CHECK-NEXT:    add w8, w8, w10
112; CHECK-NEXT:    cmp w8, #253
113; CHECK-NEXT:    b.lo .LBB2_1
114; CHECK-NEXT:  // %bb.2: // %exit
115; CHECK-NEXT:    ret
116entry:
117  br label %loop
118
119loop:                                             ; preds = %if.end, %entry
120  %val = phi i16 [ 0, %entry ], [ %inc2, %if.end ]
121  %cmp = icmp ult i16 %val, 128
122  br i1 %cmp, label %if.then, label %if.else
123
124if.then:                                          ; preds = %loop
125  %inc = add nuw i16 %val, 2
126  br label %if.end
127
128if.else:                                          ; preds = %loop
129  %inc1 = add nuw i16 %val, 1
130  br label %if.end
131
132if.end:                                           ; preds = %if.else, %if.then
133  %inc2 = phi i16 [ %inc, %if.then ], [ %inc1, %if.else ]
134  %cmp1 = icmp ult i16 %inc2, 253
135  br i1 %cmp1, label %loop, label %exit
136
137exit:                                             ; preds = %if.end
138  ret void
139}
140
141define i8 @ret_i8() {
142; CHECK-LABEL: ret_i8:
143; CHECK:       // %bb.0: // %entry
144; CHECK-NEXT:    mov w0, wzr
145; CHECK-NEXT:    mov w8, #1 // =0x1
146; CHECK-NEXT:  .LBB3_1: // %loop
147; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
148; CHECK-NEXT:    cmp w0, #128
149; CHECK-NEXT:    cinc w9, w8, lo
150; CHECK-NEXT:    add w0, w0, w9
151; CHECK-NEXT:    cmp w0, #252
152; CHECK-NEXT:    b.hi .LBB3_1
153; CHECK-NEXT:  // %bb.2: // %exit
154; CHECK-NEXT:    ret
155entry:
156  br label %loop
157
158loop:                                             ; preds = %if.end, %entry
159  %val = phi i8 [ 0, %entry ], [ %inc2, %if.end ]
160  %cmp = icmp ult i8 %val, -128
161  br i1 %cmp, label %if.then, label %if.else
162
163if.then:                                          ; preds = %loop
164  %inc = add nuw i8 %val, 2
165  br label %if.end
166
167if.else:                                          ; preds = %loop
168  %inc1 = add nuw i8 %val, 1
169  br label %if.end
170
171if.end:                                           ; preds = %if.else, %if.then
172  %inc2 = phi i8 [ %inc, %if.then ], [ %inc1, %if.else ]
173  %cmp1 = icmp ult i8 %inc2, -3
174  br i1 %cmp1, label %exit, label %loop
175
176exit:                                             ; preds = %if.end
177  ret i8 %inc2
178}
179
180define i16 @phi_multiple_undefs(i16 zeroext %arg) {
181; CHECK-LABEL: phi_multiple_undefs:
182; CHECK:       // %bb.0: // %entry
183; CHECK-NEXT:    mov w8, wzr
184; CHECK-NEXT:    mov w9, #1 // =0x1
185; CHECK-NEXT:  .LBB4_1: // %loop
186; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
187; CHECK-NEXT:    cmp w8, #128
188; CHECK-NEXT:    cinc w10, w9, lo
189; CHECK-NEXT:    add w8, w8, w10
190; CHECK-NEXT:    cmp w8, #253
191; CHECK-NEXT:    b.lo .LBB4_1
192; CHECK-NEXT:  // %bb.2: // %exit
193; CHECK-NEXT:    ret
194entry:
195  br label %loop
196
197loop:                                             ; preds = %if.end, %entry
198  %val = phi i16 [ undef, %entry ], [ %inc2, %if.end ]
199  %cmp = icmp ult i16 %val, 128
200  br i1 %cmp, label %if.then, label %if.else
201
202if.then:                                          ; preds = %loop
203  %inc = add nuw i16 %val, 2
204  br label %if.end
205
206if.else:                                          ; preds = %loop
207  %inc1 = add nuw i16 %val, 1
208  br label %if.end
209
210if.end:                                           ; preds = %if.else, %if.then
211  %inc2 = phi i16 [ %inc, %if.then ], [ %inc1, %if.else ]
212  %unrelated = phi i16 [ undef, %if.then ], [ %arg, %if.else ]
213  %cmp1 = icmp ult i16 %inc2, 253
214  br i1 %cmp1, label %loop, label %exit
215
216exit:                                             ; preds = %if.end
217  ret i16 %unrelated
218}
219
220define i16 @promote_arg_return(i16 zeroext %arg1, i16 zeroext %arg2, ptr %res) {
221; CHECK-LABEL: promote_arg_return:
222; CHECK:       // %bb.0:
223; CHECK-NEXT:    add w8, w0, w0, lsl #1
224; CHECK-NEXT:    add w8, w8, #45
225; CHECK-NEXT:    cmp w8, w1
226; CHECK-NEXT:    cset w8, lo
227; CHECK-NEXT:    strb w8, [x2]
228; CHECK-NEXT:    ret
229  %add = add nuw i16 %arg1, 15
230  %mul = mul nuw nsw i16 %add, 3
231  %cmp = icmp ult i16 %mul, %arg2
232  %conv = zext i1 %cmp to i8
233  store i8 %conv, ptr %res, align 1
234  ret i16 %arg1
235}
236
237define i16 @signext_bitcast_phi_select(i16 signext %start, ptr %in) {
238; CHECK-LABEL: signext_bitcast_phi_select:
239; CHECK:       // %bb.0: // %entry
240; CHECK-NEXT:    mov w8, #-1 // =0xffffffff
241; CHECK-NEXT:    and w9, w0, #0xffff
242; CHECK-NEXT:    cmp w8, w9, sxth
243; CHECK-NEXT:    b.lt .LBB6_3
244; CHECK-NEXT:  .LBB6_1: // %if.then
245; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
246; CHECK-NEXT:    ldrh w0, [x1, w9, sxtw #1]
247; CHECK-NEXT:    cmp w0, w9
248; CHECK-NEXT:    b.eq .LBB6_4
249; CHECK-NEXT:  // %bb.2: // %if.else
250; CHECK-NEXT:    // in Loop: Header=BB6_1 Depth=1
251; CHECK-NEXT:    lsr w10, w9, #15
252; CHECK-NEXT:    eor w10, w10, #0x1
253; CHECK-NEXT:    add w9, w10, w9
254; CHECK-NEXT:    cmp w8, w9, sxth
255; CHECK-NEXT:    b.ge .LBB6_1
256; CHECK-NEXT:  .LBB6_3:
257; CHECK-NEXT:    mov w0, wzr
258; CHECK-NEXT:  .LBB6_4: // %exit
259; CHECK-NEXT:    ret
260entry:
261  %const = bitcast i16 -1 to i16
262  br label %for.body
263
264for.body:                                         ; preds = %if.else, %entry
265  %idx = phi i16 [ %select, %if.else ], [ %start, %entry ]
266  %cmp.i = icmp sgt i16 %idx, %const
267  br i1 %cmp.i, label %exit, label %if.then
268
269if.then:                                          ; preds = %for.body
270  %idx.next = getelementptr i16, ptr %in, i16 %idx
271  %ld = load i16, ptr %idx.next, align 2
272  %cmp1.i = icmp eq i16 %ld, %idx
273  br i1 %cmp1.i, label %exit, label %if.else
274
275if.else:                                          ; preds = %if.then
276  %lobit = lshr i16 %idx, 15
277  %lobit.not = xor i16 %lobit, 1
278  %select = add nuw i16 %lobit.not, %idx
279  br label %for.body
280
281exit:                                             ; preds = %if.then, %for.body
282  %res = phi i16 [ %ld, %if.then ], [ 0, %for.body ]
283  ret i16 %res
284}
285