mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-26 05:56:51 +00:00
[ConstantFolding] Support folding loads from a GlobalAlias
The MSVC ABI requires that we generate an alias for the vtable which means looking through a GlobalAlias which cannot be overridden improves our ability to devirtualize. Found while investigating PR20801. Patch by Andrew Zhogin! Differential Revision: http://reviews.llvm.org/D11306 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242955 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
186b8ca6dc
commit
1b072f2beb
@ -532,6 +532,10 @@ Constant *llvm::ConstantFoldLoadFromConstPtr(Constant *C,
|
||||
if (GV->isConstant() && GV->hasDefinitiveInitializer())
|
||||
return GV->getInitializer();
|
||||
|
||||
if (auto *GA = dyn_cast<GlobalAlias>(C))
|
||||
if (GA->getAliasee() && !GA->mayBeOverridden())
|
||||
return ConstantFoldLoadFromConstPtr(GA->getAliasee(), DL);
|
||||
|
||||
// If the loaded value isn't a constant expr, we can't handle it.
|
||||
ConstantExpr *CE = dyn_cast<ConstantExpr>(C);
|
||||
if (!CE)
|
||||
|
11
test/Transforms/SCCP/global-alias-constprop.ll
Normal file
11
test/Transforms/SCCP/global-alias-constprop.ll
Normal file
@ -0,0 +1,11 @@
|
||||
; RUN: opt < %s -sccp -S | FileCheck %s
|
||||
|
||||
@0 = private unnamed_addr constant [2 x i32] [i32 -1, i32 1]
|
||||
@"\01??_7A@@6B@" = unnamed_addr alias getelementptr inbounds ([2 x i32], [2 x i32]* @0, i32 0, i32 1)
|
||||
|
||||
; CHECK: ret i32 1
|
||||
|
||||
define i32 @main() {
|
||||
%a = load i32, i32* @"\01??_7A@@6B@"
|
||||
ret i32 %a
|
||||
}
|
Loading…
Reference in New Issue
Block a user