xref: /llvm-project/llvm/test/Analysis/ValueTracking/recurrence-knownbits.ll (revision fef6613e9fc05bca8e315c65e8f8da796860a3cf)
1f25b0919SRamkumar Ramachandra; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2f25b0919SRamkumar Ramachandra; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3f25b0919SRamkumar Ramachandra
4f25b0919SRamkumar Ramachandradefine i64 @test_lshr(i1 %c) {
5f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_lshr(
6f25b0919SRamkumar Ramachandra; CHECK-NEXT:  entry:
7f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br label [[LOOP:%.*]]
8f25b0919SRamkumar Ramachandra; CHECK:       loop:
9f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
10f25b0919SRamkumar Ramachandra; CHECK:       exit:
11f25b0919SRamkumar Ramachandra; CHECK-NEXT:    ret i64 1023
12f25b0919SRamkumar Ramachandra;
13f25b0919SRamkumar Ramachandraentry:
14f25b0919SRamkumar Ramachandra  br label %loop
15f25b0919SRamkumar Ramachandraloop:
16f25b0919SRamkumar Ramachandra  %iv.lshr = phi i64 [1023, %entry], [%iv.lshr.next, %loop]
17f25b0919SRamkumar Ramachandra  %iv.lshr.next = lshr i64 %iv.lshr, 1
18f25b0919SRamkumar Ramachandra  br i1 %c, label %exit, label %loop
19f25b0919SRamkumar Ramachandraexit:
20f25b0919SRamkumar Ramachandra  %res = or i64 %iv.lshr, 1023
21f25b0919SRamkumar Ramachandra  ret i64 %res
22f25b0919SRamkumar Ramachandra}
23f25b0919SRamkumar Ramachandra
24f25b0919SRamkumar Ramachandradefine i64 @test_add(i1 %c) {
25f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_add(
26f25b0919SRamkumar Ramachandra; CHECK-NEXT:  entry:
27f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br label [[LOOP:%.*]]
28f25b0919SRamkumar Ramachandra; CHECK:       loop:
29f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
30f25b0919SRamkumar Ramachandra; CHECK:       exit:
31f25b0919SRamkumar Ramachandra; CHECK-NEXT:    ret i64 0
32f25b0919SRamkumar Ramachandra;
33f25b0919SRamkumar Ramachandraentry:
34f25b0919SRamkumar Ramachandra  br label %loop
35f25b0919SRamkumar Ramachandraloop:
36f25b0919SRamkumar Ramachandra  %iv = phi i64 [8, %entry], [%iv.next, %loop]
37f25b0919SRamkumar Ramachandra  %iv.next = add nuw i64 %iv, 4
38f25b0919SRamkumar Ramachandra  br i1 %c, label %exit, label %loop
39f25b0919SRamkumar Ramachandraexit:
40f25b0919SRamkumar Ramachandra  %res = and i64 %iv, 1
41f25b0919SRamkumar Ramachandra  ret i64 %res
42f25b0919SRamkumar Ramachandra}
43f25b0919SRamkumar Ramachandra
44f25b0919SRamkumar Ramachandradefine i64 @test_sub(i1 %c) {
45f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_sub(
46f25b0919SRamkumar Ramachandra; CHECK-NEXT:  entry:
47f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br label [[LOOP:%.*]]
48f25b0919SRamkumar Ramachandra; CHECK:       loop:
49f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
50f25b0919SRamkumar Ramachandra; CHECK:       exit:
51f25b0919SRamkumar Ramachandra; CHECK-NEXT:    ret i64 0
52f25b0919SRamkumar Ramachandra;
53f25b0919SRamkumar Ramachandraentry:
54f25b0919SRamkumar Ramachandra  br label %loop
55f25b0919SRamkumar Ramachandraloop:
56f25b0919SRamkumar Ramachandra  %iv = phi i64 [8, %entry], [%iv.next, %loop]
57f25b0919SRamkumar Ramachandra  %iv.next = sub nuw i64 %iv, 4
58f25b0919SRamkumar Ramachandra  br i1 %c, label %exit, label %loop
59f25b0919SRamkumar Ramachandraexit:
60f25b0919SRamkumar Ramachandra  %res = and i64 %iv, 1
61f25b0919SRamkumar Ramachandra  ret i64 %res
62f25b0919SRamkumar Ramachandra}
63f25b0919SRamkumar Ramachandra
64f25b0919SRamkumar Ramachandradefine i64 @test_mul(i1 %c) {
65f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_mul(
66f25b0919SRamkumar Ramachandra; CHECK-NEXT:  entry:
67f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br label [[LOOP:%.*]]
68f25b0919SRamkumar Ramachandra; CHECK:       loop:
69f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
70f25b0919SRamkumar Ramachandra; CHECK:       exit:
71f25b0919SRamkumar Ramachandra; CHECK-NEXT:    ret i64 0
72f25b0919SRamkumar Ramachandra;
73f25b0919SRamkumar Ramachandraentry:
74f25b0919SRamkumar Ramachandra  br label %loop
75f25b0919SRamkumar Ramachandraloop:
76f25b0919SRamkumar Ramachandra  %iv = phi i64 [8, %entry], [%iv.next, %loop]
77f25b0919SRamkumar Ramachandra  %iv.next = mul i64 %iv, 2
78f25b0919SRamkumar Ramachandra  br i1 %c, label %exit, label %loop
79f25b0919SRamkumar Ramachandraexit:
80f25b0919SRamkumar Ramachandra  %res = and i64 %iv, 2
81f25b0919SRamkumar Ramachandra  ret i64 %res
82f25b0919SRamkumar Ramachandra}
83f25b0919SRamkumar Ramachandra
84abe0cd46SRamkumar Ramachandradefine i64 @test_udiv(i1 %c) {
85abe0cd46SRamkumar Ramachandra; CHECK-LABEL: @test_udiv(
86abe0cd46SRamkumar Ramachandra; CHECK-NEXT:  entry:
87abe0cd46SRamkumar Ramachandra; CHECK-NEXT:    br label [[LOOP:%.*]]
88abe0cd46SRamkumar Ramachandra; CHECK:       loop:
89abe0cd46SRamkumar Ramachandra; CHECK-NEXT:    br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
90abe0cd46SRamkumar Ramachandra; CHECK:       exit:
91*fef6613eSRamkumar Ramachandra; CHECK-NEXT:    ret i64 0
92abe0cd46SRamkumar Ramachandra;
93abe0cd46SRamkumar Ramachandraentry:
94abe0cd46SRamkumar Ramachandra  br label %loop
95abe0cd46SRamkumar Ramachandraloop:
96abe0cd46SRamkumar Ramachandra  %iv = phi i64 [9, %entry], [%iv.next, %loop]
97abe0cd46SRamkumar Ramachandra  %iv.next = udiv i64 %iv, 3
98abe0cd46SRamkumar Ramachandra  br i1 %c, label %exit, label %loop
99abe0cd46SRamkumar Ramachandraexit:
100abe0cd46SRamkumar Ramachandra  %res = and i64 %iv, 16
101abe0cd46SRamkumar Ramachandra  ret i64 %res
102abe0cd46SRamkumar Ramachandra}
103abe0cd46SRamkumar Ramachandra
104abe0cd46SRamkumar Ramachandradefine i64 @test_udiv_neg(i1 %c) {
105abe0cd46SRamkumar Ramachandra; CHECK-LABEL: @test_udiv_neg(
106abe0cd46SRamkumar Ramachandra; CHECK-NEXT:  entry:
107abe0cd46SRamkumar Ramachandra; CHECK-NEXT:    br label [[LOOP:%.*]]
108abe0cd46SRamkumar Ramachandra; CHECK:       loop:
109abe0cd46SRamkumar Ramachandra; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ 2, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
110abe0cd46SRamkumar Ramachandra; CHECK-NEXT:    [[IV_NEXT]] = udiv i64 9, [[IV]]
111abe0cd46SRamkumar Ramachandra; CHECK-NEXT:    br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
112abe0cd46SRamkumar Ramachandra; CHECK:       exit:
113abe0cd46SRamkumar Ramachandra; CHECK-NEXT:    [[RES:%.*]] = and i64 [[IV]], 4
114abe0cd46SRamkumar Ramachandra; CHECK-NEXT:    ret i64 [[RES]]
115abe0cd46SRamkumar Ramachandra;
116abe0cd46SRamkumar Ramachandraentry:
117abe0cd46SRamkumar Ramachandra  br label %loop
118abe0cd46SRamkumar Ramachandraloop:
119abe0cd46SRamkumar Ramachandra  %iv = phi i64 [2, %entry], [%iv.next, %loop]
120abe0cd46SRamkumar Ramachandra  %iv.next = udiv i64 9, %iv
121abe0cd46SRamkumar Ramachandra  br i1 %c, label %exit, label %loop
122abe0cd46SRamkumar Ramachandraexit:
123abe0cd46SRamkumar Ramachandra  %res = and i64 %iv, 4
124abe0cd46SRamkumar Ramachandra  ret i64 %res
125abe0cd46SRamkumar Ramachandra}
126abe0cd46SRamkumar Ramachandra
127abe0cd46SRamkumar Ramachandradefine i64 @test_urem(i1 %c) {
128abe0cd46SRamkumar Ramachandra; CHECK-LABEL: @test_urem(
129abe0cd46SRamkumar Ramachandra; CHECK-NEXT:  entry:
130abe0cd46SRamkumar Ramachandra; CHECK-NEXT:    br label [[LOOP:%.*]]
131abe0cd46SRamkumar Ramachandra; CHECK:       loop:
132abe0cd46SRamkumar Ramachandra; CHECK-NEXT:    br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
133abe0cd46SRamkumar Ramachandra; CHECK:       exit:
134*fef6613eSRamkumar Ramachandra; CHECK-NEXT:    ret i64 0
135abe0cd46SRamkumar Ramachandra;
136abe0cd46SRamkumar Ramachandraentry:
137abe0cd46SRamkumar Ramachandra  br label %loop
138abe0cd46SRamkumar Ramachandraloop:
139abe0cd46SRamkumar Ramachandra  %iv = phi i64 [3, %entry], [%iv.next, %loop]
140abe0cd46SRamkumar Ramachandra  %iv.next = urem i64 9, %iv
141abe0cd46SRamkumar Ramachandra  br i1 %c, label %exit, label %loop
142abe0cd46SRamkumar Ramachandraexit:
143abe0cd46SRamkumar Ramachandra  %res = and i64 %iv, 4
144abe0cd46SRamkumar Ramachandra  ret i64 %res
145abe0cd46SRamkumar Ramachandra}
146abe0cd46SRamkumar Ramachandra
147f25b0919SRamkumar Ramachandradefine i64 @test_and(i1 %c) {
148f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_and(
149f25b0919SRamkumar Ramachandra; CHECK-NEXT:  entry:
150f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br label [[LOOP:%.*]]
151f25b0919SRamkumar Ramachandra; CHECK:       loop:
152f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
153f25b0919SRamkumar Ramachandra; CHECK:       exit:
154f25b0919SRamkumar Ramachandra; CHECK-NEXT:    ret i64 2047
155f25b0919SRamkumar Ramachandra;
156f25b0919SRamkumar Ramachandraentry:
157f25b0919SRamkumar Ramachandra  br label %loop
158f25b0919SRamkumar Ramachandraloop:
159f25b0919SRamkumar Ramachandra  %iv = phi i64 [1025, %entry], [%iv.next, %loop]
160f25b0919SRamkumar Ramachandra  %iv.next = and i64 %iv, 1024
161f25b0919SRamkumar Ramachandra  br i1 %c, label %exit, label %loop
162f25b0919SRamkumar Ramachandraexit:
163f25b0919SRamkumar Ramachandra  %res = or i64 %iv, 1023
164f25b0919SRamkumar Ramachandra  ret i64 %res
165f25b0919SRamkumar Ramachandra}
166f25b0919SRamkumar Ramachandra
167f25b0919SRamkumar Ramachandradefine i64 @test_or(i1 %c) {
168f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_or(
169f25b0919SRamkumar Ramachandra; CHECK-NEXT:  entry:
170f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br label [[LOOP:%.*]]
171f25b0919SRamkumar Ramachandra; CHECK:       loop:
172f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
173f25b0919SRamkumar Ramachandra; CHECK:       exit:
174f25b0919SRamkumar Ramachandra; CHECK-NEXT:    ret i64 2047
175f25b0919SRamkumar Ramachandra;
176f25b0919SRamkumar Ramachandraentry:
177f25b0919SRamkumar Ramachandra  br label %loop
178f25b0919SRamkumar Ramachandraloop:
179f25b0919SRamkumar Ramachandra  %iv = phi i64 [1025, %entry], [%iv.next, %loop]
180f25b0919SRamkumar Ramachandra  %iv.next = or i64 %iv, 1024
181f25b0919SRamkumar Ramachandra  br i1 %c, label %exit, label %loop
182f25b0919SRamkumar Ramachandraexit:
183f25b0919SRamkumar Ramachandra  %res = or i64 %iv, 1023
184f25b0919SRamkumar Ramachandra  ret i64 %res
185f25b0919SRamkumar Ramachandra}
186f25b0919SRamkumar Ramachandra
187f25b0919SRamkumar Ramachandradefine i64 @test_ashr_zeros(i1 %c) {
188f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_ashr_zeros(
189f25b0919SRamkumar Ramachandra; CHECK-NEXT:  entry:
190f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br label [[LOOP:%.*]]
191f25b0919SRamkumar Ramachandra; CHECK:       loop:
192f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
193f25b0919SRamkumar Ramachandra; CHECK:       exit:
194f25b0919SRamkumar Ramachandra; CHECK-NEXT:    ret i64 1023
195f25b0919SRamkumar Ramachandra;
196f25b0919SRamkumar Ramachandraentry:
197f25b0919SRamkumar Ramachandra  br label %loop
198f25b0919SRamkumar Ramachandraloop:
199f25b0919SRamkumar Ramachandra  %iv.ashr = phi i64 [1023, %entry], [%iv.ashr.next, %loop]
200f25b0919SRamkumar Ramachandra  %iv.ashr.next = ashr i64 %iv.ashr, 1
201f25b0919SRamkumar Ramachandra  br i1 %c, label %exit, label %loop
202f25b0919SRamkumar Ramachandraexit:
203f25b0919SRamkumar Ramachandra  %res = or i64 %iv.ashr, 1023
204f25b0919SRamkumar Ramachandra  ret i64 %res
205f25b0919SRamkumar Ramachandra}
206f25b0919SRamkumar Ramachandra
207f25b0919SRamkumar Ramachandradefine i64 @test_ashr_ones(i1 %c) {
208f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_ashr_ones(
209f25b0919SRamkumar Ramachandra; CHECK-NEXT:  entry:
210f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br label [[LOOP:%.*]]
211f25b0919SRamkumar Ramachandra; CHECK:       loop:
212f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
213f25b0919SRamkumar Ramachandra; CHECK:       exit:
214f25b0919SRamkumar Ramachandra; CHECK-NEXT:    ret i64 -1
215f25b0919SRamkumar Ramachandra;
216f25b0919SRamkumar Ramachandraentry:
217f25b0919SRamkumar Ramachandra  br label %loop
218f25b0919SRamkumar Ramachandraloop:
219f25b0919SRamkumar Ramachandra  %iv.ashr = phi i64 [-1023, %entry], [%iv.ashr.next, %loop]
220f25b0919SRamkumar Ramachandra  %iv.ashr.next = ashr i64 %iv.ashr, 1
221f25b0919SRamkumar Ramachandra  br i1 %c, label %exit, label %loop
222f25b0919SRamkumar Ramachandraexit:
223f25b0919SRamkumar Ramachandra  %res = or i64 %iv.ashr, 1023
224f25b0919SRamkumar Ramachandra  ret i64 %res
225f25b0919SRamkumar Ramachandra}
226f25b0919SRamkumar Ramachandra
227f25b0919SRamkumar Ramachandra; Same as previous, but swapped operands to phi
228f25b0919SRamkumar Ramachandradefine i64 @test_ashr_ones2(i1 %c) {
229f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_ashr_ones2(
230f25b0919SRamkumar Ramachandra; CHECK-NEXT:  entry:
231f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br label [[LOOP:%.*]]
232f25b0919SRamkumar Ramachandra; CHECK:       loop:
233f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
234f25b0919SRamkumar Ramachandra; CHECK:       exit:
235f25b0919SRamkumar Ramachandra; CHECK-NEXT:    ret i64 -1
236f25b0919SRamkumar Ramachandra;
237f25b0919SRamkumar Ramachandraentry:
238f25b0919SRamkumar Ramachandra  br label %loop
239f25b0919SRamkumar Ramachandraloop:
240f25b0919SRamkumar Ramachandra  %iv.ashr = phi i64 [%iv.ashr.next, %loop], [-1023, %entry]
241f25b0919SRamkumar Ramachandra  %iv.ashr.next = ashr i64 %iv.ashr, 1
242f25b0919SRamkumar Ramachandra  br i1 %c, label %exit, label %loop
243f25b0919SRamkumar Ramachandraexit:
244f25b0919SRamkumar Ramachandra  %res = or i64 %iv.ashr, 1023
245f25b0919SRamkumar Ramachandra  ret i64 %res
246f25b0919SRamkumar Ramachandra}
247f25b0919SRamkumar Ramachandra
248f25b0919SRamkumar Ramachandra
249f25b0919SRamkumar Ramachandra; negative case for when start is unknown
250f25b0919SRamkumar Ramachandradefine i64 @test_ashr_unknown(i1 %c, i64 %start) {
251f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_ashr_unknown(
252f25b0919SRamkumar Ramachandra; CHECK-NEXT:  entry:
253f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br label [[LOOP:%.*]]
254f25b0919SRamkumar Ramachandra; CHECK:       loop:
255f25b0919SRamkumar Ramachandra; CHECK-NEXT:    [[IV_ASHR:%.*]] = phi i64 [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[IV_ASHR_NEXT:%.*]], [[LOOP]] ]
256f25b0919SRamkumar Ramachandra; CHECK-NEXT:    [[IV_ASHR_NEXT]] = ashr i64 [[IV_ASHR]], 1
257f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
258f25b0919SRamkumar Ramachandra; CHECK:       exit:
259f25b0919SRamkumar Ramachandra; CHECK-NEXT:    [[RES:%.*]] = or i64 [[IV_ASHR]], 1023
260f25b0919SRamkumar Ramachandra; CHECK-NEXT:    ret i64 [[RES]]
261f25b0919SRamkumar Ramachandra;
262f25b0919SRamkumar Ramachandraentry:
263f25b0919SRamkumar Ramachandra  br label %loop
264f25b0919SRamkumar Ramachandraloop:
265f25b0919SRamkumar Ramachandra  %iv.ashr = phi i64 [%start, %entry], [%iv.ashr.next, %loop]
266f25b0919SRamkumar Ramachandra  %iv.ashr.next = ashr i64 %iv.ashr, 1
267f25b0919SRamkumar Ramachandra  br i1 %c, label %exit, label %loop
268f25b0919SRamkumar Ramachandraexit:
269f25b0919SRamkumar Ramachandra  %res = or i64 %iv.ashr, 1023
270f25b0919SRamkumar Ramachandra  ret i64 %res
271f25b0919SRamkumar Ramachandra}
272f25b0919SRamkumar Ramachandra
273f25b0919SRamkumar Ramachandra; Negative case where we don't have a (shift) recurrence because the operands
274f25b0919SRamkumar Ramachandra; of the ashr are swapped.  (This does end up being a divide recurrence.)
275f25b0919SRamkumar Ramachandradefine i64 @test_ashr_wrong_op(i1 %c, i64 %start) {
276f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_ashr_wrong_op(
277f25b0919SRamkumar Ramachandra; CHECK-NEXT:  entry:
278f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br label [[LOOP:%.*]]
279f25b0919SRamkumar Ramachandra; CHECK:       loop:
280f25b0919SRamkumar Ramachandra; CHECK-NEXT:    [[IV_ASHR:%.*]] = phi i64 [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[IV_ASHR_NEXT:%.*]], [[LOOP]] ]
281f25b0919SRamkumar Ramachandra; CHECK-NEXT:    [[IV_ASHR_NEXT]] = lshr i64 1, [[IV_ASHR]]
282f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
283f25b0919SRamkumar Ramachandra; CHECK:       exit:
284f25b0919SRamkumar Ramachandra; CHECK-NEXT:    [[RES:%.*]] = or i64 [[IV_ASHR]], 1023
285f25b0919SRamkumar Ramachandra; CHECK-NEXT:    ret i64 [[RES]]
286f25b0919SRamkumar Ramachandra;
287f25b0919SRamkumar Ramachandraentry:
288f25b0919SRamkumar Ramachandra  br label %loop
289f25b0919SRamkumar Ramachandraloop:
290f25b0919SRamkumar Ramachandra  %iv.ashr = phi i64 [%start, %entry], [%iv.ashr.next, %loop]
291f25b0919SRamkumar Ramachandra  %iv.ashr.next = ashr i64 1, %iv.ashr
292f25b0919SRamkumar Ramachandra  br i1 %c, label %exit, label %loop
293f25b0919SRamkumar Ramachandraexit:
294f25b0919SRamkumar Ramachandra  %res = or i64 %iv.ashr, 1023
295f25b0919SRamkumar Ramachandra  ret i64 %res
296f25b0919SRamkumar Ramachandra}
297f25b0919SRamkumar Ramachandra
298f25b0919SRamkumar Ramachandra
299f25b0919SRamkumar Ramachandradefine i64 @test_shl(i1 %c) {
300f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_shl(
301f25b0919SRamkumar Ramachandra; CHECK-NEXT:  entry:
302f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br label [[LOOP:%.*]]
303f25b0919SRamkumar Ramachandra; CHECK:       loop:
304f25b0919SRamkumar Ramachandra; CHECK-NEXT:    br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]
305f25b0919SRamkumar Ramachandra; CHECK:       exit:
306f25b0919SRamkumar Ramachandra; CHECK-NEXT:    ret i64 0
307f25b0919SRamkumar Ramachandra;
308f25b0919SRamkumar Ramachandraentry:
309f25b0919SRamkumar Ramachandra  br label %loop
310f25b0919SRamkumar Ramachandraloop:
311f25b0919SRamkumar Ramachandra  %iv.shl = phi i64 [8, %entry], [%iv.shl.next, %loop]
312f25b0919SRamkumar Ramachandra  %iv.shl.next = shl i64 %iv.shl, 1
313f25b0919SRamkumar Ramachandra  br i1 %c, label %exit, label %loop
314f25b0919SRamkumar Ramachandraexit:
315f25b0919SRamkumar Ramachandra  %res = and i64 %iv.shl, 7
316f25b0919SRamkumar Ramachandra  ret i64 %res
317f25b0919SRamkumar Ramachandra}
318