forked from OSchip/llvm-project
[InstCombine] Call getCmpPredicateForMinMax only with a valid SPF
Summary: There are `SelectPatternFlavor`s that don't represent min or max idioms, and we should not be passing those to `getCmpPredicateForMinMax`. Fixes PR25745. Reviewers: majnemer Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D15249 llvm-svn: 254869
This commit is contained in:
parent
e66b73fb0c
commit
9fe86d90ab
|
@ -412,6 +412,11 @@ namespace llvm {
|
||||||
bool Ordered; /// When implementing this min/max pattern as
|
bool Ordered; /// When implementing this min/max pattern as
|
||||||
/// fcmp; select, does the fcmp have to be
|
/// fcmp; select, does the fcmp have to be
|
||||||
/// ordered?
|
/// ordered?
|
||||||
|
|
||||||
|
/// \brief Return true if \p SPF is a min or a max pattern.
|
||||||
|
static bool isMinOrMax(SelectPatternFlavor SPF) {
|
||||||
|
return !(SPF == SPF_UNKNOWN || SPF == SPF_ABS || SPF == SPF_NABS);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
/// Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind
|
/// Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind
|
||||||
/// and providing the out parameter results if we successfully match.
|
/// and providing the out parameter results if we successfully match.
|
||||||
|
|
|
@ -1070,7 +1070,7 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) {
|
||||||
SelectPatternResult SPR = matchSelectPattern(&SI, LHS, RHS, &CastOp);
|
SelectPatternResult SPR = matchSelectPattern(&SI, LHS, RHS, &CastOp);
|
||||||
auto SPF = SPR.Flavor;
|
auto SPF = SPR.Flavor;
|
||||||
|
|
||||||
if (SPF) {
|
if (SelectPatternResult::isMinOrMax(SPF)) {
|
||||||
// Canonicalize so that type casts are outside select patterns.
|
// Canonicalize so that type casts are outside select patterns.
|
||||||
if (LHS->getType()->getPrimitiveSizeInBits() !=
|
if (LHS->getType()->getPrimitiveSizeInBits() !=
|
||||||
SI.getType()->getPrimitiveSizeInBits()) {
|
SI.getType()->getPrimitiveSizeInBits()) {
|
||||||
|
@ -1091,11 +1091,15 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) {
|
||||||
SI.getType());
|
SI.getType());
|
||||||
return ReplaceInstUsesWith(SI, NewSI);
|
return ReplaceInstUsesWith(SI, NewSI);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SPF) {
|
||||||
// MAX(MAX(a, b), a) -> MAX(a, b)
|
// MAX(MAX(a, b), a) -> MAX(a, b)
|
||||||
// MIN(MIN(a, b), a) -> MIN(a, b)
|
// MIN(MIN(a, b), a) -> MIN(a, b)
|
||||||
// MAX(MIN(a, b), a) -> a
|
// MAX(MIN(a, b), a) -> a
|
||||||
// MIN(MAX(a, b), a) -> a
|
// MIN(MAX(a, b), a) -> a
|
||||||
|
// ABS(ABS(a)) -> ABS(a)
|
||||||
|
// NABS(NABS(a)) -> NABS(a)
|
||||||
if (SelectPatternFlavor SPF2 = matchSelectPattern(LHS, LHS2, RHS2).Flavor)
|
if (SelectPatternFlavor SPF2 = matchSelectPattern(LHS, LHS2, RHS2).Flavor)
|
||||||
if (Instruction *R = FoldSPFofSPF(cast<Instruction>(LHS),SPF2,LHS2,RHS2,
|
if (Instruction *R = FoldSPFofSPF(cast<Instruction>(LHS),SPF2,LHS2,RHS2,
|
||||||
SI, SPF, RHS))
|
SI, SPF, RHS))
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
; RUN: opt -S -instcombine < %s | FileCheck %s
|
||||||
|
|
||||||
|
; Checking for a crash
|
||||||
|
|
||||||
|
declare void @use.i1(i1 %val)
|
||||||
|
declare void @use.i64(i64 %val)
|
||||||
|
|
||||||
|
define i64 @f(i32 %x) {
|
||||||
|
; CHECK-LABEL: @f(
|
||||||
|
entry:
|
||||||
|
%x.wide = sext i32 %x to i64
|
||||||
|
%minus.x = sub i32 0, %x
|
||||||
|
%minus.x.wide = sext i32 %minus.x to i64
|
||||||
|
%c = icmp slt i32 %x, 0
|
||||||
|
%val = select i1 %c, i64 %x.wide, i64 %minus.x.wide
|
||||||
|
call void @use.i1(i1 %c)
|
||||||
|
call void @use.i64(i64 %x.wide)
|
||||||
|
ret i64 %val
|
||||||
|
; CHECK: ret i64 %val
|
||||||
|
}
|
Loading…
Reference in New Issue