@@ -138,3 +138,47 @@ define i1 @t2_commutativity(i8 %base, i8 %offset) {
138
138
%r = and i1 %null , %underflow
139
139
ret i1 %r
140
140
}
141
+
142
+ ; Overflow OR not zero => always true
143
+ define i1 @t3 (i8 %base , i8 %offset ) {
144
+ ; CHECK-LABEL: @t3(
145
+ ; CHECK-NEXT: [[ADJUSTED:%.*]] = sub i8 [[BASE:%.*]], [[OFFSET:%.*]]
146
+ ; CHECK-NEXT: call void @use8(i8 [[ADJUSTED]])
147
+ ; CHECK-NEXT: [[NO_UNDERFLOW:%.*]] = icmp ule i8 [[BASE]], [[OFFSET]]
148
+ ; CHECK-NEXT: call void @use1(i1 [[NO_UNDERFLOW]])
149
+ ; CHECK-NEXT: [[NOT_NULL:%.*]] = icmp ne i8 [[ADJUSTED]], 0
150
+ ; CHECK-NEXT: call void @use1(i1 [[NOT_NULL]])
151
+ ; CHECK-NEXT: [[R:%.*]] = or i1 [[NOT_NULL]], [[NO_UNDERFLOW]]
152
+ ; CHECK-NEXT: ret i1 [[R]]
153
+ ;
154
+ %adjusted = sub i8 %base , %offset
155
+ call void @use8 (i8 %adjusted )
156
+ %no_underflow = icmp ule i8 %base , %offset
157
+ call void @use1 (i1 %no_underflow )
158
+ %not_null = icmp ne i8 %adjusted , 0
159
+ call void @use1 (i1 %not_null )
160
+ %r = or i1 %not_null , %no_underflow
161
+ ret i1 %r
162
+ }
163
+
164
+ ; No overflow and zero => always false
165
+ define i1 @t4 (i8 %base , i8 %offset ) {
166
+ ; CHECK-LABEL: @t4(
167
+ ; CHECK-NEXT: [[ADJUSTED:%.*]] = sub i8 [[BASE:%.*]], [[OFFSET:%.*]]
168
+ ; CHECK-NEXT: call void @use8(i8 [[ADJUSTED]])
169
+ ; CHECK-NEXT: [[NO_UNDERFLOW:%.*]] = icmp ugt i8 [[BASE]], [[OFFSET]]
170
+ ; CHECK-NEXT: call void @use1(i1 [[NO_UNDERFLOW]])
171
+ ; CHECK-NEXT: [[NOT_NULL:%.*]] = icmp eq i8 [[ADJUSTED]], 0
172
+ ; CHECK-NEXT: call void @use1(i1 [[NOT_NULL]])
173
+ ; CHECK-NEXT: [[R:%.*]] = and i1 [[NOT_NULL]], [[NO_UNDERFLOW]]
174
+ ; CHECK-NEXT: ret i1 [[R]]
175
+ ;
176
+ %adjusted = sub i8 %base , %offset
177
+ call void @use8 (i8 %adjusted )
178
+ %no_underflow = icmp ugt i8 %base , %offset
179
+ call void @use1 (i1 %no_underflow )
180
+ %not_null = icmp eq i8 %adjusted , 0
181
+ call void @use1 (i1 %not_null )
182
+ %r = and i1 %not_null , %no_underflow
183
+ ret i1 %r
184
+ }
0 commit comments