Skip to content

Commit 1840106

Browse files
authored
[SCCP] Add support for trunc nuw range. (llvm#152990)
proof: https://alive2.llvm.org/ce/z/_7PVxq
1 parent 33fe635 commit 1840106

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

llvm/lib/Transforms/Utils/SCCPSolver.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1442,8 +1442,12 @@ void SCCPInstVisitor::visitCastInst(CastInst &I) {
14421442
OpSt.asConstantRange(I.getSrcTy(), /*UndefAllowed=*/false);
14431443

14441444
Type *DestTy = I.getDestTy();
1445-
ConstantRange Res =
1446-
OpRange.castOp(I.getOpcode(), DestTy->getScalarSizeInBits());
1445+
ConstantRange Res = ConstantRange::getEmpty(DestTy->getScalarSizeInBits());
1446+
if (auto *Trunc = dyn_cast<TruncInst>(&I))
1447+
Res = OpRange.truncate(DestTy->getScalarSizeInBits(),
1448+
Trunc->getNoWrapKind());
1449+
else
1450+
Res = OpRange.castOp(I.getOpcode(), DestTy->getScalarSizeInBits());
14471451
mergeInValue(LV, &I, ValueLatticeElement::getRange(Res));
14481452
} else
14491453
markOverdefined(&I);

llvm/test/Transforms/SCCP/conditions-ranges.ll

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1436,6 +1436,47 @@ if.end:
14361436
ret i32 0
14371437
}
14381438

1439+
define void @trunc_nuw_i1_dominating_icmp_ne_0(i8 %x) {
1440+
; CHECK-LABEL: @trunc_nuw_i1_dominating_icmp_ne_0(
1441+
; CHECK-NEXT: [[ICMP:%.*]] = icmp ne i8 [[X:%.*]], 0
1442+
; CHECK-NEXT: br i1 [[ICMP]], label [[BB1:%.*]], label [[BB2:%.*]]
1443+
; CHECK: bb1:
1444+
; CHECK-NEXT: call void @use(i1 true)
1445+
; CHECK-NEXT: ret void
1446+
; CHECK: bb2:
1447+
; CHECK-NEXT: ret void
1448+
;
1449+
%icmp = icmp ne i8 %x, 0
1450+
br i1 %icmp, label %bb1, label %bb2
1451+
bb1:
1452+
%c1 = trunc nuw i8 %x to i1
1453+
call void @use(i1 %c1)
1454+
ret void
1455+
bb2:
1456+
ret void
1457+
}
1458+
1459+
define void @neg_trunc_i1_dominating_icmp_ne_0(i8 %x) {
1460+
; CHECK-LABEL: @neg_trunc_i1_dominating_icmp_ne_0(
1461+
; CHECK-NEXT: [[ICMP:%.*]] = icmp ne i8 [[X:%.*]], 0
1462+
; CHECK-NEXT: br i1 [[ICMP]], label [[BB1:%.*]], label [[BB2:%.*]]
1463+
; CHECK: bb1:
1464+
; CHECK-NEXT: [[C1:%.*]] = trunc i8 [[X]] to i1
1465+
; CHECK-NEXT: call void @use(i1 [[C1]])
1466+
; CHECK-NEXT: ret void
1467+
; CHECK: bb2:
1468+
; CHECK-NEXT: ret void
1469+
;
1470+
%icmp = icmp ne i8 %x, 0
1471+
br i1 %icmp, label %bb1, label %bb2
1472+
bb1:
1473+
%c1 = trunc i8 %x to i1
1474+
call void @use(i1 %c1)
1475+
ret void
1476+
bb2:
1477+
ret void
1478+
}
1479+
14391480
define i1 @ptr_icmp_data_layout() {
14401481
; CHECK-LABEL: @ptr_icmp_data_layout(
14411482
; CHECK-NEXT: ret i1 false

0 commit comments

Comments
 (0)