]> granicus.if.org Git - llvm/commitdiff
Merging r322016:
authorHans Wennborg <hans@hanshq.net>
Tue, 30 Jan 2018 09:57:17 +0000 (09:57 +0000)
committerHans Wennborg <hans@hanshq.net>
Tue, 30 Jan 2018 09:57:17 +0000 (09:57 +0000)
------------------------------------------------------------------------
r322016 | spatel | 2018-01-08 19:31:13 +0100 (Mon, 08 Jan 2018) | 8 lines

[ValueTracking] remove overzealous assert

The test is derived from a failing fuzz test:
https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=5008

Credit to @rksimon for pointing out the problem.

------------------------------------------------------------------------

git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_60@323740 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ValueTracking.cpp
test/Transforms/InstCombine/minmax-fold.ll

index b799f5144bc468c73fc3a5228e38f4eeb91b53e1..46ac3f451f81a673407bc0d90a127b67efd2b681 100644 (file)
@@ -4215,7 +4215,7 @@ static SelectPatternResult matchMinMaxOfMinMax(CmpInst::Predicate Pred,
       break;
     return {SPF_UNKNOWN, SPNB_NA, false};
   default:
-    llvm_unreachable("Bad flavor while matching min/max");
+    return {SPF_UNKNOWN, SPNB_NA, false};
   }
 
   // a pred c ? m(a, b) : m(c, b) --> m(m(a, b), m(c, b))
index 933aac7e23f2ab7fc91aa37ab0e6fc9515fbf4b5..bf54204df080b5dce45ab97b196e1c6209205e73 100644 (file)
@@ -899,3 +899,24 @@ define i32 @common_factor_umax_extra_use_both(i32 %a, i32 %b, i32 %c) {
   ret i32 %max_abc
 }
 
+; This would assert. Don't assume that earlier min/max types match a possible later min/max.
+
+define float @not_min_of_min(i8 %i, float %x) {
+; CHECK-LABEL: @not_min_of_min(
+; CHECK-NEXT:    [[CMP1_INV:%.*]] = fcmp fast oge float [[X:%.*]], 1.000000e+00
+; CHECK-NEXT:    [[MIN1:%.*]] = select i1 [[CMP1_INV]], float 1.000000e+00, float [[X]]
+; CHECK-NEXT:    [[CMP2_INV:%.*]] = fcmp fast oge float [[X]], 2.000000e+00
+; CHECK-NEXT:    [[MIN2:%.*]] = select i1 [[CMP2_INV]], float 2.000000e+00, float [[X]]
+; CHECK-NEXT:    [[CMP3:%.*]] = icmp ult i8 [[I:%.*]], 16
+; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMP3]], float [[MIN1]], float [[MIN2]]
+; CHECK-NEXT:    ret float [[R]]
+;
+  %cmp1 = fcmp fast ult float %x, 1.0
+  %min1 = select i1 %cmp1, float %x, float 1.0
+  %cmp2 = fcmp fast ult float %x, 2.0
+  %min2 = select i1 %cmp2, float %x, float 2.0
+  %cmp3 = icmp ult i8 %i, 16
+  %r = select i1 %cmp3, float %min1, float %min2
+  ret float %r
+}
+