Skip to content

Commit a684f10

Browse files
committed
[ValueTracking] Handle trunc to i1 as condition in dominating condition.
1 parent 5ecc86b commit a684f10

File tree

2 files changed

+29
-20
lines changed

2 files changed

+29
-20
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -801,6 +801,22 @@ static void computeKnownBitsFromCond(const Value *V, Value *Cond,
801801

802802
if (auto *Cmp = dyn_cast<ICmpInst>(Cond))
803803
computeKnownBitsFromICmpCond(V, Cmp, Known, SQ, Invert);
804+
805+
if (match(Cond, m_Not(m_Value(Cond))))
806+
Invert = !Invert;
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+
else
818+
Known = Known.unionWith(DstKnown.anyext(Known.getBitWidth()));
819+
}
804820
}
805821

806822
void llvm::computeKnownBitsFromContext(const Value *V, KnownBits &Known,
@@ -10272,6 +10288,9 @@ void llvm::findValuesAffectedByCondition(
1027210288
m_Value()))) {
1027310289
// Handle patterns that computeKnownFPClass() support.
1027410290
AddAffected(A);
10291+
} else if (!IsAssume && match(V, m_CombineOr(m_Trunc(m_Value(X)),
10292+
m_Not(m_Trunc(m_Value(X)))))) {
10293+
AddAffected(X);
1027510294
}
1027610295
}
1027710296
}

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

Lines changed: 10 additions & 20 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

0 commit comments

Comments
 (0)