Skip to content

Commit 167513c

Browse files
committed
[ValueTracking] Handle trunc to i1 as condition in dominating condition.
1 parent ced23aa commit 167513c

File tree

2 files changed

+35
-25
lines changed

2 files changed

+35
-25
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -797,10 +797,28 @@ static void computeKnownBitsFromCond(const Value *V, Value *Cond,
797797
else
798798
Known2 = Known2.intersectWith(Known3);
799799
Known = Known.unionWith(Known2);
800+
return;
800801
}
801802

802-
if (auto *Cmp = dyn_cast<ICmpInst>(Cond))
803+
if (auto *Cmp = dyn_cast<ICmpInst>(Cond)) {
803804
computeKnownBitsFromICmpCond(V, Cmp, Known, SQ, Invert);
805+
return;
806+
}
807+
808+
if (match(Cond, m_Trunc(m_Specific(V)))) {
809+
KnownBits DstKnown(1);
810+
if (Invert) {
811+
DstKnown.setAllZero();
812+
} else {
813+
DstKnown.setAllOnes();
814+
}
815+
if (cast<TruncInst>(Cond)->hasNoUnsignedWrap()) {
816+
Known = Known.unionWith(DstKnown.zext(Known.getBitWidth()));
817+
return;
818+
}
819+
Known = Known.unionWith(DstKnown.anyext(Known.getBitWidth()));
820+
return;
821+
}
804822

805823
if (Depth < MaxAnalysisRecursionDepth && match(Cond, m_Not(m_Value(A))))
806824
computeKnownBitsFromCond(V, A, Known, Depth + 1, SQ, !Invert);
@@ -10280,6 +10298,10 @@ void llvm::findValuesAffectedByCondition(
1028010298
m_Value()))) {
1028110299
// Handle patterns that computeKnownFPClass() support.
1028210300
AddAffected(A);
10301+
} else if (!IsAssume && match(V, m_Trunc(m_Value(X)))) {
10302+
// Assume is checked here as X is already added above for assumes in
10303+
// addValueAffectedByCondition
10304+
AddAffected(X);
1028310305
} else if (!IsAssume && match(V, m_Not(m_Value(X)))) {
1028410306
// Assume is checked here to avoid issues with ephemeral values
1028510307
Worklist.push_back(X);

llvm/test/Transforms/InstCombine/known-bits.ll

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2167,11 +2167,9 @@ define i8 @test_trunc_and_1(i8 %a) {
21672167
; CHECK-NEXT: [[CAST:%.*]] = trunc i8 [[A:%.*]] to i1
21682168
; CHECK-NEXT: br i1 [[CAST]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
21692169
; CHECK: if.then:
2170-
; CHECK-NEXT: [[B:%.*]] = and i8 [[A]], 1
2171-
; CHECK-NEXT: ret i8 [[B]]
2170+
; CHECK-NEXT: ret i8 1
21722171
; CHECK: if.else:
2173-
; CHECK-NEXT: [[C:%.*]] = and i8 [[A]], 1
2174-
; CHECK-NEXT: ret i8 [[C]]
2172+
; CHECK-NEXT: ret i8 0
21752173
;
21762174
entry:
21772175
%cast = trunc i8 %a to i1
@@ -2192,11 +2190,9 @@ define i8 @test_not_trunc_and_1(i8 %a) {
21922190
; CHECK-NEXT: [[CAST:%.*]] = trunc i8 [[A:%.*]] to i1
21932191
; CHECK-NEXT: br i1 [[CAST]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
21942192
; CHECK: if.then:
2195-
; CHECK-NEXT: [[B:%.*]] = and i8 [[A]], 1
2196-
; CHECK-NEXT: ret i8 [[B]]
2193+
; CHECK-NEXT: ret i8 0
21972194
; CHECK: if.else:
2198-
; CHECK-NEXT: [[C:%.*]] = and i8 [[A]], 1
2199-
; CHECK-NEXT: ret i8 [[C]]
2195+
; CHECK-NEXT: ret i8 1
22002196
;
22012197
entry:
22022198
%cast = trunc i8 %a to i1
@@ -2243,11 +2239,9 @@ define i8 @test_trunc_nuw_and_1(i8 %a) {
22432239
; CHECK-NEXT: [[CAST:%.*]] = trunc nuw i8 [[A:%.*]] to i1
22442240
; CHECK-NEXT: br i1 [[CAST]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
22452241
; CHECK: if.then:
2246-
; CHECK-NEXT: [[B:%.*]] = and i8 [[A]], 1
2247-
; CHECK-NEXT: ret i8 [[B]]
2242+
; CHECK-NEXT: ret i8 0
22482243
; CHECK: if.else:
2249-
; CHECK-NEXT: [[C:%.*]] = and i8 [[A]], 1
2250-
; CHECK-NEXT: ret i8 [[C]]
2244+
; CHECK-NEXT: ret i8 1
22512245
;
22522246
entry:
22532247
%cast = trunc nuw i8 %a to i1
@@ -2268,11 +2262,9 @@ define i8 @test_trunc_nuw_or_2(i8 %a) {
22682262
; CHECK-NEXT: [[CAST:%.*]] = trunc nuw i8 [[A:%.*]] to i1
22692263
; CHECK-NEXT: br i1 [[CAST]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
22702264
; CHECK: if.then:
2271-
; CHECK-NEXT: [[B:%.*]] = or i8 [[A]], 2
2272-
; CHECK-NEXT: ret i8 [[B]]
2265+
; CHECK-NEXT: ret i8 2
22732266
; CHECK: if.else:
2274-
; CHECK-NEXT: [[C:%.*]] = or i8 [[A]], 2
2275-
; CHECK-NEXT: ret i8 [[C]]
2267+
; CHECK-NEXT: ret i8 3
22762268
;
22772269
entry:
22782270
%cast = trunc nuw i8 %a to i1
@@ -2293,11 +2285,9 @@ define i8 @test_not_trunc_nuw_and_1(i8 %a) {
22932285
; CHECK-NEXT: [[CAST:%.*]] = trunc nuw i8 [[A:%.*]] to i1
22942286
; CHECK-NEXT: br i1 [[CAST]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
22952287
; CHECK: if.then:
2296-
; CHECK-NEXT: [[B:%.*]] = and i8 [[A]], 1
2297-
; CHECK-NEXT: ret i8 [[B]]
2288+
; CHECK-NEXT: ret i8 0
22982289
; CHECK: if.else:
2299-
; CHECK-NEXT: [[C:%.*]] = and i8 [[A]], 1
2300-
; CHECK-NEXT: ret i8 [[C]]
2290+
; CHECK-NEXT: ret i8 1
23012291
;
23022292
entry:
23032293
%cast = trunc nuw i8 %a to i1
@@ -2319,8 +2309,7 @@ define i8 @test_trunc_cond_and(i8 %x, i1 %c) {
23192309
; CHECK-NEXT: [[COND:%.*]] = and i1 [[C:%.*]], [[CMP]]
23202310
; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
23212311
; CHECK: if:
2322-
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -2
2323-
; CHECK-NEXT: ret i8 [[OR1]]
2312+
; CHECK-NEXT: ret i8 -1
23242313
; CHECK: exit:
23252314
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -2
23262315
; CHECK-NEXT: ret i8 [[OR2]]
@@ -2345,8 +2334,7 @@ define i8 @test_not_trunc_cond_and(i8 %x, i1 %c) {
23452334
; CHECK-NEXT: [[COND:%.*]] = and i1 [[C:%.*]], [[NOT]]
23462335
; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
23472336
; CHECK: if:
2348-
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -2
2349-
; CHECK-NEXT: ret i8 [[OR1]]
2337+
; CHECK-NEXT: ret i8 -2
23502338
; CHECK: exit:
23512339
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -2
23522340
; CHECK-NEXT: ret i8 [[OR2]]

0 commit comments

Comments
 (0)