[AVX512] adding PRORQ , PRORD , PRORLVQ and PRORLVD Intrinsics
[oota-llvm.git] / test / Analysis / ScalarEvolution / shift-op.ll
1 ; RUN: opt -analyze -scalar-evolution < %s | FileCheck %s
2
3 define void @test0(i32 %init) {
4 ; CHECK-LABEL: Classifying expressions for: @test0
5 ; CHECK: Loop %loop: max backedge-taken count is 32
6  entry:
7   br label %loop
8
9  loop:
10   %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
11   %iv.shift = lshr i32 %iv, 1
12   %exit.cond = icmp eq i32 %iv, 0
13   br i1 %exit.cond, label %leave, label %loop
14
15  leave:
16   ret void
17 }
18
19 define void @test1(i32 %init) {
20 ; CHECK-LABEL: Classifying expressions for: @test1
21 ; CHECK: Loop %loop: max backedge-taken count is 32
22  entry:
23   br label %loop
24
25  loop:
26   %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
27   %iv.shift = shl i32 %iv, 1
28   %exit.cond = icmp eq i32 %iv, 0
29   br i1 %exit.cond, label %leave, label %loop
30
31  leave:
32   ret void
33 }
34
35 define void @test2(i32 %init) {
36 ; CHECK-LABEL: Determining loop execution counts for: @test2
37 ; CHECK: Loop %loop: Unpredictable max backedge-taken count.
38
39 ; Unpredictable because %iv could "stabilize" to either -1 or 0,
40 ; depending on %init.
41  entry:
42   br label %loop
43
44  loop:
45   %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
46   %iv.shift = ashr i32 %iv, 1
47   %exit.cond = icmp eq i32 %iv, 0
48   br i1 %exit.cond, label %leave, label %loop
49
50  leave:
51   ret void
52 }
53
54 define void @test3(i32* %init.ptr) {
55 ; CHECK-LABEL: Determining loop execution counts for: @test3
56 ; CHECK: Loop %loop: max backedge-taken count is 32
57  entry:
58   %init = load i32, i32* %init.ptr, !range !0
59   br label %loop
60
61  loop:
62   %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
63   %iv.shift = ashr i32 %iv, 1
64   %exit.cond = icmp eq i32 %iv, 0
65   br i1 %exit.cond, label %leave, label %loop
66
67  leave:
68   ret void
69 }
70
71 define void @test4(i32* %init.ptr) {
72 ; CHECK-LABEL: Classifying expressions for: @test4
73 ; CHECK-LABEL: Loop %loop: max backedge-taken count is 32
74  entry:
75   %init = load i32, i32* %init.ptr, !range !1
76   br label %loop
77
78  loop:
79   %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
80   %iv.shift = ashr i32 %iv, 1
81   %exit.cond = icmp eq i32 %iv, -1
82   br i1 %exit.cond, label %leave, label %loop
83
84  leave:
85   ret void
86 }
87
88 define void @test5(i32* %init.ptr) {
89 ; CHECK-LABEL: Determining loop execution counts for: @test5
90 ; CHECK: Loop %loop: Unpredictable max backedge-taken count.
91
92 ; %iv will "stabilize" to -1, so this is an infinite loop
93  entry:
94   %init = load i32, i32* %init.ptr, !range !1
95   br label %loop
96
97  loop:
98   %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
99   %iv.shift = ashr i32 %iv, 1
100   %exit.cond = icmp eq i32 %iv, 0
101   br i1 %exit.cond, label %leave, label %loop
102
103  leave:
104   ret void
105 }
106
107 define void @test6(i32 %init, i32 %shift.amt) {
108 ; CHECK-LABEL: Determining loop execution counts for: @test6
109 ; CHECK: Loop %loop: Unpredictable max backedge-taken count.
110
111 ; Potentially infinite loop, since %shift.amt could be 0
112  entry:
113   br label %loop
114
115  loop:
116   %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
117   %iv.shift = lshr i32 %iv, %shift.amt
118   %exit.cond = icmp eq i32 %iv, 0
119   br i1 %exit.cond, label %leave, label %loop
120
121  leave:
122   ret void
123 }
124
125 define void @test7(i32 %init) {
126 ; CHECK-LABEL: Classifying expressions for: @test7
127 ; CHECK: Loop %loop: max backedge-taken count is 32
128
129  entry:
130   br label %loop
131
132  loop:
133   %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
134   %iv.shift = lshr i32 %iv, 1
135   %exit.cond = icmp eq i32 %iv.shift, 0
136   br i1 %exit.cond, label %leave, label %loop
137
138  leave:
139   ret void
140 }
141
142 define void @test8(i32 %init) {
143 ; CHECK-LABEL: Classifying expressions for: @test8
144 ; CHECK: Loop %loop: Unpredictable max backedge-taken count.
145
146 ; In this test case, %iv.test stabilizes to 127, not -1, so the loop
147 ; is infinite.
148
149  entry:
150   br label %loop
151
152  loop:
153   %iv = phi i32 [ %init, %entry ], [ %iv.shift, %loop ]
154   %iv.shift = ashr i32 %iv, 1
155   %iv.test = lshr i32 %iv, 1
156   %exit.cond = icmp eq i32 %iv.test, -1
157   br i1 %exit.cond, label %leave, label %loop
158
159  leave:
160   ret void
161 }
162
163 !0 = !{i32 0, i32 50000}
164 !1 = !{i32 -5000, i32 -1}