Skip to content

Commit 9f4e642

Browse files
committed
Add additional facts
1 parent dd56b59 commit 9f4e642

File tree

3 files changed

+44
-40
lines changed

3 files changed

+44
-40
lines changed

llvm/lib/Transforms/Scalar/ConstraintElimination.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1605,6 +1605,30 @@ void ConstraintInfo::addFact(CmpInst::Predicate Pred, Value *A, Value *B,
16051605
unsigned NumIn, unsigned NumOut,
16061606
SmallVectorImpl<StackEntry> &DFSInStack) {
16071607
addFactImpl(Pred, A, B, NumIn, NumOut, DFSInStack, false);
1608+
1609+
Value *LHS;
1610+
Value *RHS;
1611+
if (match(A, m_Or(m_Value(LHS), m_Value(RHS)))) {
1612+
// (LHS | RHS >= 0) => LHS >= 0 && RHS >= 0
1613+
// (LHS | RHS > -1) => LHS >= 0 && RHS >= 0
1614+
if ((match(B, m_Zero()) && Pred == CmpInst::ICMP_SGE) ||
1615+
(match(B, m_AllOnes()) && Pred == CmpInst::ICMP_SGT)) {
1616+
addFact(CmpInst::ICMP_SGE, LHS, ConstantInt::get(LHS->getType(), 0),
1617+
NumIn, NumOut, DFSInStack);
1618+
addFact(CmpInst::ICMP_SGE, RHS, ConstantInt::get(RHS->getType(), 0),
1619+
NumIn, NumOut, DFSInStack);
1620+
}
1621+
} else if (match(A, m_And(m_Value(LHS), m_Value(RHS)))) {
1622+
// (LHS & RHS < 0) => LHS < 0 && RHS < 0
1623+
// (LHS & RHS <= -1) => LHS < 0 && RHS < 0
1624+
if ((match(B, m_Zero()) && Pred == CmpInst::ICMP_SLT) ||
1625+
(match(B, m_AllOnes()) && Pred == CmpInst::ICMP_SLE)) {
1626+
addFact(CmpInst::ICMP_SLT, LHS, ConstantInt::get(LHS->getType(), 0),
1627+
NumIn, NumOut, DFSInStack);
1628+
addFact(CmpInst::ICMP_SLT, RHS, ConstantInt::get(RHS->getType(), 0),
1629+
NumIn, NumOut, DFSInStack);
1630+
}
1631+
}
16081632
// If the Pred is eq/ne, also add the fact to signed system.
16091633
if (CmpInst::isEquality(Pred))
16101634
addFactImpl(Pred, A, B, NumIn, NumOut, DFSInStack, true);

llvm/test/Transforms/ConstraintElimination/and.ll

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -611,10 +611,8 @@ define void @test_decompose_bitwise_and(i4 %x, i4 %y) {
611611
; CHECK-NEXT: [[AND:%.*]] = icmp slt i4 [[TMP0]], 0
612612
; CHECK-NEXT: br i1 [[AND]], label [[BB1:%.*]], label [[EXIT:%.*]]
613613
; CHECK: bb1:
614-
; CHECK-NEXT: [[F_1:%.*]] = icmp slt i4 [[X]], 0
615-
; CHECK-NEXT: [[F_2:%.*]] = icmp slt i4 [[Y]], 0
616-
; CHECK-NEXT: call void @use(i1 [[F_1]])
617-
; CHECK-NEXT: call void @use(i1 [[F_2]])
614+
; CHECK-NEXT: call void @use(i1 true)
615+
; CHECK-NEXT: call void @use(i1 true)
618616
; CHECK-NEXT: ret void
619617
; CHECK: exit:
620618
; CHECK-NEXT: ret void
@@ -642,8 +640,7 @@ define i1 @test_decompose_bitwise_and2(i4 %x, i4 %y) {
642640
; CHECK-NEXT: [[AND_NOT:%.*]] = icmp sgt i4 [[TMP0]], -1
643641
; CHECK-NEXT: br i1 [[AND_NOT]], label [[END:%.*]], label [[THEN:%.*]]
644642
; CHECK: then:
645-
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i4 [[X]], 0
646-
; CHECK-NEXT: ret i1 [[CMP]]
643+
; CHECK-NEXT: ret i1 true
647644
; CHECK: end:
648645
; CHECK-NEXT: ret i1 false
649646
;
@@ -669,14 +666,10 @@ define void @test_decompose_nested_bitwise_and(i4 %x, i4 %y, i4 %z, i4 %w) {
669666
; CHECK-NEXT: [[AND:%.*]] = icmp slt i4 [[TMP2]], 0
670667
; CHECK-NEXT: br i1 [[AND]], label [[BB1:%.*]], label [[EXIT:%.*]]
671668
; CHECK: bb1:
672-
; CHECK-NEXT: [[F_4:%.*]] = icmp slt i4 [[X]], 0
673-
; CHECK-NEXT: [[F_5:%.*]] = icmp slt i4 [[Y]], 0
674-
; CHECK-NEXT: [[F_6:%.*]] = icmp slt i4 [[Z]], 0
675-
; CHECK-NEXT: [[F_7:%.*]] = icmp slt i4 [[W]], 0
676-
; CHECK-NEXT: call void @use(i1 [[F_4]])
677-
; CHECK-NEXT: call void @use(i1 [[F_5]])
678-
; CHECK-NEXT: call void @use(i1 [[F_6]])
679-
; CHECK-NEXT: call void @use(i1 [[F_7]])
669+
; CHECK-NEXT: call void @use(i1 true)
670+
; CHECK-NEXT: call void @use(i1 true)
671+
; CHECK-NEXT: call void @use(i1 true)
672+
; CHECK-NEXT: call void @use(i1 true)
680673
; CHECK-NEXT: ret void
681674
; CHECK: exit:
682675
; CHECK-NEXT: ret void
@@ -711,12 +704,9 @@ define void @test_decompose_nested_bitwise_and2(i4 %x, i4 %y, i4 %z) {
711704
; CHECK-NEXT: [[AND_2_NOT:%.*]] = icmp sgt i4 [[TMP1]], -1
712705
; CHECK-NEXT: br i1 [[AND_2_NOT]], label [[F:%.*]], label [[T:%.*]]
713706
; CHECK: t:
714-
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i4 [[X]], 0
715-
; CHECK-NEXT: call void @use(i1 [[CMP]])
716-
; CHECK-NEXT: [[CMP_2:%.*]] = icmp slt i4 [[Y]], 0
717-
; CHECK-NEXT: call void @use(i1 [[CMP_2]])
718-
; CHECK-NEXT: [[CMP_3:%.*]] = icmp slt i4 [[Z]], 0
719-
; CHECK-NEXT: call void @use(i1 [[CMP_3]])
707+
; CHECK-NEXT: call void @use(i1 true)
708+
; CHECK-NEXT: call void @use(i1 true)
709+
; CHECK-NEXT: call void @use(i1 true)
720710
; CHECK-NEXT: ret void
721711
; CHECK: f:
722712
; CHECK-NEXT: ret void

llvm/test/Transforms/ConstraintElimination/or.ll

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -818,10 +818,8 @@ define void @test_decompose_bitwise_or(i4 %x, i4 %y) {
818818
; CHECK: bb1:
819819
; CHECK-NEXT: ret void
820820
; CHECK: exit:
821-
; CHECK-NEXT: [[F_3:%.*]] = icmp sge i4 [[X]], 0
822-
; CHECK-NEXT: [[F_4:%.*]] = icmp sge i4 [[Y]], 0
823-
; CHECK-NEXT: call void @use(i1 [[F_3]])
824-
; CHECK-NEXT: call void @use(i1 [[F_4]])
821+
; CHECK-NEXT: call void @use(i1 true)
822+
; CHECK-NEXT: call void @use(i1 true)
825823
; CHECK-NEXT: ret void
826824
;
827825
entry:
@@ -849,8 +847,7 @@ define i1 @test_decompose_bitwise_or2(i4 %x, i4 %y) {
849847
; CHECK: then:
850848
; CHECK-NEXT: ret i1 false
851849
; CHECK: end:
852-
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i4 [[X]], -1
853-
; CHECK-NEXT: ret i1 [[CMP]]
850+
; CHECK-NEXT: ret i1 true
854851
;
855852
entry:
856853
%0 = or i4 %x, %y
@@ -876,14 +873,10 @@ define void @test_decompose_nested_bitwise_or(i4 %x, i4 %y, i4 %z, i4 %w) {
876873
; CHECK: bb1:
877874
; CHECK-NEXT: ret void
878875
; CHECK: exit:
879-
; CHECK-NEXT: [[F_4:%.*]] = icmp sge i4 [[X]], 0
880-
; CHECK-NEXT: [[F_5:%.*]] = icmp sge i4 [[Y]], 0
881-
; CHECK-NEXT: [[F_6:%.*]] = icmp sge i4 [[Z]], 0
882-
; CHECK-NEXT: [[F_7:%.*]] = icmp sge i4 [[W]], 0
883-
; CHECK-NEXT: call void @use(i1 [[F_4]])
884-
; CHECK-NEXT: call void @use(i1 [[F_5]])
885-
; CHECK-NEXT: call void @use(i1 [[F_6]])
886-
; CHECK-NEXT: call void @use(i1 [[F_7]])
876+
; CHECK-NEXT: call void @use(i1 true)
877+
; CHECK-NEXT: call void @use(i1 true)
878+
; CHECK-NEXT: call void @use(i1 true)
879+
; CHECK-NEXT: call void @use(i1 true)
887880
; CHECK-NEXT: ret void
888881
;
889882
entry:
@@ -918,12 +911,9 @@ define void @test_decompose_nested_bitwise_or2(i4 %x, i4 %y, i4 %z) {
918911
; CHECK: t:
919912
; CHECK-NEXT: ret void
920913
; CHECK: f:
921-
; CHECK-NEXT: [[CMP_1:%.*]] = icmp sgt i4 [[X]], -1
922-
; CHECK-NEXT: call void @use(i1 [[CMP_1]])
923-
; CHECK-NEXT: [[CMP_2:%.*]] = icmp sgt i4 [[Y]], -1
924-
; CHECK-NEXT: call void @use(i1 [[CMP_2]])
925-
; CHECK-NEXT: [[CMP_3:%.*]] = icmp sgt i4 [[Z]], -1
926-
; CHECK-NEXT: call void @use(i1 [[CMP_3]])
914+
; CHECK-NEXT: call void @use(i1 true)
915+
; CHECK-NEXT: call void @use(i1 true)
916+
; CHECK-NEXT: call void @use(i1 true)
927917
; CHECK-NEXT: ret void
928918
;
929919
entry:

0 commit comments

Comments
 (0)