[llvm] r286079 - [Hexagon] Round 5 of selection pattern simplifications

Krzysztof Parzyszek via llvm-commits llvm-commits at lists.llvm.org
Sun Nov 6 10:13:15 PST 2016


Author: kparzysz
Date: Sun Nov  6 12:13:14 2016
New Revision: 286079

URL: http://llvm.org/viewvc/llvm-project?rev=286079&view=rev
Log:
[Hexagon] Round 5 of selection pattern simplifications

Remove unnecessary type casts in patterns.

Modified:
    llvm/trunk/lib/Target/Hexagon/HexagonPatterns.td

Modified: llvm/trunk/lib/Target/Hexagon/HexagonPatterns.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonPatterns.td?rev=286079&r1=286078&r2=286079&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonPatterns.td (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonPatterns.td Sun Nov  6 12:13:14 2016
@@ -82,20 +82,20 @@ class RevCmp<PatFrag F> : PatFrag<(ops n
 // since seteq/setgt/etc. are defined as ParFrags.
 class T_cmp32_rr_pat<InstHexagon MI, PatFrag Op, ValueType VT>
   : Pat<(VT (Op I32:$Rs, I32:$Rt)),
-        (VT (MI IntRegs:$Rs, IntRegs:$Rt))>;
+        (MI IntRegs:$Rs, IntRegs:$Rt)>;
 
-def: T_cmp32_rr_pat<C2_cmpeq,  seteq, i1>;
-def: T_cmp32_rr_pat<C2_cmpgt,  setgt, i1>;
+def: T_cmp32_rr_pat<C2_cmpeq,  seteq,  i1>;
+def: T_cmp32_rr_pat<C2_cmpgt,  setgt,  i1>;
 def: T_cmp32_rr_pat<C2_cmpgtu, setugt, i1>;
 
 def: T_cmp32_rr_pat<C2_cmpgt,  RevCmp<setlt>,  i1>;
 def: T_cmp32_rr_pat<C2_cmpgtu, RevCmp<setult>, i1>;
 
-def: Pat<(i32 (select I1:$Pu, I32:$Rs, I32:$Rt)),
+def: Pat<(select I1:$Pu, I32:$Rs, I32:$Rt),
          (C2_mux PredRegs:$Pu, IntRegs:$Rs, IntRegs:$Rt)>;
 
-def: Pat<(i32 (add I32:$Rs, s32_0ImmPred:$s16)),
-         (i32 (A2_addi I32:$Rs, imm:$s16))>;
+def: Pat<(add I32:$Rs, s32_0ImmPred:$s16),
+         (A2_addi I32:$Rs, imm:$s16)>;
 
 def: Pat<(or I32:$Rs, s32_0ImmPred:$s10),
          (A2_orir IntRegs:$Rs, imm:$s10)>;
@@ -112,13 +112,13 @@ def: Pat<(not I32:$src1),
 def: Pat<(s32_0ImmPred:$s16), (A2_tfrsi imm:$s16)>;
 def: Pat<(s8_0Imm64Pred:$s8), (A2_tfrpi imm:$s8)>;
 
-def : Pat<(i32 (select I1:$Pu, s32_0ImmPred:$s8, I32:$Rs)),
+def : Pat<(select I1:$Pu, s32_0ImmPred:$s8, I32:$Rs),
           (C2_muxri I1:$Pu, imm:$s8, I32:$Rs)>;
 
-def : Pat<(i32 (select I1:$Pu, I32:$Rs, s32_0ImmPred:$s8)),
+def : Pat<(select I1:$Pu, I32:$Rs, s32_0ImmPred:$s8),
           (C2_muxir I1:$Pu, I32:$Rs, imm:$s8)>;
 
-def : Pat<(i32 (select I1:$Pu, s32_0ImmPred:$s8, s8_0ImmPred:$S8)),
+def : Pat<(select I1:$Pu, s32_0ImmPred:$s8, s8_0ImmPred:$S8),
           (C2_muxii I1:$Pu, imm:$s8, imm:$S8)>;
 
 def: Pat<(shl I32:$src1, (i32 16)),   (A2_aslh I32:$src1)>;
@@ -164,33 +164,29 @@ def: Pat<(shl (sub I32:$src1, I32:$src2)
 // (a>b)?b:a --> min(a,b) => Here check performed is '>' but the smaller value
 // is selected and the corresponding HexagonInst is passed in 'SwapInst'.
 
-multiclass T_MinMax_pats <PatFrag Op, RegisterClass RC, ValueType VT,
+multiclass T_MinMax_pats <PatFrag Op, PatLeaf Val,
                           InstHexagon Inst, InstHexagon SwapInst> {
-  def: Pat<(select (i1 (Op (VT RC:$src1), (VT RC:$src2))),
-                   (VT RC:$src1), (VT RC:$src2)),
-           (Inst RC:$src1, RC:$src2)>;
-  def: Pat<(select (i1 (Op (VT RC:$src1), (VT RC:$src2))),
-                   (VT RC:$src2), (VT RC:$src1)),
-           (SwapInst RC:$src1, RC:$src2)>;
+  def: Pat<(select (i1 (Op Val:$src1, Val:$src2)), Val:$src1, Val:$src2),
+           (Inst Val:$src1, Val:$src2)>;
+  def: Pat<(select (i1 (Op Val:$src1, Val:$src2)), Val:$src2, Val:$src1),
+           (SwapInst Val:$src1, Val:$src2)>;
 }
 
-def PositiveHalfWord : PatLeaf<(i32 IntRegs:$a), [{
+def IsPosHalf : PatLeaf<(i32 IntRegs:$a), [{
   return isPositiveHalfWord(N);
 }]>;
 
 multiclass MinMax_pats <PatFrag Op, InstHexagon Inst, InstHexagon SwapInst> {
-  defm: T_MinMax_pats<Op, IntRegs, i32, Inst, SwapInst>;
+  defm: T_MinMax_pats<Op, I32, Inst, SwapInst>;
 
-  def: Pat<(sext_inreg (i32 (select (i1 (Op (i32 PositiveHalfWord:$src1),
-                                            (i32 PositiveHalfWord:$src2))),
-                                    (i32 PositiveHalfWord:$src1),
-                                    (i32 PositiveHalfWord:$src2))), i16),
+  def: Pat<(sext_inreg (select (i1 (Op IsPosHalf:$src1, IsPosHalf:$src2)),
+                               IsPosHalf:$src1, IsPosHalf:$src2),
+                       i16),
            (Inst IntRegs:$src1, IntRegs:$src2)>;
 
-  def: Pat<(sext_inreg (i32 (select (i1 (Op (i32 PositiveHalfWord:$src1),
-                                            (i32 PositiveHalfWord:$src2))),
-                                    (i32 PositiveHalfWord:$src2),
-                                    (i32 PositiveHalfWord:$src1))), i16),
+  def: Pat<(sext_inreg (select (i1 (Op IsPosHalf:$src1, IsPosHalf:$src2)),
+                               IsPosHalf:$src2, IsPosHalf:$src1),
+                       i16),
            (SwapInst IntRegs:$src1, IntRegs:$src2)>;
 }
 
@@ -222,8 +218,7 @@ def: Pat<(i64 (and I64:$Rs, I64:$Rt)), (
 def: Pat<(i64 (or  I64:$Rs, I64:$Rt)), (A2_orp  I64:$Rs, I64:$Rt)>;
 def: Pat<(i64 (xor I64:$Rs, I64:$Rt)), (A2_xorp I64:$Rs, I64:$Rt)>;
 
-def: Pat<(i1 (not I1:$Ps)),
-         (C2_not PredRegs:$Ps)>;
+def: Pat<(i1 (not I1:$Ps)), (C2_not PredRegs:$Ps)>;
 
 def: Pat<(i1 (and I1:$Ps, I1:$Pt)),       (C2_and  I1:$Ps, I1:$Pt)>;
 def: Pat<(i1 (or  I1:$Ps, I1:$Pt)),       (C2_or   I1:$Ps, I1:$Pt)>;
@@ -235,17 +230,12 @@ def retflag : SDNode<"HexagonISD::RET_FL
                      [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>;
 def eh_return: SDNode<"HexagonISD::EH_RETURN", SDTNone, [SDNPHasChain]>;
 
-def: Pat<(br bb:$dst),
-         (J2_jump brtarget:$dst)>;
-def: Pat<(retflag),
-         (PS_jmpret (i32 R31))>;
-def: Pat<(brcond I1:$src1, bb:$offset),
-         (J2_jumpt PredRegs:$src1, bb:$offset)>;
+def: Pat<(br bb:$dst),                  (J2_jump brtarget:$dst)>;
+def: Pat<(brcond I1:$src1, bb:$block),  (J2_jumpt PredRegs:$src1, bb:$block)>;
+def: Pat<(brind I32:$dst),              (J2_jumpr IntRegs:$dst)>;
 
-def: Pat<(eh_return),
-         (EH_RETURN_JMPR (i32 R31))>;
-def: Pat<(brind I32:$dst),
-         (J2_jumpr IntRegs:$dst)>;
+def: Pat<(retflag),   (PS_jmpret (i32 R31))>;
+def: Pat<(eh_return), (EH_RETURN_JMPR (i32 R31))>;
 
 // Patterns to select load-indexed (i.e. load from base+offset).
 multiclass Loadx_pat<PatFrag Load, ValueType VT, PatLeaf ImmPred,
@@ -330,9 +320,8 @@ def: T_MType_acc_pat2 <M4_and_or, or, an
 def: T_MType_acc_pat2 <M4_xor_or, or, xor>;
 
 class T_MType_acc_pat3 <InstHexagon MI, SDNode firstOp, SDNode secOp>
-  : Pat <(i32 (secOp IntRegs:$src1, (firstOp IntRegs:$src2,
-                                              (not IntRegs:$src3)))),
-         (i32 (MI IntRegs:$src1, IntRegs:$src2, IntRegs:$src3))>;
+  : Pat <(secOp I32:$src1, (firstOp I32:$src2, (not I32:$src3))),
+         (MI IntRegs:$src1, IntRegs:$src2, IntRegs:$src3)>;
 
 def: T_MType_acc_pat3 <M4_or_andn, and, or>;
 def: T_MType_acc_pat3 <M4_and_andn, and, and>;
@@ -351,46 +340,34 @@ def Sext64Ld : PatLeaf<(i64 DoubleRegs:$
          LD->getMemoryVT().getScalarType() == MVT::i32;
 }]>;
 
-def: Pat<(i64 (mul (Aext64 I32:$src1), (Aext64 I32:$src2))),
+def: Pat<(mul (Aext64 I32:$src1), (Aext64 I32:$src2)),
          (M2_dpmpyuu_s0 IntRegs:$src1, IntRegs:$src2)>;
 
-def: Pat<(i64 (mul (Sext64 I32:$src1), (Sext64 I32:$src2))),
+def: Pat<(mul (Sext64 I32:$src1), (Sext64 I32:$src2)),
          (M2_dpmpyss_s0 IntRegs:$src1, IntRegs:$src2)>;
 
-def: Pat<(i64 (mul Sext64Ld:$src1, Sext64Ld:$src2)),
+def: Pat<(mul Sext64Ld:$src1, Sext64Ld:$src2),
          (M2_dpmpyss_s0 (LoReg DoubleRegs:$src1), (LoReg DoubleRegs:$src2))>;
 
 // Multiply and accumulate, use full result.
 // Rxx[+-]=mpy(Rs,Rt)
 
-def: Pat<(i64 (add I64:$src1,
-                   (mul (Sext64 I32:$src2),
-                        (Sext64 I32:$src3)))),
+def: Pat<(add I64:$src1, (mul (Sext64 I32:$src2), (Sext64 I32:$src3))),
          (M2_dpmpyss_acc_s0 DoubleRegs:$src1, IntRegs:$src2, IntRegs:$src3)>;
 
-def: Pat<(i64 (sub I64:$src1,
-                   (mul (Sext64 I32:$src2),
-                        (Sext64 I32:$src3)))),
+def: Pat<(sub I64:$src1, (mul (Sext64 I32:$src2), (Sext64 I32:$src3))),
          (M2_dpmpyss_nac_s0 DoubleRegs:$src1, IntRegs:$src2, IntRegs:$src3)>;
 
-def: Pat<(i64 (add I64:$src1,
-                   (mul (Aext64 I32:$src2),
-                        (Aext64 I32:$src3)))),
+def: Pat<(add I64:$src1, (mul (Aext64 I32:$src2), (Aext64 I32:$src3))),
          (M2_dpmpyuu_acc_s0 DoubleRegs:$src1, IntRegs:$src2, IntRegs:$src3)>;
 
-def: Pat<(i64 (add I64:$src1,
-                   (mul (Zext64 I32:$src2),
-                        (Zext64 I32:$src3)))),
+def: Pat<(add I64:$src1, (mul (Zext64 I32:$src2), (Zext64 I32:$src3))),
          (M2_dpmpyuu_acc_s0 DoubleRegs:$src1, IntRegs:$src2, IntRegs:$src3)>;
 
-def: Pat<(i64 (sub I64:$src1,
-                   (mul (Aext64 I32:$src2),
-                        (Aext64 I32:$src3)))),
+def: Pat<(sub I64:$src1, (mul (Aext64 I32:$src2), (Aext64 I32:$src3))),
          (M2_dpmpyuu_nac_s0 DoubleRegs:$src1, IntRegs:$src2, IntRegs:$src3)>;
 
-def: Pat<(i64 (sub I64:$src1,
-                   (mul (Zext64 I32:$src2),
-                        (Zext64 I32:$src3)))),
+def: Pat<(sub I64:$src1, (mul (Zext64 I32:$src2), (Zext64 I32:$src3))),
          (M2_dpmpyuu_nac_s0 DoubleRegs:$src1, IntRegs:$src2, IntRegs:$src3)>;
 
 class Storepi_pat<PatFrag Store, PatFrag Value, PatFrag Offset,
@@ -515,15 +492,13 @@ def: Storexm_simple_pat<truncstorei32, I
 
 def: Pat <(Sext64 I32:$src), (A2_sxtw I32:$src)>;
 
-def: Pat<(i32 (select (i1 (setlt I32:$src, 0)),
-                      (i32 (sub 0, I32:$src)),
-                      I32:$src)),
+def: Pat<(select (i1 (setlt I32:$src, 0)), (sub 0, I32:$src), I32:$src),
          (A2_abs IntRegs:$src)>;
 
 let AddedComplexity = 50 in
-def: Pat<(i32 (xor (add (sra I32:$src, (i32 31)),
-                        I32:$src),
-                   (sra I32:$src, (i32 31)))),
+def: Pat<(xor (add (sra I32:$src, (i32 31)),
+                   I32:$src),
+              (sra I32:$src, (i32 31))),
          (A2_abs IntRegs:$src)>;
 
 def: Pat<(sra I32:$src, u5_0ImmPred:$u5),
@@ -533,27 +508,25 @@ def: Pat<(srl I32:$src, u5_0ImmPred:$u5)
 def: Pat<(shl I32:$src, u5_0ImmPred:$u5),
          (S2_asl_i_r IntRegs:$src, imm:$u5)>;
 
-def: Pat<(i32 (sra (i32 (add (i32 (sra I32:$src1, u5_0ImmPred:$src2)),
-                             (i32 1))),
-                   (i32 1))),
+def: Pat<(sra (add (sra I32:$src1, u5_0ImmPred:$src2), 1), (i32 1)),
          (S2_asr_i_r_rnd IntRegs:$src1, u5_0ImmPred:$src2)>;
 
 def : Pat<(not I64:$src1),
           (A2_notp DoubleRegs:$src1)>;
 
 // Count leading zeros.
-def: Pat<(i32 (ctlz I32:$Rs)), (S2_cl0 I32:$Rs)>;
+def: Pat<(ctlz I32:$Rs), (S2_cl0 I32:$Rs)>;
 def: Pat<(i32 (trunc (ctlz I64:$Rss))), (S2_cl0p I64:$Rss)>;
 
 // Count trailing zeros: 32-bit.
-def: Pat<(i32 (cttz I32:$Rs)), (S2_ct0 I32:$Rs)>;
+def: Pat<(cttz I32:$Rs), (S2_ct0 I32:$Rs)>;
 
 // Count leading ones.
-def: Pat<(i32 (ctlz (not I32:$Rs))), (S2_cl1 I32:$Rs)>;
+def: Pat<(ctlz (not I32:$Rs)), (S2_cl1 I32:$Rs)>;
 def: Pat<(i32 (trunc (ctlz (not I64:$Rss)))), (S2_cl1p I64:$Rss)>;
 
 // Count trailing ones: 32-bit.
-def: Pat<(i32 (cttz (not I32:$Rs))), (S2_ct1 I32:$Rs)>;
+def: Pat<(cttz (not I32:$Rs)), (S2_ct1 I32:$Rs)>;
 
 def: Pat<(i32 (and I32:$Rs, (not (shl 1, u5_0ImmPred:$u5)))),
          (S2_clrbit_i IntRegs:$Rs, u5_0ImmPred:$u5)>;
@@ -1082,7 +1055,7 @@ def: Pat<(mul I32:$src1, (ineg n8_0ImmPr
          (M2_mpysin IntRegs:$src1, u8_0ImmPred:$src2)>;
 
 multiclass MinMax_pats_p<PatFrag Op, InstHexagon Inst, InstHexagon SwapInst> {
-  defm: T_MinMax_pats<Op, DoubleRegs, i64, Inst, SwapInst>;
+  defm: T_MinMax_pats<Op, I64, Inst, SwapInst>;
 }
 
 def: Pat<(add (Sext64 I32:$Rs), I64:$Rt),
@@ -1958,8 +1931,7 @@ def u7_0PosImmPred : ImmLeaf<i32, [{
 //   retval = (c-48) < 10 ? 1 : 0;
 
 let AddedComplexity = 139 in
-def: Pat<(i32 (zext (i1 (setult (i32 (and I32:$src1, 255)),
-                         u7_0PosImmPred:$src2)))),
+def: Pat<(i32 (zext (i1 (setult (and I32:$src1, 255), u7_0PosImmPred:$src2)))),
          (C2_muxii (A4_cmpbgtui IntRegs:$src1, (UDEC1 imm:$src2)), 0, 1)>;
 
 class Loada_pat<PatFrag Load, ValueType VT, PatFrag Addr, InstHexagon MI>
@@ -2031,7 +2003,6 @@ def: Loada_pat<atomic_load_16, i32, addr
 def: Loada_pat<atomic_load_32, i32, addrgp, L2_loadrigp>;
 def: Loada_pat<atomic_load_64, i64, addrgp, L2_loadrdgp>;
 
-// Map from Pd = load(globaladdress) -> Rd = memb(globaladdress), Pd = Rd
 def: Loadam_pat<load, i1, addrga, I32toI1, PS_loadrubabs>;
 def: Loadam_pat<load, i1, addrgp, I32toI1, L2_loadrubgp>;
 
@@ -2157,11 +2128,9 @@ def: Storea_pat<SwapSt<atomic_store_16>,
 def: Storea_pat<SwapSt<atomic_store_32>, I32, addrgp, PS_storeriabs>;
 def: Storea_pat<SwapSt<atomic_store_64>, I64, addrgp, PS_storerdabs>;
 
-def: Pat<(or (or (or (shl (i64 (zext (i32 (and I32:$b, (i32 65535))))),
-                          (i32 16)),
+def: Pat<(or (or (or (shl (i64 (zext (and I32:$b, (i32 65535)))), (i32 16)),
                      (i64 (zext (i32 (and I32:$a, (i32 65535)))))),
-                 (shl (i64 (anyext (i32 (and I32:$c, (i32 65535))))),
-                      (i32 32))),
+                 (shl (i64 (anyext (and I32:$c, (i32 65535)))), (i32 32))),
              (shl (Aext64 I32:$d), (i32 48))),
          (Insert4 IntRegs:$a, IntRegs:$b, IntRegs:$c, IntRegs:$d)>;
 
@@ -2187,12 +2156,11 @@ def ftoi : SDNodeXForm<fpimm, [{
 }]>;
 
 
-def: Pat<(sra (i64 (add (i64 (sra I64:$src1, u6_0ImmPred:$src2)), 1)), (i32 1)),
+def: Pat<(sra (i64 (add (sra I64:$src1, u6_0ImmPred:$src2), 1)), (i32 1)),
          (S2_asr_i_p_rnd I64:$src1, imm:$src2)>;
 
 def SDTHexagonI32I64: SDTypeProfile<1, 1, [SDTCisVT<0, i32>,
                                            SDTCisVT<1, i64>]>;
-
 def HexagonPOPCOUNT: SDNode<"HexagonISD::POPCOUNT", SDTHexagonI32I64>;
 
 def: Pat<(HexagonPOPCOUNT I64:$Rss), (S5_popcountp I64:$Rss)>;




More information about the llvm-commits mailing list