File tree Expand file tree Collapse file tree 2 files changed +36
-1
lines changed Expand file tree Collapse file tree 2 files changed +36
-1
lines changed Original file line number Diff line number Diff line change @@ -1486,7 +1486,13 @@ void SCCPInstVisitor::visitBinaryOperator(Instruction &I) {
1486
1486
// Try to simplify to a constant range.
1487
1487
ConstantRange A = getConstantRange (V1State, I.getType ());
1488
1488
ConstantRange B = getConstantRange (V2State, I.getType ());
1489
- ConstantRange R = A.binaryOp (cast<BinaryOperator>(&I)->getOpcode (), B);
1489
+
1490
+ auto *BO = cast<BinaryOperator>(&I);
1491
+ ConstantRange R = ConstantRange::getEmpty (I.getType ()->getScalarSizeInBits ());
1492
+ if (auto *OBO = dyn_cast<OverflowingBinaryOperator>(BO))
1493
+ R = A.overflowingBinaryOp (BO->getOpcode (), B, OBO->getNoWrapKind ());
1494
+ else
1495
+ R = A.binaryOp (BO->getOpcode (), B);
1490
1496
mergeInValue (&I, ValueLatticeElement::getRange (R));
1491
1497
1492
1498
// TODO: Currently we do not exploit special values that produce something
Original file line number Diff line number Diff line change @@ -240,3 +240,32 @@ then:
240
240
else:
241
241
ret i16 0
242
242
}
243
+
244
+ define i1 @test_add_nuw_sub (i32 %a ) {
245
+ ; CHECK-LABEL: @test_add_nuw_sub(
246
+ ; CHECK-NEXT: entry:
247
+ ; CHECK-NEXT: [[ADD:%.*]] = add nuw i32 [[A:%.*]], 10000
248
+ ; CHECK-NEXT: [[SUB:%.*]] = add i32 [[ADD]], -5000
249
+ ; CHECK-NEXT: ret i1 false
250
+ ;
251
+ entry:
252
+ %add = add nuw i32 %a , 10000
253
+ %sub = add i32 %add , -5000
254
+ %cond = icmp ult i32 %sub , 5000
255
+ ret i1 %cond
256
+ }
257
+
258
+ define i1 @test_add_nsw_sub (i32 %a ) {
259
+ ; CHECK-LABEL: @test_add_nsw_sub(
260
+ ; CHECK-NEXT: entry:
261
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A:%.*]], 10000
262
+ ; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[ADD]], -5000
263
+ ; CHECK-NEXT: [[COND:%.*]] = icmp ult i32 [[SUB]], 5000
264
+ ; CHECK-NEXT: ret i1 [[COND]]
265
+ ;
266
+ entry:
267
+ %add = add nsw i32 %a , 10000
268
+ %sub = add i32 %add , -5000
269
+ %cond = icmp ult i32 %sub , 5000
270
+ ret i1 %cond
271
+ }
You can’t perform that action at this time.
0 commit comments