[llvm] dfb98d8 - [FuncSpec] Prevent assertion failure when no store value is found

Jonathon Penix via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 7 13:58:13 PST 2023


Author: Jonathon Penix
Date: 2023-02-07T13:57:27-08:00
New Revision: dfb98d8e2a3754e8e9ed66b87c6b89c634980da4

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

LOG: [FuncSpec] Prevent assertion failure when no store value is found

If the only user of the Alloca argument provided to getPromotableAlloca()
is the same as the Call argument, StoreValue is never set and results
in an assertion failure that isa<> was used on a nullptr when passed into
getCandidateConstant().

This was originally seen when trying to build SPEC 2006 416.gamess using
flang with lto enabled.

Differential Revision: https://reviews.llvm.org/D143457

Added: 
    llvm/test/Transforms/FunctionSpecialization/compiler-crash-promote-alloca.ll

Modified: 
    llvm/lib/Transforms/IPO/FunctionSpecialization.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp b/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp
index 4a7efb28e8539..51bc1786fdc79 100644
--- a/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp
+++ b/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp
@@ -125,6 +125,10 @@ Constant *FunctionSpecializer::getPromotableAlloca(AllocaInst *Alloca,
     // Bail if there is any other unknown usage.
     return nullptr;
   }
+
+  if (!StoreValue)
+    return nullptr;
+
   return getCandidateConstant(StoreValue);
 }
 

diff  --git a/llvm/test/Transforms/FunctionSpecialization/compiler-crash-promote-alloca.ll b/llvm/test/Transforms/FunctionSpecialization/compiler-crash-promote-alloca.ll
new file mode 100644
index 0000000000000..3946b2dd97f73
--- /dev/null
+++ b/llvm/test/Transforms/FunctionSpecialization/compiler-crash-promote-alloca.ll
@@ -0,0 +1,27 @@
+; RUN: opt -S --passes="ipsccp<func-spec>" -force-function-specialization < %s | FileCheck %s
+
+; Tests that `bar` has been specialized and that the compiler did not crash
+; while attempting to promote the alloca in `entry`.
+; CHECK: bar.1
+
+ at block = internal global [8 x i8] zeroinitializer, align 1
+
+define dso_local void @entry() {
+  %1 = alloca i32, align 4
+  call void @foo(ptr nonnull %1)
+  ret void
+}
+
+define internal void @foo(ptr nocapture readnone %0) {
+  %2 = alloca i32, align 4
+  call void @bar(ptr nonnull %2, ptr nonnull @block)
+  call void @bar(ptr nonnull %2, ptr nonnull getelementptr inbounds ([8 x i8], ptr @block, i64 0, i64 4))
+  ret void
+}
+
+define internal void @bar(ptr nocapture readonly %0, ptr nocapture readonly %1) {
+  %3 = load i32, ptr %0, align 4
+  %4 = load i32, ptr %1, align 4
+  ret void
+}
+


        


More information about the llvm-commits mailing list