diff --git a/llvm/lib/Target/VE/VEInstrInfo.td b/llvm/lib/Target/VE/VEInstrInfo.td --- a/llvm/lib/Target/VE/VEInstrInfo.td +++ b/llvm/lib/Target/VE/VEInstrInfo.td @@ -2052,29 +2052,6 @@ def : Pat<(i32 (setcc f128:$l, f128:$r, cond:$cond)), (setccrr (fcond2cc $cond), (FCMPQrr $l, $r))>; -// Special SELECTCC pattern matches -// Use min/max for better performance. -// -// MAX/MIN %res, %lhs, %rhs - -def : Pat<(f64 (selectcc f64:$LHS, f64:$RHS, f64:$LHS, f64:$RHS, SETOGT)), - (FMAXDrr $LHS, $RHS)>; -def : Pat<(f32 (selectcc f32:$LHS, f32:$RHS, f32:$LHS, f32:$RHS, SETOGT)), - (FMAXSrr $LHS, $RHS)>; -def : Pat<(f64 (selectcc f64:$LHS, f64:$RHS, f64:$LHS, f64:$RHS, SETOGE)), - (FMAXDrr $LHS, $RHS)>; -def : Pat<(f32 (selectcc f32:$LHS, f32:$RHS, f32:$LHS, f32:$RHS, SETOGE)), - (FMAXSrr $LHS, $RHS)>; - -def : Pat<(f64 (selectcc f64:$LHS, f64:$RHS, f64:$LHS, f64:$RHS, SETOLT)), - (FMINDrr $LHS, $RHS)>; -def : Pat<(f32 (selectcc f32:$LHS, f32:$RHS, f32:$LHS, f32:$RHS, SETOLT)), - (FMINSrr $LHS, $RHS)>; -def : Pat<(f64 (selectcc f64:$LHS, f64:$RHS, f64:$LHS, f64:$RHS, SETOLE)), - (FMINDrr $LHS, $RHS)>; -def : Pat<(f32 (selectcc f32:$LHS, f32:$RHS, f32:$LHS, f32:$RHS, SETOLE)), - (FMINSrr $LHS, $RHS)>; - // Helper classes to construct cmov patterns for the ease. // // Hiding INSERT_SUBREG/EXTRACT_SUBREG patterns. diff --git a/llvm/test/CodeGen/VE/Scalar/max.ll b/llvm/test/CodeGen/VE/Scalar/max.ll --- a/llvm/test/CodeGen/VE/Scalar/max.ll +++ b/llvm/test/CodeGen/VE/Scalar/max.ll @@ -1,11 +1,20 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s +; RUN: llc < %s -mtriple=ve-unknown-unknown -enable-no-signed-zeros-fp-math \ +; RUN: -enable-no-nans-fp-math | FileCheck %s -check-prefix=OPT define double @maxf64(double, double) { ; CHECK-LABEL: maxf64: ; CHECK: # %bb.0: -; CHECK-NEXT: fmax.d %s0, %s0, %s1 +; CHECK-NEXT: fcmp.d %s2, %s0, %s1 +; CHECK-NEXT: cmov.d.gt %s1, %s0, %s2 +; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: maxf64: +; OPT: # %bb.0: +; OPT-NEXT: fmax.d %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = fcmp ogt double %0, %1 %4 = select i1 %3, double %0, double %1 ret double %4 @@ -14,8 +23,15 @@ define double @max2f64(double, double) { ; CHECK-LABEL: max2f64: ; CHECK: # %bb.0: -; CHECK-NEXT: fmax.d %s0, %s0, %s1 +; CHECK-NEXT: fcmp.d %s2, %s0, %s1 +; CHECK-NEXT: cmov.d.ge %s1, %s0, %s2 +; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: max2f64: +; OPT: # %bb.0: +; OPT-NEXT: fmax.d %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = fcmp oge double %0, %1 %4 = select i1 %3, double %0, double %1 ret double %4 @@ -29,6 +45,11 @@ ; CHECK-NEXT: cmov.d.gtnan %s1, %s0, %s2 ; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: maxuf64: +; OPT: # %bb.0: +; OPT-NEXT: fmax.d %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = fcmp ugt double %0, %1 %4 = select i1 %3, double %0, double %1 ret double %4 @@ -42,6 +63,11 @@ ; CHECK-NEXT: cmov.d.genan %s1, %s0, %s2 ; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: max2uf64: +; OPT: # %bb.0: +; OPT-NEXT: fmax.d %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = fcmp uge double %0, %1 %4 = select i1 %3, double %0, double %1 ret double %4 @@ -50,8 +76,15 @@ define float @maxf32(float, float) { ; CHECK-LABEL: maxf32: ; CHECK: # %bb.0: -; CHECK-NEXT: fmax.s %s0, %s0, %s1 +; CHECK-NEXT: fcmp.s %s2, %s0, %s1 +; CHECK-NEXT: cmov.s.gt %s1, %s0, %s2 +; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: maxf32: +; OPT: # %bb.0: +; OPT-NEXT: fmax.s %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = fcmp ogt float %0, %1 %4 = select i1 %3, float %0, float %1 ret float %4 @@ -60,8 +93,15 @@ define float @max2f32(float, float) { ; CHECK-LABEL: max2f32: ; CHECK: # %bb.0: -; CHECK-NEXT: fmax.s %s0, %s0, %s1 +; CHECK-NEXT: fcmp.s %s2, %s0, %s1 +; CHECK-NEXT: cmov.s.ge %s1, %s0, %s2 +; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: max2f32: +; OPT: # %bb.0: +; OPT-NEXT: fmax.s %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = fcmp oge float %0, %1 %4 = select i1 %3, float %0, float %1 ret float %4 @@ -74,6 +114,11 @@ ; CHECK-NEXT: cmov.s.gtnan %s1, %s0, %s2 ; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: maxuf32: +; OPT: # %bb.0: +; OPT-NEXT: fmax.s %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = fcmp ugt float %0, %1 %4 = select i1 %3, float %0, float %1 ret float %4 @@ -86,6 +131,11 @@ ; CHECK-NEXT: cmov.s.genan %s1, %s0, %s2 ; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: max2uf32: +; OPT: # %bb.0: +; OPT-NEXT: fmax.s %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = fcmp uge float %0, %1 %4 = select i1 %3, float %0, float %1 ret float %4 @@ -96,6 +146,11 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: maxs.l %s0, %s0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: maxi64: +; OPT: # %bb.0: +; OPT-NEXT: maxs.l %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = icmp sgt i64 %0, %1 %4 = select i1 %3, i64 %0, i64 %1 ret i64 %4 @@ -106,6 +161,11 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: maxs.l %s0, %s0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: max2i64: +; OPT: # %bb.0: +; OPT-NEXT: maxs.l %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = icmp sge i64 %0, %1 %4 = select i1 %3, i64 %0, i64 %1 ret i64 %4 @@ -118,6 +178,13 @@ ; CHECK-NEXT: cmov.l.gt %s1, %s0, %s2 ; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: maxu64: +; OPT: # %bb.0: +; OPT-NEXT: cmpu.l %s2, %s0, %s1 +; OPT-NEXT: cmov.l.gt %s1, %s0, %s2 +; OPT-NEXT: or %s0, 0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = icmp ugt i64 %0, %1 %4 = select i1 %3, i64 %0, i64 %1 ret i64 %4 @@ -130,6 +197,13 @@ ; CHECK-NEXT: cmov.l.ge %s1, %s0, %s2 ; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: max2u64: +; OPT: # %bb.0: +; OPT-NEXT: cmpu.l %s2, %s0, %s1 +; OPT-NEXT: cmov.l.ge %s1, %s0, %s2 +; OPT-NEXT: or %s0, 0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = icmp uge i64 %0, %1 %4 = select i1 %3, i64 %0, i64 %1 ret i64 %4 @@ -140,6 +214,11 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: maxs.w.sx %s0, %s0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: maxi32: +; OPT: # %bb.0: +; OPT-NEXT: maxs.w.sx %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = icmp sgt i32 %0, %1 %4 = select i1 %3, i32 %0, i32 %1 ret i32 %4 @@ -150,6 +229,11 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: maxs.w.sx %s0, %s0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: max2i32: +; OPT: # %bb.0: +; OPT-NEXT: maxs.w.sx %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = icmp sge i32 %0, %1 %4 = select i1 %3, i32 %0, i32 %1 ret i32 %4 @@ -162,6 +246,13 @@ ; CHECK-NEXT: cmov.w.gt %s1, %s0, %s2 ; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: maxu32: +; OPT: # %bb.0: +; OPT-NEXT: cmpu.w %s2, %s0, %s1 +; OPT-NEXT: cmov.w.gt %s1, %s0, %s2 +; OPT-NEXT: or %s0, 0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = icmp ugt i32 %0, %1 %4 = select i1 %3, i32 %0, i32 %1 ret i32 %4 @@ -174,6 +265,13 @@ ; CHECK-NEXT: cmov.w.ge %s1, %s0, %s2 ; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: max2u32: +; OPT: # %bb.0: +; OPT-NEXT: cmpu.w %s2, %s0, %s1 +; OPT-NEXT: cmov.w.ge %s1, %s0, %s2 +; OPT-NEXT: or %s0, 0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = icmp uge i32 %0, %1 %4 = select i1 %3, i32 %0, i32 %1 ret i32 %4 @@ -184,6 +282,11 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: or %s0, %s0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: maxi1: +; OPT: # %bb.0: +; OPT-NEXT: or %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = xor i1 %1, true %4 = and i1 %3, %0 %5 = select i1 %4, i1 %0, i1 %1 diff --git a/llvm/test/CodeGen/VE/Scalar/min.ll b/llvm/test/CodeGen/VE/Scalar/min.ll --- a/llvm/test/CodeGen/VE/Scalar/min.ll +++ b/llvm/test/CodeGen/VE/Scalar/min.ll @@ -1,10 +1,20 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s +; RUN: llc < %s -mtriple=ve-unknown-unknown -enable-no-signed-zeros-fp-math \ +; RUN: -enable-no-nans-fp-math | FileCheck %s -check-prefix=OPT define double @minf64(double, double) { ; CHECK-LABEL: minf64: ; CHECK: # %bb.0: -; CHECK-NEXT: fmin.d %s0, %s0, %s1 +; CHECK-NEXT: fcmp.d %s2, %s0, %s1 +; CHECK-NEXT: cmov.d.lt %s1, %s0, %s2 +; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: minf64: +; OPT: # %bb.0: +; OPT-NEXT: fmin.d %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = fcmp olt double %0, %1 %4 = select i1 %3, double %0, double %1 ret double %4 @@ -13,8 +23,15 @@ define double @min2f64(double, double) { ; CHECK-LABEL: min2f64: ; CHECK: # %bb.0: -; CHECK-NEXT: fmin.d %s0, %s0, %s1 +; CHECK-NEXT: fcmp.d %s2, %s0, %s1 +; CHECK-NEXT: cmov.d.le %s1, %s0, %s2 +; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: min2f64: +; OPT: # %bb.0: +; OPT-NEXT: fmin.d %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = fcmp ole double %0, %1 %4 = select i1 %3, double %0, double %1 ret double %4 @@ -27,6 +44,11 @@ ; CHECK-NEXT: cmov.d.ltnan %s1, %s0, %s2 ; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: minuf64: +; OPT: # %bb.0: +; OPT-NEXT: fmin.d %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = fcmp ult double %0, %1 %4 = select i1 %3, double %0, double %1 ret double %4 @@ -39,6 +61,11 @@ ; CHECK-NEXT: cmov.d.lenan %s1, %s0, %s2 ; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: min2uf64: +; OPT: # %bb.0: +; OPT-NEXT: fmin.d %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = fcmp ule double %0, %1 %4 = select i1 %3, double %0, double %1 ret double %4 @@ -47,8 +74,15 @@ define float @minf32(float, float) { ; CHECK-LABEL: minf32: ; CHECK: # %bb.0: -; CHECK-NEXT: fmin.s %s0, %s0, %s1 +; CHECK-NEXT: fcmp.s %s2, %s0, %s1 +; CHECK-NEXT: cmov.s.lt %s1, %s0, %s2 +; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: minf32: +; OPT: # %bb.0: +; OPT-NEXT: fmin.s %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = fcmp olt float %0, %1 %4 = select i1 %3, float %0, float %1 ret float %4 @@ -57,8 +91,15 @@ define float @min2f32(float, float) { ; CHECK-LABEL: min2f32: ; CHECK: # %bb.0: -; CHECK-NEXT: fmin.s %s0, %s0, %s1 +; CHECK-NEXT: fcmp.s %s2, %s0, %s1 +; CHECK-NEXT: cmov.s.le %s1, %s0, %s2 +; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: min2f32: +; OPT: # %bb.0: +; OPT-NEXT: fmin.s %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = fcmp ole float %0, %1 %4 = select i1 %3, float %0, float %1 ret float %4 @@ -71,6 +112,11 @@ ; CHECK-NEXT: cmov.s.ltnan %s1, %s0, %s2 ; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: minuf32: +; OPT: # %bb.0: +; OPT-NEXT: fmin.s %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = fcmp ult float %0, %1 %4 = select i1 %3, float %0, float %1 ret float %4 @@ -83,6 +129,11 @@ ; CHECK-NEXT: cmov.s.lenan %s1, %s0, %s2 ; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: min2uf32: +; OPT: # %bb.0: +; OPT-NEXT: fmin.s %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = fcmp ule float %0, %1 %4 = select i1 %3, float %0, float %1 ret float %4 @@ -93,6 +144,11 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: mins.l %s0, %s0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: mini64: +; OPT: # %bb.0: +; OPT-NEXT: mins.l %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = icmp slt i64 %0, %1 %4 = select i1 %3, i64 %0, i64 %1 ret i64 %4 @@ -103,6 +159,11 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: mins.l %s0, %s0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: min2i64: +; OPT: # %bb.0: +; OPT-NEXT: mins.l %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = icmp sle i64 %0, %1 %4 = select i1 %3, i64 %0, i64 %1 ret i64 %4 @@ -115,6 +176,13 @@ ; CHECK-NEXT: cmov.l.lt %s1, %s0, %s2 ; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: minu64: +; OPT: # %bb.0: +; OPT-NEXT: cmpu.l %s2, %s0, %s1 +; OPT-NEXT: cmov.l.lt %s1, %s0, %s2 +; OPT-NEXT: or %s0, 0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = icmp ult i64 %0, %1 %4 = select i1 %3, i64 %0, i64 %1 ret i64 %4 @@ -127,6 +195,13 @@ ; CHECK-NEXT: cmov.l.le %s1, %s0, %s2 ; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: min2u64: +; OPT: # %bb.0: +; OPT-NEXT: cmpu.l %s2, %s0, %s1 +; OPT-NEXT: cmov.l.le %s1, %s0, %s2 +; OPT-NEXT: or %s0, 0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = icmp ule i64 %0, %1 %4 = select i1 %3, i64 %0, i64 %1 ret i64 %4 @@ -137,6 +212,11 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: mins.w.sx %s0, %s0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: mini32: +; OPT: # %bb.0: +; OPT-NEXT: mins.w.sx %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = icmp slt i32 %0, %1 %4 = select i1 %3, i32 %0, i32 %1 ret i32 %4 @@ -147,6 +227,11 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: mins.w.sx %s0, %s0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: min2i32: +; OPT: # %bb.0: +; OPT-NEXT: mins.w.sx %s0, %s0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = icmp sle i32 %0, %1 %4 = select i1 %3, i32 %0, i32 %1 ret i32 %4 @@ -159,6 +244,13 @@ ; CHECK-NEXT: cmov.w.lt %s1, %s0, %s2 ; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: minu32: +; OPT: # %bb.0: +; OPT-NEXT: cmpu.w %s2, %s0, %s1 +; OPT-NEXT: cmov.w.lt %s1, %s0, %s2 +; OPT-NEXT: or %s0, 0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = icmp ult i32 %0, %1 %4 = select i1 %3, i32 %0, i32 %1 ret i32 %4 @@ -171,6 +263,13 @@ ; CHECK-NEXT: cmov.w.le %s1, %s0, %s2 ; CHECK-NEXT: or %s0, 0, %s1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: min2u32: +; OPT: # %bb.0: +; OPT-NEXT: cmpu.w %s2, %s0, %s1 +; OPT-NEXT: cmov.w.le %s1, %s0, %s2 +; OPT-NEXT: or %s0, 0, %s1 +; OPT-NEXT: b.l.t (, %s10) %3 = icmp ule i32 %0, %1 %4 = select i1 %3, i32 %0, i32 %1 ret i32 %4 @@ -183,6 +282,13 @@ ; CHECK-NEXT: cmov.w.ne %s2, %s1, %s0 ; CHECK-NEXT: adds.w.zx %s0, %s2, (0)1 ; CHECK-NEXT: b.l.t (, %s10) +; +; OPT-LABEL: mini1: +; OPT: # %bb.0: +; OPT-NEXT: and %s2, %s1, %s0 +; OPT-NEXT: cmov.w.ne %s2, %s1, %s0 +; OPT-NEXT: adds.w.zx %s0, %s2, (0)1 +; OPT-NEXT: b.l.t (, %s10) %3 = xor i1 %0, true %4 = and i1 %3, %1 %5 = select i1 %4, i1 %0, i1 %1