[llvm] 360f82f - [Lint] Fix crash for insert/extract on scalable vector

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 4 03:48:56 PDT 2024


Author: Nikita Popov
Date: 2024-09-04T12:48:46+02:00
New Revision: 360f82f3703fa57de42a2f998b172551f294e11a

URL: https://github.com/llvm/llvm-project/commit/360f82f3703fa57de42a2f998b172551f294e11a
DIFF: https://github.com/llvm/llvm-project/commit/360f82f3703fa57de42a2f998b172551f294e11a.diff

LOG: [Lint] Fix crash for insert/extract on scalable vector

Don't assume the vector is fixed size. For scalable vectors, do
not report an error, as indices outside the minimum range may be
valid.

Added: 
    

Modified: 
    llvm/lib/Analysis/Lint.cpp
    llvm/test/Analysis/Lint/scalable.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/Lint.cpp b/llvm/lib/Analysis/Lint.cpp
index 29b5d38fc93b76..415b16d25efd23 100644
--- a/llvm/lib/Analysis/Lint.cpp
+++ b/llvm/lib/Analysis/Lint.cpp
@@ -590,19 +590,20 @@ void Lint::visitIndirectBrInst(IndirectBrInst &I) {
 
 void Lint::visitExtractElementInst(ExtractElementInst &I) {
   if (ConstantInt *CI = dyn_cast<ConstantInt>(findValue(I.getIndexOperand(),
-                                                        /*OffsetOk=*/false)))
-    Check(
-        CI->getValue().ult(
-            cast<FixedVectorType>(I.getVectorOperandType())->getNumElements()),
-        "Undefined result: extractelement index out of range", &I);
+                                                        /*OffsetOk=*/false))) {
+    ElementCount EC = I.getVectorOperandType()->getElementCount();
+    Check(EC.isScalable() || CI->getValue().ult(EC.getFixedValue()),
+          "Undefined result: extractelement index out of range", &I);
+  }
 }
 
 void Lint::visitInsertElementInst(InsertElementInst &I) {
   if (ConstantInt *CI = dyn_cast<ConstantInt>(findValue(I.getOperand(2),
-                                                        /*OffsetOk=*/false)))
-    Check(CI->getValue().ult(
-              cast<FixedVectorType>(I.getType())->getNumElements()),
+                                                        /*OffsetOk=*/false))) {
+    ElementCount EC = I.getType()->getElementCount();
+    Check(EC.isScalable() || CI->getValue().ult(EC.getFixedValue()),
           "Undefined result: insertelement index out of range", &I);
+  }
 }
 
 void Lint::visitUnreachableInst(UnreachableInst &I) {

diff  --git a/llvm/test/Analysis/Lint/scalable.ll b/llvm/test/Analysis/Lint/scalable.ll
index 73100eca8835cb..4bcc4dae8d8371 100644
--- a/llvm/test/Analysis/Lint/scalable.ll
+++ b/llvm/test/Analysis/Lint/scalable.ll
@@ -1,15 +1,20 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
-; RUN: opt -S -passes=lint < %s | FileCheck %s
+; RUN: opt -S -passes=lint -disable-output < %s 2>&1 | FileCheck %s --allow-empty
 
-; Make sure we don't crash.
-
-define <vscale x 8 x i8> @test() {
-; CHECK-LABEL: define <vscale x 8 x i8> @test() {
-; CHECK-NEXT:    [[A:%.*]] = alloca <vscale x 8 x i8>, align 8
-; CHECK-NEXT:    [[V:%.*]] = load <vscale x 8 x i8>, ptr [[A]], align 8
-; CHECK-NEXT:    ret <vscale x 8 x i8> [[V]]
-;
+; CHECK-NOT: Buffer overflow
+define <vscale x 8 x i8> @alloca_access() {
   %a = alloca <vscale x 8 x i8>
   %v = load <vscale x 8 x i8>, ptr %a
   ret <vscale x 8 x i8> %v
 }
+
+; CHECK-NOT: insertelement index out of range
+define <vscale x 8 x half> @insertelement() {
+  %insert = insertelement <vscale x 8 x half> poison, half 0xH0000, i64 100
+  ret <vscale x 8 x half> %insert
+}
+
+; CHECK-NOT: extract index out of range
+define half @extractelement(<vscale x 8 x half> %v) {
+  %insert = extractelement <vscale x 8 x half> %v, i64 100
+  ret half %insert
+}


        


More information about the llvm-commits mailing list