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

Axel Y. Rivera via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 16 15:53:19 PST 2021


ayrivera added inline comments.


================
Comment at: llvm/lib/Transforms/IPO/GlobalOpt.cpp:309
+      if (Init->isNullValue()) {
+        LI->replaceAllUsesWith(Constant::getNullValue(LI->getType()));
+        EraseFromParent(LI);
----------------
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}


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