From: David Majnemer Date: Wed, 22 Jul 2015 22:29:30 +0000 (+0000) Subject: [ConstantFolding] Support folding loads from a GlobalAlias X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=1b072f2beb49345381cf7ea59498c8f6218788d7;p=oota-llvm.git [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 --- diff --git a/lib/Analysis/ConstantFolding.cpp b/lib/Analysis/ConstantFolding.cpp index bd9439ec4d6..70c929b53a3 100644 --- a/lib/Analysis/ConstantFolding.cpp +++ b/lib/Analysis/ConstantFolding.cpp @@ -532,6 +532,10 @@ Constant *llvm::ConstantFoldLoadFromConstPtr(Constant *C, if (GV->isConstant() && GV->hasDefinitiveInitializer()) return GV->getInitializer(); + if (auto *GA = dyn_cast(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(C); if (!CE) diff --git a/test/Transforms/SCCP/global-alias-constprop.ll b/test/Transforms/SCCP/global-alias-constprop.ll new file mode 100644 index 00000000000..453755b066b --- /dev/null +++ b/test/Transforms/SCCP/global-alias-constprop.ll @@ -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 +}