[PATCH] D15249: [InstCombine] Call getCmpPredicateForMinMax only with a valid SPF
Sanjoy Das via llvm-commits
llvm-commits at lists.llvm.org
Sat Dec 5 15:47:29 PST 2015
This revision was automatically updated to reflect the committed changes.
Closed by commit rL254869: [InstCombine] Call getCmpPredicateForMinMax only with a valid SPF (authored by sanjoy).
Changed prior to commit:
http://reviews.llvm.org/D15249?vs=41955&id=41998#toc
Repository:
rL LLVM
http://reviews.llvm.org/D15249
Files:
llvm/trunk/include/llvm/Analysis/ValueTracking.h
llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
llvm/trunk/test/Transforms/InstCombine/pr25745.ll
Index: llvm/trunk/test/Transforms/InstCombine/pr25745.ll
===================================================================
--- llvm/trunk/test/Transforms/InstCombine/pr25745.ll
+++ llvm/trunk/test/Transforms/InstCombine/pr25745.ll
@@ -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
+}
Index: llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
===================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -1070,7 +1070,7 @@
SelectPatternResult SPR = matchSelectPattern(&SI, LHS, RHS, &CastOp);
auto SPF = SPR.Flavor;
- if (SPF) {
+ if (SelectPatternResult::isMinOrMax(SPF)) {
// Canonicalize so that type casts are outside select patterns.
if (LHS->getType()->getPrimitiveSizeInBits() !=
SI.getType()->getPrimitiveSizeInBits()) {
@@ -1091,11 +1091,15 @@
SI.getType());
return ReplaceInstUsesWith(SI, NewSI);
}
+ }
+ if (SPF) {
// MAX(MAX(a, b), a) -> MAX(a, b)
// MIN(MIN(a, b), a) -> MIN(a, b)
// MAX(MIN(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 (Instruction *R = FoldSPFofSPF(cast<Instruction>(LHS),SPF2,LHS2,RHS2,
SI, SPF, RHS))
Index: llvm/trunk/include/llvm/Analysis/ValueTracking.h
===================================================================
--- llvm/trunk/include/llvm/Analysis/ValueTracking.h
+++ llvm/trunk/include/llvm/Analysis/ValueTracking.h
@@ -412,6 +412,11 @@
bool Ordered; /// When implementing this min/max pattern as
/// fcmp; select, does the fcmp have to be
/// 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
/// and providing the out parameter results if we successfully match.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D15249.41998.patch
Type: text/x-patch
Size: 2788 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151205/66b35fee/attachment.bin>
More information about the llvm-commits
mailing list