Skip to content

Commit 517ead0

Browse files
committed
[ConstraintElim] Simplify MinMaxIntrinsic
1 parent 2d35155 commit 517ead0

File tree

2 files changed

+37
-14
lines changed

2 files changed

+37
-14
lines changed

llvm/lib/Transforms/Scalar/ConstraintElimination.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,6 +1067,8 @@ void State::addInfoFor(BasicBlock &BB) {
10671067
case Intrinsic::smin:
10681068
case Intrinsic::smax:
10691069
WorkList.push_back(FactOrCheck::getInstFact(DT.getNode(&BB), &I));
1070+
WorkList.push_back(
1071+
FactOrCheck::getCheck(DT.getNode(&BB), cast<CallInst>(&I)));
10701072
break;
10711073
}
10721074

@@ -1392,6 +1394,31 @@ static bool checkAndReplaceCondition(
13921394
return false;
13931395
}
13941396

1397+
static bool checkAndReplaceMinMax(MinMaxIntrinsic *MinMax, ConstraintInfo &Info,
1398+
unsigned NumIn, unsigned NumOut,
1399+
Instruction *ContextInst, DominatorTree &DT,
1400+
SmallVectorImpl<Instruction *> &ToRemove) {
1401+
auto ReplaceMinMaxWithOperand = [&](MinMaxIntrinsic *MinMax, bool UseLHS) {
1402+
// TODO: generate reproducer for min/max.
1403+
MinMax->replaceAllUsesWith(MinMax->getOperand(UseLHS ? 0 : 1));
1404+
if (MinMax->use_empty())
1405+
ToRemove.push_back(MinMax);
1406+
return true;
1407+
};
1408+
1409+
ICmpInst::Predicate Pred =
1410+
ICmpInst::getNonStrictPredicate(MinMax->getPredicate());
1411+
if (auto ImpliedCondition =
1412+
checkCondition(Pred, MinMax->getOperand(0), MinMax->getOperand(1),
1413+
MinMax, Info, NumIn, NumOut, ContextInst))
1414+
return ReplaceMinMaxWithOperand(MinMax, *ImpliedCondition);
1415+
if (auto ImpliedCondition =
1416+
checkCondition(Pred, MinMax->getOperand(1), MinMax->getOperand(0),
1417+
MinMax, Info, NumIn, NumOut, ContextInst))
1418+
return ReplaceMinMaxWithOperand(MinMax, !*ImpliedCondition);
1419+
return false;
1420+
}
1421+
13951422
static void
13961423
removeEntryFromStack(const StackEntry &E, ConstraintInfo &Info,
13971424
Module *ReproducerModule,
@@ -1693,6 +1720,9 @@ static bool eliminateConstraints(Function &F, DominatorTree &DT, LoopInfo &LI,
16931720
ReproducerCondStack, DFSInStack);
16941721
}
16951722
Changed |= Simplified;
1723+
} else if (auto *MinMax = dyn_cast<MinMaxIntrinsic>(Inst)) {
1724+
Changed |= checkAndReplaceMinMax(MinMax, Info, CB.NumIn, CB.NumOut,
1725+
CB.getContextInst(), S.DT, ToRemove);
16961726
}
16971727
continue;
16981728
}

llvm/test/Transforms/ConstraintElimination/minmax.ll

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -350,8 +350,7 @@ define i32 @simplify_slt_smax_val(i32 %a, i32 %b) {
350350
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
351351
; CHECK: then:
352352
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
353-
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
354-
; CHECK-NEXT: ret i32 [[MAX]]
353+
; CHECK-NEXT: ret i32 [[B]]
355354
; CHECK: else:
356355
; CHECK-NEXT: ret i32 -1
357356
;
@@ -374,8 +373,7 @@ define i32 @simplify_slt_smax_val_commuted(i32 %a, i32 %b) {
374373
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
375374
; CHECK: then:
376375
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
377-
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[ADD]], i32 [[B]])
378-
; CHECK-NEXT: ret i32 [[MAX]]
376+
; CHECK-NEXT: ret i32 [[B]]
379377
; CHECK: else:
380378
; CHECK-NEXT: ret i32 -1
381379
;
@@ -422,8 +420,7 @@ define i32 @simplify_sgt_smax_val(i32 %a, i32 %b) {
422420
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
423421
; CHECK: then:
424422
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
425-
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
426-
; CHECK-NEXT: ret i32 [[MAX]]
423+
; CHECK-NEXT: ret i32 [[ADD]]
427424
; CHECK: else:
428425
; CHECK-NEXT: ret i32 -1
429426
;
@@ -470,8 +467,7 @@ define i32 @simplify_sge_smax_val(i32 %a, i32 %b) {
470467
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
471468
; CHECK: then:
472469
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
473-
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
474-
; CHECK-NEXT: ret i32 [[MAX]]
470+
; CHECK-NEXT: ret i32 [[ADD]]
475471
; CHECK: else:
476472
; CHECK-NEXT: ret i32 -1
477473
;
@@ -494,8 +490,7 @@ define i32 @simplify_ult_umax_val(i32 %a, i32 %b) {
494490
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
495491
; CHECK: then:
496492
; CHECK-NEXT: [[ADD:%.*]] = add nuw i32 [[A]], 1
497-
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.umax.i32(i32 [[B]], i32 [[ADD]])
498-
; CHECK-NEXT: ret i32 [[MAX]]
493+
; CHECK-NEXT: ret i32 [[B]]
499494
; CHECK: else:
500495
; CHECK-NEXT: ret i32 -1
501496
;
@@ -518,8 +513,7 @@ define i32 @simplify_slt_smin_val(i32 %a, i32 %b) {
518513
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
519514
; CHECK: then:
520515
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
521-
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smin.i32(i32 [[B]], i32 [[ADD]])
522-
; CHECK-NEXT: ret i32 [[MAX]]
516+
; CHECK-NEXT: ret i32 [[ADD]]
523517
; CHECK: else:
524518
; CHECK-NEXT: ret i32 -1
525519
;
@@ -542,8 +536,7 @@ define i32 @simplify_ult_umin_val(i32 %a, i32 %b) {
542536
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
543537
; CHECK: then:
544538
; CHECK-NEXT: [[ADD:%.*]] = add nuw i32 [[A]], 1
545-
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.umin.i32(i32 [[B]], i32 [[ADD]])
546-
; CHECK-NEXT: ret i32 [[MAX]]
539+
; CHECK-NEXT: ret i32 [[ADD]]
547540
; CHECK: else:
548541
; CHECK-NEXT: ret i32 -1
549542
;

0 commit comments

Comments
 (0)