forked from OSchip/llvm-project
Fix assertion failure in global-merge with unused ConstantExpr
The global-merge pass was crashing because it assumes that all ConstantExprs (reached via the global variables that they use) have at least one user. I haven't worked out a way to test this, as an unused ConstantExpr cannot be represented by serialised IR, and global-merge can only be run in llc, which does not run any passes which can make a ConstantExpr dead. This (reduced to the point of silliness) C code triggers this bug when compiled for arm-none-eabi at -O1: static a = 7; static volatile b[10] = {&a}; c; main() { c = 0; for (; c < 10;) printf(b[c]); } Differential Revision: http://reviews.llvm.org/D10314 llvm-svn: 239308
This commit is contained in:
parent
6aca6f0be5
commit
8379e298b3
|
@ -280,6 +280,8 @@ bool GlobalMerge::doMerge(SmallVectorImpl<GlobalVariable*> &Globals,
|
|||
// users, so look through ConstantExpr...
|
||||
Use *UI, *UE;
|
||||
if (ConstantExpr *CE = dyn_cast<ConstantExpr>(U.getUser())) {
|
||||
if (CE->use_empty())
|
||||
continue;
|
||||
UI = &*CE->use_begin();
|
||||
UE = nullptr;
|
||||
} else if (isa<Instruction>(U.getUser())) {
|
||||
|
|
Loading…
Reference in New Issue