lGTM, thanks for fixing this before I got to it myself!<br><div class="gmail_quote"><div dir="ltr">On Fri, 4 Dec 2015 at 23:36, Sanjoy Das via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">sanjoy created this revision.<br>
sanjoy added a reviewer: majnemer.<br>
sanjoy added a subscriber: llvm-commits.<br>
<br>
There are `SelectPatternFlavor`s that don't represent min or max idioms,<br>
and we should not be passing those to `getCmpPredicateForMinMax`.<br>
<br>
Fixes PR25745.<br>
<br>
<a href="http://reviews.llvm.org/D15249" rel="noreferrer" target="_blank">http://reviews.llvm.org/D15249</a><br>
<br>
Files:<br>
  include/llvm/Analysis/ValueTracking.h<br>
  lib/Transforms/InstCombine/InstCombineSelect.cpp<br>
  test/Transforms/InstCombine/pr25745.ll<br>
<br>
Index: test/Transforms/InstCombine/pr25745.ll<br>
===================================================================<br>
--- /dev/null<br>
+++ test/Transforms/InstCombine/pr25745.ll<br>
@@ -0,0 +1,20 @@<br>
+; RUN: opt -S -instcombine < %s | FileCheck %s<br>
+<br>
+; Checking for a crash<br>
+<br>
+declare void @use.i1(i1 %val)<br>
+declare void @use.i64(i64 %val)<br>
+<br>
+define i64 @f(i32 %x) {<br>
+; CHECK-LABEL: @f(<br>
+ entry:<br>
+  %x.wide = sext i32 %x to i64<br>
+  %minus.x = sub i32 0, %x<br>
+  %minus.x.wide = sext i32 %minus.x to i64<br>
+  %c = icmp slt i32 %x, 0<br>
+  %val = select i1 %c, i64 %x.wide, i64 %minus.x.wide<br>
+  call void @use.i1(i1 %c)<br>
+  call void @use.i64(i64 %x.wide)<br>
+  ret i64 %val<br>
+; CHECK: ret i64 %val<br>
+}<br>
Index: lib/Transforms/InstCombine/InstCombineSelect.cpp<br>
===================================================================<br>
--- lib/Transforms/InstCombine/InstCombineSelect.cpp<br>
+++ lib/Transforms/InstCombine/InstCombineSelect.cpp<br>
@@ -1070,7 +1070,7 @@<br>
     SelectPatternResult SPR = matchSelectPattern(&SI, LHS, RHS, &CastOp);<br>
     auto SPF = SPR.Flavor;<br>
<br>
-    if (SPF) {<br>
+    if (SelectPatternResult::isMinOrMax(SPF)) {<br>
       // Canonicalize so that type casts are outside select patterns.<br>
       if (LHS->getType()->getPrimitiveSizeInBits() !=<br>
           SI.getType()->getPrimitiveSizeInBits()) {<br>
@@ -1091,11 +1091,15 @@<br>
                                            SI.getType());<br>
         return ReplaceInstUsesWith(SI, NewSI);<br>
       }<br>
+    }<br>
<br>
+    if (SPF) {<br>
       // MAX(MAX(a, b), a) -> MAX(a, b)<br>
       // MIN(MIN(a, b), a) -> MIN(a, b)<br>
       // MAX(MIN(a, b), a) -> a<br>
       // MIN(MAX(a, b), a) -> a<br>
+      // ABS(ABS(a)) -> ABS(a)<br>
+      // NABS(NABS(a)) -> NABS(a)<br>
       if (SelectPatternFlavor SPF2 = matchSelectPattern(LHS, LHS2, RHS2).Flavor)<br>
         if (Instruction *R = FoldSPFofSPF(cast<Instruction>(LHS),SPF2,LHS2,RHS2,<br>
                                           SI, SPF, RHS))<br>
Index: include/llvm/Analysis/ValueTracking.h<br>
===================================================================<br>
--- include/llvm/Analysis/ValueTracking.h<br>
+++ include/llvm/Analysis/ValueTracking.h<br>
@@ -412,6 +412,11 @@<br>
     bool Ordered;               /// When implementing this min/max pattern as<br>
                                 /// fcmp; select, does the fcmp have to be<br>
                                 /// ordered?<br>
+<br>
+    /// \brief Return true if \p SPF is a min or a max pattern.<br>
+    static bool isMinOrMax(SelectPatternFlavor SPF) {<br>
+      return !(SPF == SPF_UNKNOWN || SPF == SPF_ABS || SPF == SPF_NABS);<br>
+    }<br>
   };<br>
   /// Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind<br>
   /// and providing the out parameter results if we successfully match.<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>