[llvm] 2191137 - [Hexagon] Check if vector is empty before calling back()

Krzysztof Parzyszek via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 1 11:41:59 PST 2022


Author: Krzysztof Parzyszek
Date: 2022-12-01T11:41:47-08:00
New Revision: 2191137dff5e1568319e0605c065678b79184346

URL: https://github.com/llvm/llvm-project/commit/2191137dff5e1568319e0605c065678b79184346
DIFF: https://github.com/llvm/llvm-project/commit/2191137dff5e1568319e0605c065678b79184346.diff

LOG: [Hexagon] Check if vector is empty before calling back()

Added: 
    llvm/test/CodeGen/Hexagon/autohvx/hvx-idiom-empty-results.ll

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

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp b/llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp
index f266e50573cf..9837ca985c5d 100644
--- a/llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp
@@ -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
index 000000000000..d281a8962d8f
--- /dev/null
+++ b/llvm/test/CodeGen/Hexagon/autohvx/hvx-idiom-empty-results.ll
@@ -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"}


        


More information about the llvm-commits mailing list