[Hexagon] Check if vector is empty before calling back()
authorKrzysztof Parzyszek <kparzysz@quicinc.com>
Thu, 1 Dec 2022 19:21:53 +0000 (11:21 -0800)
committerKrzysztof Parzyszek <kparzysz@quicinc.com>
Thu, 1 Dec 2022 19:41:47 +0000 (11:41 -0800)
llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp
llvm/test/CodeGen/Hexagon/autohvx/hvx-idiom-empty-results.ll [new file with mode: 0644]

index f266e50..9837ca9 100644 (file)
@@ -1381,7 +1381,7 @@ auto HvxIdioms::processFxpMul(Instruction &In, const FxpOp &Op) const
       break;
   }
 
-  if (Results.back() == nullptr)
+  if (Results.empty() || Results.back() == nullptr)
     return nullptr;
 
   Value *Cat = HVC.concat(Builder, Results);
diff --git a/llvm/test/CodeGen/Hexagon/autohvx/hvx-idiom-empty-results.ll b/llvm/test/CodeGen/Hexagon/autohvx/hvx-idiom-empty-results.ll
new file mode 100644 (file)
index 0000000..d281a89
--- /dev/null
@@ -0,0 +1,46 @@
+; RUN: llc -march=hexagon < %s | FileCheck %s
+
+; Check that this doesn't crash.
+; CHECK: func_end
+
+target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048"
+target triple = "hexagon"
+
+define void @f0(i8* %a0, i32* %a1, i32* %a2) unnamed_addr #0 {
+b0:
+  %v0 = load i8, i8* %a0, align 1
+  %v1 = load i32, i32* %a1, align 4
+  %v2 = load i32, i32* %a2, align 4
+  %v3 = zext i8 %v0 to i32
+  %v4 = getelementptr inbounds i8, i8* null, i32 %v1
+  %v5 = add nsw i32 %v2, 2
+  %v6 = getelementptr inbounds i8, i8* %v4, i32 0
+  %v7 = getelementptr inbounds i8, i8* %v6, i32 0
+  %v8 = insertelement <16 x i32> poison, i32 %v3, i64 0
+  %v9 = shufflevector <16 x i32> %v8, <16 x i32> poison, <16 x i32> zeroinitializer
+  br label %b1
+
+b1:                                               ; preds = %b3, %b2
+  %v10 = phi i8* [ %v7, %b0 ], [ %v19, %b1 ]
+  %v11 = add nsw <16 x i32> zeroinitializer, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
+  %v12 = mul nsw <16 x i32> %v11, %v9
+  %v13 = add nsw <16 x i32> %v12, <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>
+  %v14 = ashr <16 x i32> %v13, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
+  %v15 = tail call <16 x i32> @llvm.smin.v16i32(<16 x i32> %v14, <16 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>)
+  %v16 = add nsw <16 x i32> %v15, <i32 128, i32 128, i32 128, i32 128, i32 128, i32 128, i32 128, i32 128, i32 128, i32 128, i32 128, i32 128, i32 128, i32 128, i32 128, i32 128>
+  %v17 = select <16 x i1> zeroinitializer, <16 x i32> zeroinitializer, <16 x i32> %v16
+  %v18 = trunc <16 x i32> %v17 to <16 x i8>
+  %v19 = getelementptr inbounds i8, i8* %v10, i32 1
+  %v20 = bitcast i8* %v19 to <16 x i8>*
+  store <16 x i8> %v18, <16 x i8>* %v20, align 1
+  br label %b1, !llvm.loop !0
+}
+
+; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
+declare <16 x i32> @llvm.smin.v16i32(<16 x i32>, <16 x i32>) #1
+
+attributes #0 = { "target-features"="+hvx-length64b,+hvxv66,+v66,-long-calls,-small-data" }
+attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
+
+!0 = distinct !{!0, !1}
+!1 = !{!"llvm.loop.mustprogress"}