[llvm] 61ca996 - [Hexagon] Don't generate short vectors in ISD::SELECT in preprocessing

Krzysztof Parzyszek via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 11 13:28:04 PST 2020


Author: Krzysztof Parzyszek
Date: 2020-02-11T15:27:33-06:00
New Revision: 61ca996e79bbde58623320ea1f35423ef8a0aa64

URL: https://github.com/llvm/llvm-project/commit/61ca996e79bbde58623320ea1f35423ef8a0aa64
DIFF: https://github.com/llvm/llvm-project/commit/61ca996e79bbde58623320ea1f35423ef8a0aa64.diff

LOG: [Hexagon] Don't generate short vectors in ISD::SELECT in preprocessing

Selection DAG preprocessing runs long after legalization, so make sure
that the types can be handled by the selection code.

Added: 
    llvm/test/CodeGen/Hexagon/isel-select-v4i8.ll

Modified: 
    llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp
index 481869cb8f2c..8632250fa7f5 100644
--- a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp
@@ -1187,7 +1187,7 @@ void HexagonDAGToDAGISel::ppHoistZextI1(std::vector<SDNode*> &&Nodes) {
         Ops[i] = U->getOperand(i);
       EVT BVT = Ops[I1N].getValueType();
 
-      SDLoc dl(U);
+      const SDLoc &dl(U);
       SDValue C0 = DAG.getConstant(0, dl, BVT);
       SDValue C1 = DAG.getConstant(1, dl, BVT);
       SDValue If0, If1;
@@ -1205,8 +1205,15 @@ void HexagonDAGToDAGISel::ppHoistZextI1(std::vector<SDNode*> &&Nodes) {
         Ops[I1N] = C1;
         If1 = DAG.getNode(UseOpc, dl, UVT, Ops);
       }
-      SDValue Sel = DAG.getNode(ISD::SELECT, dl, UVT, OpI1, If1, If0);
-      DAG.ReplaceAllUsesWith(U, Sel.getNode());
+      // We're generating a SELECT way after legalization, so keep the types
+      // simple.
+      unsigned UW = UVT.getSizeInBits();
+      EVT SVT = (UW == 32 || UW == 64) ? MVT::getIntegerVT(UW) : UVT;
+      SDValue Sel = DAG.getNode(ISD::SELECT, dl, SVT, OpI1,
+                                DAG.getBitcast(SVT, If1),
+                                DAG.getBitcast(SVT, If0));
+      SDValue Ret = DAG.getBitcast(UVT, Sel);
+      DAG.ReplaceAllUsesWith(U, Ret.getNode());
     }
   }
 }

diff  --git a/llvm/test/CodeGen/Hexagon/isel-select-v4i8.ll b/llvm/test/CodeGen/Hexagon/isel-select-v4i8.ll
new file mode 100644
index 000000000000..58f72a15497a
--- /dev/null
+++ b/llvm/test/CodeGen/Hexagon/isel-select-v4i8.ll
@@ -0,0 +1,35 @@
+; RUN: llc -march=hexagon < %s | FileCheck %s
+
+; This used to fail:
+; LLVM ERROR: Cannot select: t54: v4i8 = select t50, t53, t52
+
+; CHECK: jumpr r31
+
+target triple = "hexagon"
+
+ at g0 = external dso_local unnamed_addr constant [41 x i8], align 1
+define dso_local void @f0() local_unnamed_addr #0 {
+b0:
+  %v0 = load <16 x i32>, <16 x i32>* undef, align 16
+  %v1 = icmp eq <16 x i32> %v0, zeroinitializer
+  %v2 = or <16 x i1> %v1, zeroinitializer
+  %v3 = or <16 x i1> %v2, zeroinitializer
+  %v4 = or <16 x i1> %v3, zeroinitializer
+  %v5 = shufflevector <16 x i1> %v4, <16 x i1> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
+  %v6 = or <16 x i1> %v4, %v5
+  %v7 = extractelement <16 x i1> %v6, i32 0
+  %v8 = or i1 %v7, undef
+  %v9 = or i1 %v8, undef
+  br i1 %v9, label %b2, label %b1
+
+b1:                                               ; preds = %b0
+  call void (i8*, ...) @f1(i8* getelementptr inbounds ([41 x i8], [41 x i8]* @g0, i32 0, i32 0))
+  unreachable
+
+b2:                                               ; preds = %b0
+  ret void
+}
+declare dso_local void @f1(i8*, ...) local_unnamed_addr #1
+
+attributes #0 = { "target-cpu"="hexagonv66" "target-features"="+hvx-length64b,+hvxv66,+v66,-long-calls" }
+attributes #1 = { "use-soft-float"="false" }


        


More information about the llvm-commits mailing list