Skip to content

Commit 8f3d2de

Browse files
committed
[ConstraintElim] Teach checkAndReplaceCondition about samesign
1 parent 71cf7d1 commit 8f3d2de

File tree

2 files changed

+10
-5
lines changed

2 files changed

+10
-5
lines changed

llvm/lib/Transforms/Scalar/ConstraintElimination.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1427,7 +1427,7 @@ static std::optional<bool> checkCondition(CmpInst::Predicate Pred, Value *A,
14271427
}
14281428

14291429
static bool checkAndReplaceCondition(
1430-
CmpInst *Cmp, ConstraintInfo &Info, unsigned NumIn, unsigned NumOut,
1430+
ICmpInst *Cmp, ConstraintInfo &Info, unsigned NumIn, unsigned NumOut,
14311431
Instruction *ContextInst, Module *ReproducerModule,
14321432
ArrayRef<ReproducerEntry> ReproducerCondStack, DominatorTree &DT,
14331433
SmallVectorImpl<Instruction *> &ToRemove) {
@@ -1460,6 +1460,13 @@ static bool checkAndReplaceCondition(
14601460
checkCondition(Cmp->getPredicate(), Cmp->getOperand(0),
14611461
Cmp->getOperand(1), Cmp, Info))
14621462
return ReplaceCmpWithConstant(Cmp, *ImpliedCondition);
1463+
1464+
if (Cmp->hasSameSign() && Cmp->isUnsigned())
1465+
if (auto ImpliedCondition =
1466+
checkCondition(Cmp->getSignedPredicate(), Cmp->getOperand(0),
1467+
Cmp->getOperand(1), Cmp, Info))
1468+
return ReplaceCmpWithConstant(Cmp, *ImpliedCondition);
1469+
14631470
return false;
14641471
}
14651472

llvm/test/Transforms/ConstraintElimination/transfer-samesign-facts.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -309,8 +309,7 @@ define i1 @implied_condition_sgt_ugt(i8 %a, i8 %b) {
309309
; CHECK-NEXT: [[CMP_SGT:%.*]] = icmp sgt i8 [[A:%.*]], [[B:%.*]]
310310
; CHECK-NEXT: br i1 [[CMP_SGT]], label [[GREATER:%.*]], label [[EXIT:%.*]]
311311
; CHECK: greater:
312-
; CHECK-NEXT: [[CMP_UGT:%.*]] = icmp samesign ugt i8 [[A]], [[B]]
313-
; CHECK-NEXT: ret i1 [[CMP_UGT]]
312+
; CHECK-NEXT: ret i1 true
314313
; CHECK: exit:
315314
; CHECK-NEXT: ret i1 false
316315
;
@@ -330,8 +329,7 @@ define i1 @implied_condition_sle_ule(i8 %a) {
330329
; CHECK-NEXT: [[CMP_SLE:%.*]] = icmp sle i8 [[A:%.*]], 42
331330
; CHECK-NEXT: br i1 [[CMP_SLE]], label [[LESS_OR_EQUAL:%.*]], label [[EXIT:%.*]]
332331
; CHECK: less_or_equal:
333-
; CHECK-NEXT: [[CMP_ULE:%.*]] = icmp samesign ule i8 [[A]], 42
334-
; CHECK-NEXT: ret i1 [[CMP_ULE]]
332+
; CHECK-NEXT: ret i1 true
335333
; CHECK: exit:
336334
; CHECK-NEXT: ret i1 false
337335
;

0 commit comments

Comments
 (0)