@@ -6,12 +6,9 @@ define i64 @test_lshr() {
6
6
; CHECK-NEXT: entry:
7
7
; CHECK-NEXT: br label [[LOOP:%.*]]
8
8
; CHECK: loop:
9
- ; CHECK-NEXT: [[IV_LSHR:%.*]] = phi i64 [ 1023, [[ENTRY:%.*]] ], [ [[IV_LSHR_NEXT:%.*]], [[LOOP]] ]
10
- ; CHECK-NEXT: [[IV_LSHR_NEXT]] = lshr i64 [[IV_LSHR]], 1
11
9
; CHECK-NEXT: br i1 undef, label [[EXIT:%.*]], label [[LOOP]]
12
10
; CHECK: exit:
13
- ; CHECK-NEXT: [[RES:%.*]] = or i64 [[IV_LSHR]], 1023
14
- ; CHECK-NEXT: ret i64 [[RES]]
11
+ ; CHECK-NEXT: ret i64 1023
15
12
;
16
13
entry:
17
14
br label %loop
@@ -29,12 +26,9 @@ define i64 @test_ashr_zeros() {
29
26
; CHECK-NEXT: entry:
30
27
; CHECK-NEXT: br label [[LOOP:%.*]]
31
28
; CHECK: loop:
32
- ; CHECK-NEXT: [[IV_ASHR:%.*]] = phi i64 [ 1023, [[ENTRY:%.*]] ], [ [[IV_ASHR_NEXT:%.*]], [[LOOP]] ]
33
- ; CHECK-NEXT: [[IV_ASHR_NEXT]] = ashr i64 [[IV_ASHR]], 1
34
29
; CHECK-NEXT: br i1 undef, label [[EXIT:%.*]], label [[LOOP]]
35
30
; CHECK: exit:
36
- ; CHECK-NEXT: [[RES:%.*]] = or i64 [[IV_ASHR]], 1023
37
- ; CHECK-NEXT: ret i64 [[RES]]
31
+ ; CHECK-NEXT: ret i64 1023
38
32
;
39
33
entry:
40
34
br label %loop
@@ -52,12 +46,9 @@ define i64 @test_ashr_ones() {
52
46
; CHECK-NEXT: entry:
53
47
; CHECK-NEXT: br label [[LOOP:%.*]]
54
48
; CHECK: loop:
55
- ; CHECK-NEXT: [[IV_ASHR:%.*]] = phi i64 [ -1023, [[ENTRY:%.*]] ], [ [[IV_ASHR_NEXT:%.*]], [[LOOP]] ]
56
- ; CHECK-NEXT: [[IV_ASHR_NEXT]] = ashr i64 [[IV_ASHR]], 1
57
49
; CHECK-NEXT: br i1 undef, label [[EXIT:%.*]], label [[LOOP]]
58
50
; CHECK: exit:
59
- ; CHECK-NEXT: [[RES:%.*]] = or i64 [[IV_ASHR]], 1023
60
- ; CHECK-NEXT: ret i64 [[RES]]
51
+ ; CHECK-NEXT: ret i64 -1
61
52
;
62
53
entry:
63
54
br label %loop
70
61
ret i64 %res
71
62
}
72
63
64
+ ; Same as previous, but swapped operands to phi
65
+ define i64 @test_ashr_ones2 () {
66
+ ; CHECK-LABEL: @test_ashr_ones2(
67
+ ; CHECK-NEXT: entry:
68
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
69
+ ; CHECK: loop:
70
+ ; CHECK-NEXT: br i1 undef, label [[EXIT:%.*]], label [[LOOP]]
71
+ ; CHECK: exit:
72
+ ; CHECK-NEXT: ret i64 -1
73
+ ;
74
+ entry:
75
+ br label %loop
76
+ loop:
77
+ %iv.ashr = phi i64 [%iv.ashr.next , %loop ], [-1023 , %entry ]
78
+ %iv.ashr.next = ashr i64 %iv.ashr , 1
79
+ br i1 undef , label %exit , label %loop
80
+ exit:
81
+ %res = or i64 %iv.ashr , 1023
82
+ ret i64 %res
83
+ }
84
+
85
+
73
86
; negative case for when start is unknown
74
87
define i64 @test_ashr_unknown (i64 %start ) {
75
88
; CHECK-LABEL: @test_ashr_unknown(
@@ -94,17 +107,40 @@ exit:
94
107
ret i64 %res
95
108
}
96
109
110
+ ; Negative case where we don't have a (shift) recurrence because the operands
111
+ ; of the ashr are swapped. (This does end up being a divide recurrence.)
112
+ define i64 @test_ashr_wrong_op (i64 %start ) {
113
+ ; CHECK-LABEL: @test_ashr_wrong_op(
114
+ ; CHECK-NEXT: entry:
115
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
116
+ ; CHECK: loop:
117
+ ; CHECK-NEXT: [[IV_ASHR:%.*]] = phi i64 [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[IV_ASHR_NEXT:%.*]], [[LOOP]] ]
118
+ ; CHECK-NEXT: [[IV_ASHR_NEXT]] = lshr i64 1, [[IV_ASHR]]
119
+ ; CHECK-NEXT: br i1 undef, label [[EXIT:%.*]], label [[LOOP]]
120
+ ; CHECK: exit:
121
+ ; CHECK-NEXT: [[RES:%.*]] = or i64 [[IV_ASHR]], 1023
122
+ ; CHECK-NEXT: ret i64 [[RES]]
123
+ ;
124
+ entry:
125
+ br label %loop
126
+ loop:
127
+ %iv.ashr = phi i64 [%start , %entry ], [%iv.ashr.next , %loop ]
128
+ %iv.ashr.next = ashr i64 1 , %iv.ashr
129
+ br i1 undef , label %exit , label %loop
130
+ exit:
131
+ %res = or i64 %iv.ashr , 1023
132
+ ret i64 %res
133
+ }
134
+
135
+
97
136
define i64 @test_shl () {
98
137
; CHECK-LABEL: @test_shl(
99
138
; CHECK-NEXT: entry:
100
139
; CHECK-NEXT: br label [[LOOP:%.*]]
101
140
; CHECK: loop:
102
- ; CHECK-NEXT: [[IV_SHL:%.*]] = phi i64 [ 8, [[ENTRY:%.*]] ], [ [[IV_SHL_NEXT:%.*]], [[LOOP]] ]
103
- ; CHECK-NEXT: [[IV_SHL_NEXT]] = shl i64 [[IV_SHL]], 1
104
141
; CHECK-NEXT: br i1 undef, label [[EXIT:%.*]], label [[LOOP]]
105
142
; CHECK: exit:
106
- ; CHECK-NEXT: [[RES:%.*]] = and i64 [[IV_SHL]], 6
107
- ; CHECK-NEXT: ret i64 [[RES]]
143
+ ; CHECK-NEXT: ret i64 0
108
144
;
109
145
entry:
110
146
br label %loop
0 commit comments