[llvm] r285297 - [Hexagon] Do not expand ISD::SELECT for HVX vectors

Krzysztof Parzyszek via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 27 07:30:16 PDT 2016


Author: kparzysz
Date: Thu Oct 27 09:30:16 2016
New Revision: 285297

URL: http://llvm.org/viewvc/llvm-project?rev=285297&view=rev
Log:
[Hexagon] Do not expand ISD::SELECT for HVX vectors

Added:
    llvm/trunk/test/CodeGen/Hexagon/v60-vsel1.ll
Modified:
    llvm/trunk/lib/Target/Hexagon/HexagonISelLowering.cpp
    llvm/trunk/lib/Target/Hexagon/HexagonInstrInfoV60.td

Modified: llvm/trunk/lib/Target/Hexagon/HexagonISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonISelLowering.cpp?rev=285297&r1=285296&r2=285297&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonISelLowering.cpp Thu Oct 27 09:30:16 2016
@@ -1957,7 +1957,7 @@ HexagonTargetLowering::HexagonTargetLowe
     ISD::FRINT,   ISD::FNEARBYINT,            ISD::FROUND,  ISD::FFLOOR,
     ISD::FMINNUM, ISD::FMAXNUM, ISD::FSINCOS,
     // Misc:
-    ISD::SELECT,  ISD::ConstantPool,
+    ISD::BR_CC,   ISD::SELECT_CC,             ISD::ConstantPool,
     // Vector:
     ISD::BUILD_VECTOR,          ISD::SCALAR_TO_VECTOR,
     ISD::EXTRACT_VECTOR_ELT,    ISD::INSERT_VECTOR_ELT,
@@ -1979,12 +1979,15 @@ HexagonTargetLowering::HexagonTargetLowe
       setTruncStoreAction(VT, TargetVT, Expand);
     }
 
+    // Normalize all inputs to SELECT to be vectors of i32.
+    if (VT.getVectorElementType() != MVT::i32) {
+      MVT VT32 = MVT::getVectorVT(MVT::i32, VT.getSizeInBits()/32);
+      setOperationAction(ISD::SELECT, VT, Promote);
+      AddPromotedToType(ISD::SELECT, VT, VT32);
+    }
     setOperationAction(ISD::SRA, VT, Custom);
     setOperationAction(ISD::SHL, VT, Custom);
     setOperationAction(ISD::SRL, VT, Custom);
-
-    setOperationAction(ISD::BR_CC,     VT, Expand);
-    setOperationAction(ISD::SELECT_CC, VT, Expand);
   }
 
   // Types natively supported:

Modified: llvm/trunk/lib/Target/Hexagon/HexagonInstrInfoV60.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonInstrInfoV60.td?rev=285297&r1=285296&r2=285297&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonInstrInfoV60.td (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonInstrInfoV60.td Thu Oct 27 09:30:16 2016
@@ -977,18 +977,18 @@ let isCodeGenOnly = 1, isPseudo = 1, has
         "", []>, Requires<[HasV60T,UseHVXDbl]>;
 }
 
-class VSelPat<ValueType VT, RegisterClass RC, InstHexagon MI>
-  : Pat<(selectcc I32:$lhs, I32:$rhs, (VT RC:$tval), (VT RC:$fval), SETEQ),
-        (MI (C2_cmpeq I32:$lhs, I32:$rhs), RC:$tval, RC:$fval)>;
-
-def: VSelPat<v16i32, VectorRegs, PS_vselect>,
-      Requires<[HasV60T,UseHVXSgl]>;
-def: VSelPat<v32i32, VecDblRegs, PS_wselect>,
-      Requires<[HasV60T,UseHVXSgl]>;
-def: VSelPat<v32i32, VectorRegs128B, PS_vselect_128B>,
-      Requires<[HasV60T,UseHVXDbl]>;
-def: VSelPat<v64i32, VecDblRegs128B, PS_wselect_128B>,
-      Requires<[HasV60T,UseHVXDbl]>;
+let Predicates = [HasV60T,UseHVXSgl] in {
+  def: Pat<(select I1:$Pu, (v16i32 VectorRegs:$Vs), VectorRegs:$Vt),
+           (PS_vselect I1:$Pu, VectorRegs:$Vs, VectorRegs:$Vt)>;
+  def: Pat<(select I1:$Pu, (v32i32 VecDblRegs:$Vs), VecDblRegs:$Vt),
+           (PS_wselect I1:$Pu, VecDblRegs:$Vs, VecDblRegs:$Vt)>;
+}
+let Predicates = [HasV60T,UseHVXDbl] in {
+  def: Pat<(select I1:$Pu, (v32i32 VectorRegs128B:$Vs), VectorRegs128B:$Vt),
+           (PS_vselect_128B I1:$Pu, VectorRegs128B:$Vs, VectorRegs128B:$Vt)>;
+  def: Pat<(select I1:$Pu, (v64i32 VecDblRegs128B:$Vs), VecDblRegs128B:$Vt),
+           (PS_wselect_128B I1:$Pu, VecDblRegs128B:$Vs, VecDblRegs128B:$Vt)>;
+}
 
 
 let hasNewValue = 1 in

Added: llvm/trunk/test/CodeGen/Hexagon/v60-vsel1.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/v60-vsel1.ll?rev=285297&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/v60-vsel1.ll (added)
+++ llvm/trunk/test/CodeGen/Hexagon/v60-vsel1.ll Thu Oct 27 09:30:16 2016
@@ -0,0 +1,69 @@
+; RUN: llc -march=hexagon < %s | FileCheck %s
+
+; CHECK: if (p{{[0-3]}}) v{{[0-9]+}} = v{{[0-9]+}}
+
+target triple = "hexagon"
+
+; Function Attrs: nounwind
+define void @fast9_detect_coarse(i8* nocapture readnone %img, i32 %xsize, i32 %stride, i32 %barrier, i32* nocapture %bitmask, i32 %boundary) #0 {
+entry:
+  %0 = bitcast i32* %bitmask to <16 x i32>*
+  %1 = mul i32 %boundary, -2
+  %sub = add i32 %1, %xsize
+  %rem = and i32 %boundary, 63
+  %add = add i32 %sub, %rem
+  %2 = tail call <16 x i32> @llvm.hexagon.V6.lvsplatw(i32 -1)
+  %3 = tail call <16 x i32> @llvm.hexagon.V6.lvsplatw(i32 1)
+  %4 = tail call <512 x i1> @llvm.hexagon.V6.pred.scalar2(i32 %add)
+  %5 = tail call <16 x i32> @llvm.hexagon.V6.vandqrt.acc(<16 x i32> %3, <512 x i1> %4, i32 12)
+  %and4 = and i32 %add, 511
+  %cmp = icmp eq i32 %and4, 0
+  %sMaskR.0 = select i1 %cmp, <16 x i32> %2, <16 x i32> %5
+  %cmp547 = icmp sgt i32 %add, 0
+  br i1 %cmp547, label %for.body.lr.ph, label %for.end
+
+for.body.lr.ph:                                   ; preds = %entry
+  %6 = tail call <512 x i1> @llvm.hexagon.V6.pred.scalar2(i32 %boundary)
+  %7 = tail call <16 x i32> @llvm.hexagon.V6.vandqrt(<512 x i1> %6, i32 16843009)
+  %8 = tail call <16 x i32> @llvm.hexagon.V6.vnot(<16 x i32> %7)
+  %9 = add i32 %rem, %xsize
+  %10 = add i32 %9, -1
+  %11 = add i32 %10, %1
+  %12 = lshr i32 %11, 9
+  %13 = mul i32 %12, 16
+  %14 = add nuw nsw i32 %13, 16
+  %scevgep = getelementptr i32, i32* %bitmask, i32 %14
+  br label %for.body
+
+for.body:                                         ; preds = %for.body.lr.ph, %for.body
+  %i.050 = phi i32 [ %add, %for.body.lr.ph ], [ %sub6, %for.body ]
+  %sMask.049 = phi <16 x i32> [ %8, %for.body.lr.ph ], [ %2, %for.body ]
+  %optr.048 = phi <16 x i32>* [ %0, %for.body.lr.ph ], [ %incdec.ptr, %for.body ]
+  %15 = tail call <16 x i32> @llvm.hexagon.V6.vand(<16 x i32> undef, <16 x i32> %sMask.049)
+  %incdec.ptr = getelementptr inbounds <16 x i32>, <16 x i32>* %optr.048, i32 1
+  store <16 x i32> %15, <16 x i32>* %optr.048, align 64
+  %sub6 = add nsw i32 %i.050, -512
+  %cmp5 = icmp sgt i32 %sub6, 0
+  br i1 %cmp5, label %for.body, label %for.cond.for.end_crit_edge
+
+for.cond.for.end_crit_edge:                       ; preds = %for.body
+  %scevgep51 = bitcast i32* %scevgep to <16 x i32>*
+  br label %for.end
+
+for.end:                                          ; preds = %for.cond.for.end_crit_edge, %entry
+  %optr.0.lcssa = phi <16 x i32>* [ %scevgep51, %for.cond.for.end_crit_edge ], [ %0, %entry ]
+  %16 = load <16 x i32>, <16 x i32>* %optr.0.lcssa, align 64
+  %17 = tail call <16 x i32> @llvm.hexagon.V6.vand(<16 x i32> %16, <16 x i32> %sMaskR.0)
+  store <16 x i32> %17, <16 x i32>* %optr.0.lcssa, align 64
+  ret void
+}
+
+declare <16 x i32> @llvm.hexagon.V6.lvsplatw(i32) #1
+declare <512 x i1> @llvm.hexagon.V6.pred.scalar2(i32) #1
+declare <16 x i32> @llvm.hexagon.V6.vandqrt.acc(<16 x i32>, <512 x i1>, i32) #1
+declare <16 x i32> @llvm.hexagon.V6.vandqrt(<512 x i1>, i32) #1
+declare <16 x i32> @llvm.hexagon.V6.vnot(<16 x i32>) #1
+declare <16 x i32> @llvm.hexagon.V6.vand(<16 x i32>, <16 x i32>) #1
+
+attributes #0 = { nounwind "target-cpu"="hexagonv60" "target-features"="+hvx" }
+attributes #1 = { nounwind readnone }




More information about the llvm-commits mailing list