[llvm] r369386 - [InstCombine] simplify min/max of min/max with same operands (PR35607)

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 20 06:39:17 PDT 2019


Author: spatel
Date: Tue Aug 20 06:39:17 2019
New Revision: 369386

URL: http://llvm.org/viewvc/llvm-project?rev=369386&view=rev
Log:
[InstCombine] simplify min/max of min/max with same operands (PR35607)

This is the original integer variant requested in:
https://bugs.llvm.org/show_bug.cgi?id=35607

As noted in the TODO and several similar TODOs around this block,
we could do this in instsimplify, but then it would cost more
because we would be trying to match min/max via ValueTracking
in 2 different places.

There are 4 commuted variants for each of smin/smax/umin/umax
that are not matched here. There are also icmp predicate variants
that are not included in the affected test file because they are
already handled by instsimplify by folding the final icmp to
true/false.

https://rise4fun.com/Alive/3KVc

  Name: smax(smax, smin)
  %c1 = icmp slt i32 %x, %y
  %c2 = icmp slt i32 %y, %x
  %min = select i1 %c1, i32 %x, i32 %y
  %max = select i1 %c2, i32 %x, i32 %y
  %c3 = icmp sgt i32 %max, %min
  %r = select i1 %c3, i32 %max, i32 %min
  =>
  %r = %max

  Name: smin(smax, smin)
  %c1 = icmp slt i32 %x, %y
  %c2 = icmp slt i32 %y, %x
  %min = select i1 %c1, i32 %x, i32 %y
  %max = select i1 %c2, i32 %x, i32 %y
  %c3 = icmp sgt i32 %max, %min
  %r = select i1 %c3, i32 %min, i32 %max
  =>
  %r = %min

  Name: umax(umax, umin)
  %c1 = icmp ult i32 %x, %y
  %c2 = icmp ult i32 %y, %x
  %min = select i1 %c1, i32 %x, i32 %y
  %max = select i1 %c2, i32 %x, i32 %y
  %c3 = icmp ult i32 %min, %max
  %r = select i1 %c3, i32 %max, i32 %min
  =>
  %r = %max

  Name: umin(umax, umin)
  %c1 = icmp ult i32 %x, %y
  %c2 = icmp ult i32 %y, %x
  %min = select i1 %c1, i32 %x, i32 %y
  %max = select i1 %c2, i32 %x, i32 %y
  %c3 = icmp ult i32 %min, %max
  %r = select i1 %c3, i32 %min, i32 %max
  =>
  %r = %min

Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
    llvm/trunk/test/Transforms/InstCombine/minmax-of-minmax.ll

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp?rev=369386&r1=369385&r2=369386&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp Tue Aug 20 06:39:17 2019
@@ -1457,6 +1457,16 @@ Instruction *InstCombiner::foldSPFofSPF(
     }
   }
 
+  // max(max(A, B), min(A, B)) --> max(A, B)
+  // min(min(A, B), max(A, B)) --> min(A, B)
+  // TODO: This could be done in instsimplify.
+  if (SPF1 == SPF2 &&
+      ((SPF1 == SPF_UMIN && match(C, m_c_UMax(m_Specific(A), m_Specific(B)))) ||
+       (SPF1 == SPF_SMIN && match(C, m_c_SMax(m_Specific(A), m_Specific(B)))) ||
+       (SPF1 == SPF_UMAX && match(C, m_c_UMin(m_Specific(A), m_Specific(B)))) ||
+       (SPF1 == SPF_SMAX && match(C, m_c_SMin(m_Specific(A), m_Specific(B))))))
+    return replaceInstUsesWith(Outer, Inner);
+
   // ABS(ABS(X)) -> ABS(X)
   // NABS(NABS(X)) -> NABS(X)
   // TODO: This could be done in instsimplify.

Modified: llvm/trunk/test/Transforms/InstCombine/minmax-of-minmax.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/minmax-of-minmax.ll?rev=369386&r1=369385&r2=369386&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/minmax-of-minmax.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/minmax-of-minmax.ll Tue Aug 20 06:39:17 2019
@@ -3,13 +3,9 @@
 
 define i32 @smax_of_smax_smin_commute0(i32 %x, i32 %y) {
 ; CHECK-LABEL: @smax_of_smax_smin_commute0(
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[CMP1]], i32 [[X]], i32 [[Y]]
-; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[Y]], [[X]]
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[Y:%.*]], [[X:%.*]]
 ; CHECK-NEXT:    [[MAX:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 [[Y]]
-; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt i32 [[MAX]], [[MIN]]
-; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMP3]], i32 [[MAX]], i32 [[MIN]]
-; CHECK-NEXT:    ret i32 [[R]]
+; CHECK-NEXT:    ret i32 [[MAX]]
 ;
   %cmp1 = icmp slt i32 %x, %y
   %min = select i1 %cmp1, i32 %x, i32 %y
@@ -22,13 +18,9 @@ define i32 @smax_of_smax_smin_commute0(i
 
 define i32 @smax_of_smax_smin_commute1(i32 %x, i32 %y) {
 ; CHECK-LABEL: @smax_of_smax_smin_commute1(
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[CMP1]], i32 [[Y]], i32 [[X]]
-; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[X]], [[Y]]
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]]
 ; CHECK-NEXT:    [[MAX:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 [[Y]]
-; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt i32 [[MAX]], [[MIN]]
-; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMP3]], i32 [[MAX]], i32 [[MIN]]
-; CHECK-NEXT:    ret i32 [[R]]
+; CHECK-NEXT:    ret i32 [[MAX]]
 ;
   %cmp1 = icmp sgt i32 %x, %y
   %min = select i1 %cmp1, i32 %y, i32 %x
@@ -41,13 +33,9 @@ define i32 @smax_of_smax_smin_commute1(i
 
 define i32 @smax_of_smax_smin_commute2(i32 %x, i32 %y) {
 ; CHECK-LABEL: @smax_of_smax_smin_commute2(
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[CMP1]], i32 [[X]], i32 [[Y]]
-; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[Y]], [[X]]
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[Y:%.*]], [[X:%.*]]
 ; CHECK-NEXT:    [[MAX:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 [[Y]]
-; CHECK-NEXT:    [[CMP3:%.*]] = icmp slt i32 [[MIN]], [[MAX]]
-; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMP3]], i32 [[MAX]], i32 [[MIN]]
-; CHECK-NEXT:    ret i32 [[R]]
+; CHECK-NEXT:    ret i32 [[MAX]]
 ;
   %cmp1 = icmp slt i32 %x, %y
   %min = select i1 %cmp1, i32 %x, i32 %y
@@ -60,13 +48,9 @@ define i32 @smax_of_smax_smin_commute2(i
 
 define <2 x i32> @smax_of_smax_smin_commute3(<2 x i32> %x, <2 x i32> %y) {
 ; CHECK-LABEL: @smax_of_smax_smin_commute3(
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt <2 x i32> [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[MIN:%.*]] = select <2 x i1> [[CMP1]], <2 x i32> [[Y]], <2 x i32> [[X]]
-; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt <2 x i32> [[X]], [[Y]]
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt <2 x i32> [[X:%.*]], [[Y:%.*]]
 ; CHECK-NEXT:    [[MAX:%.*]] = select <2 x i1> [[CMP2]], <2 x i32> [[X]], <2 x i32> [[Y]]
-; CHECK-NEXT:    [[CMP3:%.*]] = icmp slt <2 x i32> [[MIN]], [[MAX]]
-; CHECK-NEXT:    [[R:%.*]] = select <2 x i1> [[CMP3]], <2 x i32> [[MAX]], <2 x i32> [[MIN]]
-; CHECK-NEXT:    ret <2 x i32> [[R]]
+; CHECK-NEXT:    ret <2 x i32> [[MAX]]
 ;
   %cmp1 = icmp sgt <2 x i32> %x, %y
   %min = select <2 x i1> %cmp1, <2 x i32> %y, <2 x i32> %x
@@ -79,13 +63,9 @@ define <2 x i32> @smax_of_smax_smin_comm
 
 define i32 @smin_of_smin_smax_commute0(i32 %x, i32 %y) {
 ; CHECK-LABEL: @smin_of_smin_smax_commute0(
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[MAX:%.*]] = select i1 [[CMP1]], i32 [[X]], i32 [[Y]]
-; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[Y]], [[X]]
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[Y:%.*]], [[X:%.*]]
 ; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 [[Y]]
-; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt i32 [[MAX]], [[MIN]]
-; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMP3]], i32 [[MIN]], i32 [[MAX]]
-; CHECK-NEXT:    ret i32 [[R]]
+; CHECK-NEXT:    ret i32 [[MIN]]
 ;
   %cmp1 = icmp sgt i32 %x, %y
   %max = select i1 %cmp1, i32 %x, i32 %y
@@ -98,13 +78,9 @@ define i32 @smin_of_smin_smax_commute0(i
 
 define i32 @smin_of_smin_smax_commute1(i32 %x, i32 %y) {
 ; CHECK-LABEL: @smin_of_smin_smax_commute1(
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[MAX:%.*]] = select i1 [[CMP1]], i32 [[Y]], i32 [[X]]
-; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[X]], [[Y]]
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[X:%.*]], [[Y:%.*]]
 ; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 [[Y]]
-; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt i32 [[MAX]], [[MIN]]
-; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMP3]], i32 [[MIN]], i32 [[MAX]]
-; CHECK-NEXT:    ret i32 [[R]]
+; CHECK-NEXT:    ret i32 [[MIN]]
 ;
   %cmp1 = icmp slt i32 %x, %y
   %max = select i1 %cmp1, i32 %y, i32 %x
@@ -117,13 +93,9 @@ define i32 @smin_of_smin_smax_commute1(i
 
 define <2 x i32> @smin_of_smin_smax_commute2(<2 x i32> %x, <2 x i32> %y) {
 ; CHECK-LABEL: @smin_of_smin_smax_commute2(
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp sgt <2 x i32> [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[MAX:%.*]] = select <2 x i1> [[CMP1]], <2 x i32> [[X]], <2 x i32> [[Y]]
-; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt <2 x i32> [[X]], [[Y]]
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt <2 x i32> [[X:%.*]], [[Y:%.*]]
 ; CHECK-NEXT:    [[MIN:%.*]] = select <2 x i1> [[CMP2]], <2 x i32> [[X]], <2 x i32> [[Y]]
-; CHECK-NEXT:    [[CMP3:%.*]] = icmp slt <2 x i32> [[MIN]], [[MAX]]
-; CHECK-NEXT:    [[R:%.*]] = select <2 x i1> [[CMP3]], <2 x i32> [[MIN]], <2 x i32> [[MAX]]
-; CHECK-NEXT:    ret <2 x i32> [[R]]
+; CHECK-NEXT:    ret <2 x i32> [[MIN]]
 ;
   %cmp1 = icmp sgt <2 x i32> %x, %y
   %max = select <2 x i1> %cmp1, <2 x i32> %x, <2 x i32> %y
@@ -136,13 +108,9 @@ define <2 x i32> @smin_of_smin_smax_comm
 
 define i32 @smin_of_smin_smax_commute3(i32 %x, i32 %y) {
 ; CHECK-LABEL: @smin_of_smin_smax_commute3(
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[MAX:%.*]] = select i1 [[CMP1]], i32 [[Y]], i32 [[X]]
-; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[Y]], [[X]]
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[Y:%.*]], [[X:%.*]]
 ; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 [[Y]]
-; CHECK-NEXT:    [[CMP3:%.*]] = icmp slt i32 [[MIN]], [[MAX]]
-; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMP3]], i32 [[MIN]], i32 [[MAX]]
-; CHECK-NEXT:    ret i32 [[R]]
+; CHECK-NEXT:    ret i32 [[MIN]]
 ;
   %cmp1 = icmp slt i32 %x, %y
   %max = select i1 %cmp1, i32 %y, i32 %x
@@ -155,13 +123,9 @@ define i32 @smin_of_smin_smax_commute3(i
 
 define i32 @umax_of_umax_umin_commute0(i32 %x, i32 %y) {
 ; CHECK-LABEL: @umax_of_umax_umin_commute0(
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i32 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[CMP1]], i32 [[X]], i32 [[Y]]
-; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i32 [[Y]], [[X]]
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i32 [[Y:%.*]], [[X:%.*]]
 ; CHECK-NEXT:    [[MAX:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 [[Y]]
-; CHECK-NEXT:    [[CMP3:%.*]] = icmp ugt i32 [[MAX]], [[MIN]]
-; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMP3]], i32 [[MAX]], i32 [[MIN]]
-; CHECK-NEXT:    ret i32 [[R]]
+; CHECK-NEXT:    ret i32 [[MAX]]
 ;
   %cmp1 = icmp ult i32 %x, %y
   %min = select i1 %cmp1, i32 %x, i32 %y
@@ -174,13 +138,9 @@ define i32 @umax_of_umax_umin_commute0(i
 
 define i32 @umax_of_umax_umin_commute1(i32 %x, i32 %y) {
 ; CHECK-LABEL: @umax_of_umax_umin_commute1(
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i32 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[CMP1]], i32 [[Y]], i32 [[X]]
-; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt i32 [[X]], [[Y]]
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt i32 [[X:%.*]], [[Y:%.*]]
 ; CHECK-NEXT:    [[MAX:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 [[Y]]
-; CHECK-NEXT:    [[CMP3:%.*]] = icmp ugt i32 [[MAX]], [[MIN]]
-; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMP3]], i32 [[MAX]], i32 [[MIN]]
-; CHECK-NEXT:    ret i32 [[R]]
+; CHECK-NEXT:    ret i32 [[MAX]]
 ;
   %cmp1 = icmp ugt i32 %x, %y
   %min = select i1 %cmp1, i32 %y, i32 %x
@@ -193,13 +153,9 @@ define i32 @umax_of_umax_umin_commute1(i
 
 define i32 @umax_of_umax_umin_commute2(i32 %x, i32 %y) {
 ; CHECK-LABEL: @umax_of_umax_umin_commute2(
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i32 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[CMP1]], i32 [[X]], i32 [[Y]]
-; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i32 [[Y]], [[X]]
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i32 [[Y:%.*]], [[X:%.*]]
 ; CHECK-NEXT:    [[MAX:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 [[Y]]
-; CHECK-NEXT:    [[CMP3:%.*]] = icmp ult i32 [[MIN]], [[MAX]]
-; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMP3]], i32 [[MAX]], i32 [[MIN]]
-; CHECK-NEXT:    ret i32 [[R]]
+; CHECK-NEXT:    ret i32 [[MAX]]
 ;
   %cmp1 = icmp ult i32 %x, %y
   %min = select i1 %cmp1, i32 %x, i32 %y
@@ -212,13 +168,9 @@ define i32 @umax_of_umax_umin_commute2(i
 
 define <2 x i32> @umax_of_umax_umin_commute3(<2 x i32> %x, <2 x i32> %y) {
 ; CHECK-LABEL: @umax_of_umax_umin_commute3(
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt <2 x i32> [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[MIN:%.*]] = select <2 x i1> [[CMP1]], <2 x i32> [[Y]], <2 x i32> [[X]]
-; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt <2 x i32> [[X]], [[Y]]
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt <2 x i32> [[X:%.*]], [[Y:%.*]]
 ; CHECK-NEXT:    [[MAX:%.*]] = select <2 x i1> [[CMP2]], <2 x i32> [[X]], <2 x i32> [[Y]]
-; CHECK-NEXT:    [[CMP3:%.*]] = icmp ult <2 x i32> [[MIN]], [[MAX]]
-; CHECK-NEXT:    [[R:%.*]] = select <2 x i1> [[CMP3]], <2 x i32> [[MAX]], <2 x i32> [[MIN]]
-; CHECK-NEXT:    ret <2 x i32> [[R]]
+; CHECK-NEXT:    ret <2 x i32> [[MAX]]
 ;
   %cmp1 = icmp ugt <2 x i32> %x, %y
   %min = select <2 x i1> %cmp1, <2 x i32> %y, <2 x i32> %x
@@ -231,13 +183,9 @@ define <2 x i32> @umax_of_umax_umin_comm
 
 define i32 @umin_of_umin_umax_commute0(i32 %x, i32 %y) {
 ; CHECK-LABEL: @umin_of_umin_umax_commute0(
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i32 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[MAX:%.*]] = select i1 [[CMP1]], i32 [[X]], i32 [[Y]]
-; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt i32 [[Y]], [[X]]
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt i32 [[Y:%.*]], [[X:%.*]]
 ; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 [[Y]]
-; CHECK-NEXT:    [[CMP3:%.*]] = icmp ugt i32 [[MAX]], [[MIN]]
-; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMP3]], i32 [[MIN]], i32 [[MAX]]
-; CHECK-NEXT:    ret i32 [[R]]
+; CHECK-NEXT:    ret i32 [[MIN]]
 ;
   %cmp1 = icmp ugt i32 %x, %y
   %max = select i1 %cmp1, i32 %x, i32 %y
@@ -250,13 +198,9 @@ define i32 @umin_of_umin_umax_commute0(i
 
 define i32 @umin_of_umin_umax_commute1(i32 %x, i32 %y) {
 ; CHECK-LABEL: @umin_of_umin_umax_commute1(
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i32 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[MAX:%.*]] = select i1 [[CMP1]], i32 [[Y]], i32 [[X]]
-; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i32 [[X]], [[Y]]
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i32 [[X:%.*]], [[Y:%.*]]
 ; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 [[Y]]
-; CHECK-NEXT:    [[CMP3:%.*]] = icmp ugt i32 [[MAX]], [[MIN]]
-; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMP3]], i32 [[MIN]], i32 [[MAX]]
-; CHECK-NEXT:    ret i32 [[R]]
+; CHECK-NEXT:    ret i32 [[MIN]]
 ;
   %cmp1 = icmp ult i32 %x, %y
   %max = select i1 %cmp1, i32 %y, i32 %x
@@ -269,13 +213,9 @@ define i32 @umin_of_umin_umax_commute1(i
 
 define <2 x i32> @umin_of_umin_umax_commute2(<2 x i32> %x, <2 x i32> %y) {
 ; CHECK-LABEL: @umin_of_umin_umax_commute2(
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt <2 x i32> [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[MAX:%.*]] = select <2 x i1> [[CMP1]], <2 x i32> [[X]], <2 x i32> [[Y]]
-; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult <2 x i32> [[X]], [[Y]]
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult <2 x i32> [[X:%.*]], [[Y:%.*]]
 ; CHECK-NEXT:    [[MIN:%.*]] = select <2 x i1> [[CMP2]], <2 x i32> [[X]], <2 x i32> [[Y]]
-; CHECK-NEXT:    [[CMP3:%.*]] = icmp ult <2 x i32> [[MIN]], [[MAX]]
-; CHECK-NEXT:    [[R:%.*]] = select <2 x i1> [[CMP3]], <2 x i32> [[MIN]], <2 x i32> [[MAX]]
-; CHECK-NEXT:    ret <2 x i32> [[R]]
+; CHECK-NEXT:    ret <2 x i32> [[MIN]]
 ;
   %cmp1 = icmp ugt <2 x i32> %x, %y
   %max = select <2 x i1> %cmp1, <2 x i32> %x, <2 x i32> %y
@@ -288,13 +228,9 @@ define <2 x i32> @umin_of_umin_umax_comm
 
 define i32 @umin_of_umin_umax_commute3(i32 %x, i32 %y) {
 ; CHECK-LABEL: @umin_of_umin_umax_commute3(
-; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i32 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT:    [[MAX:%.*]] = select i1 [[CMP1]], i32 [[Y]], i32 [[X]]
-; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt i32 [[Y]], [[X]]
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp ugt i32 [[Y:%.*]], [[X:%.*]]
 ; CHECK-NEXT:    [[MIN:%.*]] = select i1 [[CMP2]], i32 [[X]], i32 [[Y]]
-; CHECK-NEXT:    [[CMP3:%.*]] = icmp ult i32 [[MIN]], [[MAX]]
-; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMP3]], i32 [[MIN]], i32 [[MAX]]
-; CHECK-NEXT:    ret i32 [[R]]
+; CHECK-NEXT:    ret i32 [[MIN]]
 ;
   %cmp1 = icmp ult i32 %x, %y
   %max = select i1 %cmp1, i32 %y, i32 %x
@@ -305,6 +241,8 @@ define i32 @umin_of_umin_umax_commute3(i
   ret i32 %r
 }
 
+; Negative test - mismatch of min/max flavor
+
 define i32 @umin_of_smin_umax_wrong_pattern(i32 %x, i32 %y) {
 ; CHECK-LABEL: @umin_of_smin_umax_wrong_pattern(
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt i32 [[X:%.*]], [[Y:%.*]]
@@ -324,6 +262,8 @@ define i32 @umin_of_smin_umax_wrong_patt
   ret i32 %r
 }
 
+; Negative test - mismatch of min/max flavor
+
 define i32 @smin_of_umin_umax_wrong_pattern2(i32 %x, i32 %y) {
 ; CHECK-LABEL: @smin_of_umin_umax_wrong_pattern2(
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i32 [[X:%.*]], [[Y:%.*]]
@@ -343,6 +283,8 @@ define i32 @smin_of_umin_umax_wrong_patt
   ret i32 %r
 }
 
+; Negative test - operands must match
+
 define <2 x i32> @umin_of_umin_umax_wrong_operand(<2 x i32> %x, <2 x i32> %y, <2 x i32> %z) {
 ; CHECK-LABEL: @umin_of_umin_umax_wrong_operand(
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ugt <2 x i32> [[X:%.*]], [[Y:%.*]]
@@ -362,6 +304,8 @@ define <2 x i32> @umin_of_umin_umax_wron
   ret <2 x i32> %r
 }
 
+; Negative test - operands must match
+
 define i32 @umin_of_umin_umax_wrong_operand2(i32 %x, i32 %y, i32 %z) {
 ; CHECK-LABEL: @umin_of_umin_umax_wrong_operand2(
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i32 [[X:%.*]], [[Z:%.*]]




More information about the llvm-commits mailing list