Skip to content

Commit 2947c0a

Browse files
committed
[LVI] Add trunc to i1 handling.
1 parent f8ab91f commit 2947c0a

File tree

2 files changed

+23
-56
lines changed

2 files changed

+23
-56
lines changed

llvm/lib/Analysis/LazyValueInfo.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,8 @@ class LazyValueInfoImpl {
398398
std::optional<ValueLatticeElement>
399399
getValueFromICmpCondition(Value *Val, ICmpInst *ICI, bool isTrueDest,
400400
bool UseBlockValue);
401+
std::optional<ValueLatticeElement>
402+
getValueFromTrunc(Value *Val, TruncInst *Trunc, bool IsTrueDest);
401403

402404
std::optional<ValueLatticeElement>
403405
getValueFromCondition(Value *Val, Value *Cond, bool IsTrueDest,
@@ -1283,6 +1285,20 @@ std::optional<ValueLatticeElement> LazyValueInfoImpl::getValueFromICmpCondition(
12831285
return ValueLatticeElement::getOverdefined();
12841286
}
12851287

1288+
std::optional<ValueLatticeElement>
1289+
LazyValueInfoImpl::getValueFromTrunc(Value *Val, TruncInst *Trunc,
1290+
bool IsTrueDest) {
1291+
assert(Trunc->getType()->isIntegerTy(1));
1292+
1293+
Type *Ty = Val->getType();
1294+
if (!Ty->isIntegerTy() || Trunc->getOperand(0) != Val)
1295+
return ValueLatticeElement::getOverdefined();
1296+
1297+
if (IsTrueDest)
1298+
return ValueLatticeElement::getNot(Constant::getNullValue(Ty));
1299+
return ValueLatticeElement::getNot(Constant::getAllOnesValue(Ty));
1300+
}
1301+
12861302
// Handle conditions of the form
12871303
// extractvalue(op.with.overflow(%x, C), 1).
12881304
static ValueLatticeElement getValueFromOverflowCondition(
@@ -1312,6 +1328,9 @@ LazyValueInfoImpl::getValueFromCondition(Value *Val, Value *Cond,
13121328
if (ICmpInst *ICI = dyn_cast<ICmpInst>(Cond))
13131329
return getValueFromICmpCondition(Val, ICI, IsTrueDest, UseBlockValue);
13141330

1331+
if (auto *Trunc = dyn_cast<TruncInst>(Cond))
1332+
return getValueFromTrunc(Val, Trunc, IsTrueDest);
1333+
13151334
if (auto *EVI = dyn_cast<ExtractValueInst>(Cond))
13161335
if (auto *WO = dyn_cast<WithOverflowInst>(EVI->getAggregateOperand()))
13171336
if (EVI->getNumIndices() == 1 && *EVI->idx_begin() == 1)

llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll

Lines changed: 4 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1515,10 +1515,8 @@ define void @test_trunc_bittest(i8 %a) {
15151515
; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[A:%.*]] to i1
15161516
; CHECK-NEXT: br i1 [[TRUNC]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
15171517
; CHECK: if.true:
1518-
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i8 [[A]], 0
1519-
; CHECK-NEXT: call void @check1(i1 [[CMP1]])
1520-
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[A]], 0
1521-
; CHECK-NEXT: call void @check1(i1 [[CMP2]])
1518+
; CHECK-NEXT: call void @check1(i1 true)
1519+
; CHECK-NEXT: call void @check1(i1 false)
15221520
; CHECK-NEXT: ret void
15231521
; CHECK: if.false:
15241522
; CHECK-NEXT: ret void
@@ -1543,10 +1541,8 @@ define void @test_trunc_not_bittest(i8 %a) {
15431541
; CHECK-NEXT: [[NOT:%.*]] = xor i1 [[TRUNC]], true
15441542
; CHECK-NEXT: br i1 [[NOT]], label [[IF_FALSE:%.*]], label [[IF_TRUE:%.*]]
15451543
; CHECK: if.true:
1546-
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i8 [[A]], -1
1547-
; CHECK-NEXT: call void @check1(i1 [[CMP1]])
1548-
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[A]], -1
1549-
; CHECK-NEXT: call void @check1(i1 [[CMP2]])
1544+
; CHECK-NEXT: call void @check1(i1 true)
1545+
; CHECK-NEXT: call void @check1(i1 false)
15501546
; CHECK-NEXT: ret void
15511547
; CHECK: if.false:
15521548
; CHECK-NEXT: ret void
@@ -1565,51 +1561,3 @@ if.true:
15651561
if.false:
15661562
ret void
15671563
}
1568-
1569-
define void @test_icmp_trunc(i8 %a) {
1570-
; CHECK-LABEL: @test_icmp_trunc(
1571-
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i8 [[A:%.*]], 0
1572-
; CHECK-NEXT: br i1 [[CMP1]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
1573-
; CHECK: if.true:
1574-
; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[A]] to i1
1575-
; CHECK-NEXT: call void @check1(i1 [[TRUNC]])
1576-
; CHECK-NEXT: ret void
1577-
; CHECK: if.false:
1578-
; CHECK-NEXT: ret void
1579-
;
1580-
%cmp1 = icmp ne i8 %a, 0
1581-
br i1 %cmp1, label %if.true, label %if.false
1582-
1583-
if.true:
1584-
%trunc = trunc i8 %a to i1
1585-
call void @check1(i1 %trunc)
1586-
ret void
1587-
1588-
if.false:
1589-
ret void
1590-
}
1591-
1592-
define void @test_icmp_trunc_not(i8 %a) {
1593-
; CHECK-LABEL: @test_icmp_trunc_not(
1594-
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A:%.*]], -1
1595-
; CHECK-NEXT: br i1 [[CMP1]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
1596-
; CHECK: if.true:
1597-
; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[A]] to i1
1598-
; CHECK-NEXT: [[NOT:%.*]] = xor i1 [[TRUNC]], true
1599-
; CHECK-NEXT: call void @check1(i1 [[TRUNC]])
1600-
; CHECK-NEXT: ret void
1601-
; CHECK: if.false:
1602-
; CHECK-NEXT: ret void
1603-
;
1604-
%cmp1 = icmp eq i8 %a, -1
1605-
br i1 %cmp1, label %if.true, label %if.false
1606-
1607-
if.true:
1608-
%trunc = trunc i8 %a to i1
1609-
%not = xor i1 %trunc, true
1610-
call void @check1(i1 %trunc)
1611-
ret void
1612-
1613-
if.false:
1614-
ret void
1615-
}

0 commit comments

Comments
 (0)