[llvm] r242955 - [ConstantFolding] Support folding loads from a GlobalAlias
David Majnemer
david.majnemer at gmail.com
Wed Jul 22 15:29:30 PDT 2015
Author: majnemer
Date: Wed Jul 22 17:29:30 2015
New Revision: 242955
URL: http://llvm.org/viewvc/llvm-project?rev=242955&view=rev
Log:
[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
Added:
llvm/trunk/test/Transforms/SCCP/global-alias-constprop.ll
Modified:
llvm/trunk/lib/Analysis/ConstantFolding.cpp
Modified: llvm/trunk/lib/Analysis/ConstantFolding.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ConstantFolding.cpp?rev=242955&r1=242954&r2=242955&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ConstantFolding.cpp (original)
+++ llvm/trunk/lib/Analysis/ConstantFolding.cpp Wed Jul 22 17:29:30 2015
@@ -532,6 +532,10 @@ Constant *llvm::ConstantFoldLoadFromCons
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)
Added: llvm/trunk/test/Transforms/SCCP/global-alias-constprop.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SCCP/global-alias-constprop.ll?rev=242955&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/SCCP/global-alias-constprop.ll (added)
+++ llvm/trunk/test/Transforms/SCCP/global-alias-constprop.ll Wed Jul 22 17:29:30 2015
@@ -0,0 +1,11 @@
+; RUN: opt < %s -sccp -S | FileCheck %s
+
+ at 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
+}
More information about the llvm-commits
mailing list