@@ -90,3 +90,75 @@ define <2 x i1> @icmp_ugt_16x2(<2 x i32>) {
90
90
%d = icmp ugt <2 x i32 > %c , <i32 1048575 , i32 1048575 >
91
91
ret <2 x i1 > %d
92
92
}
93
+
94
+ define i1 @fold_icmp_shl_nuw_c1 (i32 %x ) {
95
+ ; CHECK-LABEL: @fold_icmp_shl_nuw_c1(
96
+ ; CHECK-NEXT: [[LSHR:%.*]] = lshr i32 [[X:%.*]], 12
97
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[LSHR]], 15
98
+ ; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i32 2, [[AND]]
99
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[SHL]], 4
100
+ ; CHECK-NEXT: ret i1 [[CMP]]
101
+ ;
102
+ %lshr = lshr i32 %x , 12
103
+ %and = and i32 %lshr , 15
104
+ %shl = shl nuw i32 2 , %and
105
+ %cmp = icmp ult i32 %shl , 4
106
+ ret i1 %cmp
107
+ }
108
+
109
+ define i1 @fold_icmp_shl_nuw_c2 (i32 %x ) {
110
+ ; CHECK-LABEL: @fold_icmp_shl_nuw_c2(
111
+ ; CHECK-NEXT: [[SHL:%.*]] = shl nuw i32 16, [[X:%.*]]
112
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[SHL]], 64
113
+ ; CHECK-NEXT: ret i1 [[CMP]]
114
+ ;
115
+ %shl = shl nuw i32 16 , %x
116
+ %cmp = icmp ult i32 %shl , 64
117
+ ret i1 %cmp
118
+ }
119
+
120
+ define i1 @fold_icmp_shl_nuw_c2_non_pow2 (i32 %x ) {
121
+ ; CHECK-LABEL: @fold_icmp_shl_nuw_c2_non_pow2(
122
+ ; CHECK-NEXT: [[SHL:%.*]] = shl nuw i32 48, [[X:%.*]]
123
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[SHL]], 192
124
+ ; CHECK-NEXT: ret i1 [[CMP]]
125
+ ;
126
+ %shl = shl nuw i32 48 , %x
127
+ %cmp = icmp ult i32 %shl , 192
128
+ ret i1 %cmp
129
+ }
130
+
131
+ define i1 @fold_icmp_shl_nuw_c2_div_non_pow2 (i32 %x ) {
132
+ ; CHECK-LABEL: @fold_icmp_shl_nuw_c2_div_non_pow2(
133
+ ; CHECK-NEXT: [[SHL:%.*]] = shl nuw i32 2, [[X:%.*]]
134
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[SHL]], 60
135
+ ; CHECK-NEXT: ret i1 [[CMP]]
136
+ ;
137
+ %shl = shl nuw i32 2 , %x
138
+ %cmp = icmp ult i32 %shl , 60
139
+ ret i1 %cmp
140
+ }
141
+
142
+ ; Negative tests
143
+
144
+ define i1 @fold_icmp_shl_nuw_c2_indivisible (i32 %x ) {
145
+ ; CHECK-LABEL: @fold_icmp_shl_nuw_c2_indivisible(
146
+ ; CHECK-NEXT: [[SHL:%.*]] = shl nuw i32 16, [[X:%.*]]
147
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[SHL]], 63
148
+ ; CHECK-NEXT: ret i1 [[CMP]]
149
+ ;
150
+ %shl = shl nuw i32 16 , %x
151
+ %cmp = icmp ult i32 %shl , 63
152
+ ret i1 %cmp
153
+ }
154
+
155
+ define i1 @fold_icmp_shl_c2_without_nuw (i32 %x ) {
156
+ ; CHECK-LABEL: @fold_icmp_shl_c2_without_nuw(
157
+ ; CHECK-NEXT: [[SHL:%.*]] = shl i32 16, [[X:%.*]]
158
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[SHL]], 64
159
+ ; CHECK-NEXT: ret i1 [[CMP]]
160
+ ;
161
+ %shl = shl i32 16 , %x
162
+ %cmp = icmp ult i32 %shl , 64
163
+ ret i1 %cmp
164
+ }
0 commit comments