[PATCH] D114889: [GlobalOpt] Simplify CleanupConstantGlobalUsers()

Nikita Popov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 17 03:29:39 PST 2021


nikic added inline comments.


================
Comment at: llvm/lib/Transforms/IPO/GlobalOpt.cpp:309
+      if (Init->isNullValue()) {
+        LI->replaceAllUsesWith(Constant::getNullValue(LI->getType()));
+        EraseFromParent(LI);
----------------
ayrivera wrote:
> Hi,
> 
> I have a small test case that crashes in this line when it tries to create a null value for a x86_mmx load instruction:
> 
> 
> ```
> test> opt -S -globalopt simple.ll
> Cannot create a null constant of that type!  
> UNREACHABLE executed at llvm/llvm/lib/IR/Constants.cpp:384!                                                          
> PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace.                                                               
> Stack dump:                                                               
> 0.      Program arguments: opt -S -globalopt simple.ll                    
>  #0 0x00000000038d2aed llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) llvm/lib/Support/Unix/Signals.inc:565:0                                                                        
>  #1 0x00000000038d2ba4 PrintStackTraceSignalHandler(void*) llvm/lib/Support/Unix/Signals.inc:632:0              
>  #2 0x00000000038d0b69 llvm::sys::RunSignalHandlers() llvm/lib/Support/Signals.cpp:96:0                         
>  #3 0x00000000038d2531 SignalHandler(int) llvm/lib/Support/Unix/Signals.inc:407:0                               
>  #4 0x00007fbeb4870dd0 __restore_rt sigaction.c:0:0                       
>  #5 0x00007fbeb336170f raise (/lib64/libc.so.6+0x3770f)                   
>  #6 0x00007fbeb334bb25 abort (/lib64/libc.so.6+0x21b25)                   
>  #7 0x000000000381316e bindingsErrorHandler(void*, char const*, bool) llvm/lib/Support/ErrorHandling.cpp:218:0  
>  #8 0x0000000002ba65ab llvm::Constant::getNullValue(llvm::Type*) llvm/lib/IR/Constants.cpp:384:0                
>  #9 0x0000000002f4c4cd CleanupConstantGlobalUsers(llvm::GlobalVariable*, llvm::DataLayout const&) llvm/lib/Transforms/IPO/GlobalOpt.cpp:309:0                                             
> #10 0x0000000002f51b41 processInternalGlobal(llvm::GlobalVariable*, llvm::GlobalStatus const&, llvm::function_ref<llvm::TargetTransformInfo& (llvm::Function&)>, llvm::function_ref<llvm::TargetLibraryInfo& (llvm::Function&)>, llvm::function_ref<llvm::DominatorTree& (llvm::Function&)>) llvm/lib/Transforms/IPO/GlobalOpt.cpp:1556:0     
> #11 0x0000000002f520f3 processGlobal(llvm::GlobalValue&, llvm::function_ref<llvm::TargetTransformInfo& (llvm::Function&)>, llvm::function_ref<llvm::TargetLibraryInfo& (llvm::Function&)>, llvm::function_ref<llvm::DominatorTree& (llvm::Function&)>) llvm/lib/Transforms/IPO/GlobalOpt.cpp:1670:0
> #12 0x0000000002f53bf7 OptimizeGlobalVars(llvm::Module&, llvm::function_ref<llvm::TargetTransformInfo& (llvm::Function&)>, llvm::function_ref<llvm::TargetLibraryInfo& (llvm::Function&)>, llvm::function_ref<llvm::DominatorTree& (llvm::Function&)>, llvm::SmallPtrSetImpl<llvm::Comdat const*>&) llvm/lib/Transforms/IPO/GlobalOpt.cpp:2065:0
> #13 0x0000000002f560e5 optimizeGlobalsInModule(llvm::Module&, llvm::DataLayout const&, llvm::function_ref<llvm::TargetLibraryInfo& (llvm::Function&)>, llvm::function_ref<llvm::TargetTransformInfo& (llvm::Function&)>, llvm::function_ref<llvm::BlockFrequencyInfo& (llvm::Function&)>, llvm::function_ref<llvm::DominatorTree& (llvm::Function&)>) llvm/lib/Transforms/IPO/GlobalOpt.cpp:2639:0
> #14 0x0000000002f5632a llvm::GlobalOptPass::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) llvm/lib/Transforms/IPO/GlobalOpt.cpp:2678:0
> #15 0x0000000003cd2e24 llvm::detail::PassModel<llvm::Module, llvm::GlobalOptPass, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Module> >::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) llvm/include/llvm/IR/PassManagerInternal.h:89:0
> #16 0x0000000002d7811d llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module> >::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) llvm/include/llvm/IR/PassManager.h:525:0
> #17 0x00000000019c0c20 llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::StringRef, llvm::ArrayRef<llvm::StringRef>, llvm::opt_tool::OutputKind, llvm::opt_tool::VerifierKind, bool, bool, bool, bool, bool) llvm/tools/opt/NewPMDriver.cpp:487:0
> #18 0x00000000019f0e19 main llvm/tools/opt/opt.cpp:818:0
> #19 0x00007fbeb334d6a3 __libc_start_main (/lib64/libc.so.6+0x236a3)
> #20 0x00000000019ba76e _start (bin/opt+0x19ba76e)
> Aborted (core dumped)
> ```
> 
> It seems that calling getNullValue for a X86_MMX type is not supported. From my understanding, this type doesn't supports LLVM::Constant (https://llvm.org/docs/LangRef.html#x86-mmx-type). I attached a simple test case that reproduce the issue with the following command:
> 
> 
> ```
> opt -S -globalopt simple.ll
> ```
> 
> {F21062390}
Thanks for the report! I submitted D115924 to fix this and related issues.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D114889/new/

https://reviews.llvm.org/D114889



More information about the llvm-commits mailing list