Skip to content

Commit 944cef0

Browse files
committed
[ConstraintElim] Simplify MinMaxIntrinsic
1 parent 9b982f6 commit 944cef0

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
@@ -1072,6 +1072,8 @@ void State::addInfoFor(BasicBlock &BB) {
10721072
[[fallthrough]];
10731073
case Intrinsic::abs:
10741074
WorkList.push_back(FactOrCheck::getInstFact(DT.getNode(&BB), &I));
1075+
WorkList.push_back(
1076+
FactOrCheck::getCheck(DT.getNode(&BB), cast<CallInst>(&I)));
10751077
break;
10761078
}
10771079

@@ -1395,6 +1397,31 @@ static bool checkAndReplaceCondition(
13951397
return false;
13961398
}
13971399

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

llvm/test/Transforms/ConstraintElimination/minmax.ll

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -352,8 +352,7 @@ define i32 @simplify_slt_smax_val(i32 %a, i32 %b) {
352352
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
353353
; CHECK: then:
354354
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
355-
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
356-
; CHECK-NEXT: ret i32 [[MAX]]
355+
; CHECK-NEXT: ret i32 [[B]]
357356
; CHECK: else:
358357
; CHECK-NEXT: ret i32 -1
359358
;
@@ -376,8 +375,7 @@ define i32 @simplify_slt_smax_val_commuted(i32 %a, i32 %b) {
376375
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
377376
; CHECK: then:
378377
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
379-
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[ADD]], i32 [[B]])
380-
; CHECK-NEXT: ret i32 [[MAX]]
378+
; CHECK-NEXT: ret i32 [[B]]
381379
; CHECK: else:
382380
; CHECK-NEXT: ret i32 -1
383381
;
@@ -424,8 +422,7 @@ define i32 @simplify_sgt_smax_val(i32 %a, i32 %b) {
424422
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
425423
; CHECK: then:
426424
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
427-
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
428-
; CHECK-NEXT: ret i32 [[MAX]]
425+
; CHECK-NEXT: ret i32 [[ADD]]
429426
; CHECK: else:
430427
; CHECK-NEXT: ret i32 -1
431428
;
@@ -472,8 +469,7 @@ define i32 @simplify_sge_smax_val(i32 %a, i32 %b) {
472469
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
473470
; CHECK: then:
474471
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
475-
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[B]], i32 [[ADD]])
476-
; CHECK-NEXT: ret i32 [[MAX]]
472+
; CHECK-NEXT: ret i32 [[ADD]]
477473
; CHECK: else:
478474
; CHECK-NEXT: ret i32 -1
479475
;
@@ -496,8 +492,7 @@ define i32 @simplify_ult_umax_val(i32 %a, i32 %b) {
496492
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
497493
; CHECK: then:
498494
; CHECK-NEXT: [[ADD:%.*]] = add nuw i32 [[A]], 1
499-
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.umax.i32(i32 [[B]], i32 [[ADD]])
500-
; CHECK-NEXT: ret i32 [[MAX]]
495+
; CHECK-NEXT: ret i32 [[B]]
501496
; CHECK: else:
502497
; CHECK-NEXT: ret i32 -1
503498
;
@@ -520,8 +515,7 @@ define i32 @simplify_slt_smin_val(i32 %a, i32 %b) {
520515
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
521516
; CHECK: then:
522517
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 1
523-
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smin.i32(i32 [[B]], i32 [[ADD]])
524-
; CHECK-NEXT: ret i32 [[MAX]]
518+
; CHECK-NEXT: ret i32 [[ADD]]
525519
; CHECK: else:
526520
; CHECK-NEXT: ret i32 -1
527521
;
@@ -544,8 +538,7 @@ define i32 @simplify_ult_umin_val(i32 %a, i32 %b) {
544538
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
545539
; CHECK: then:
546540
; CHECK-NEXT: [[ADD:%.*]] = add nuw i32 [[A]], 1
547-
; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.umin.i32(i32 [[B]], i32 [[ADD]])
548-
; CHECK-NEXT: ret i32 [[MAX]]
541+
; CHECK-NEXT: ret i32 [[ADD]]
549542
; CHECK: else:
550543
; CHECK-NEXT: ret i32 -1
551544
;

0 commit comments

Comments
 (0)