[llvm] r336702 - [Evaluator] Examine alias when evaluating function call
Eugene Leviant via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 10 09:34:23 PDT 2018
Author: evgeny777
Date: Tue Jul 10 09:34:23 2018
New Revision: 336702
URL: http://llvm.org/viewvc/llvm-project?rev=336702&view=rev
Log:
[Evaluator] Examine alias when evaluating function call
This fixes PR38120
Modified:
llvm/trunk/lib/Transforms/Utils/Evaluator.cpp
llvm/trunk/test/Transforms/GlobalOpt/evaluate-call.ll
Modified: llvm/trunk/lib/Transforms/Utils/Evaluator.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Evaluator.cpp?rev=336702&r1=336701&r2=336702&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/Evaluator.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/Evaluator.cpp Tue Jul 10 09:34:23 2018
@@ -24,6 +24,7 @@
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
+#include "llvm/IR/GlobalAlias.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/InstrTypes.h"
@@ -217,16 +218,26 @@ Constant *Evaluator::ComputeLoadResult(C
return nullptr; // don't know how to evaluate.
}
+static Function *getFunction(Constant *C) {
+ if (auto *Fn = dyn_cast<Function>(C))
+ return Fn;
+
+ if (auto *Alias = dyn_cast<GlobalAlias>(C))
+ if (auto *Fn = dyn_cast<Function>(Alias->getAliasee()))
+ return Fn;
+ return nullptr;
+}
+
Function *
Evaluator::getCalleeWithFormalArgs(CallSite &CS,
SmallVector<Constant *, 8> &Formals) {
auto *V = CS.getCalledValue();
- if (auto *Fn = dyn_cast<Function>(getVal(V)))
+ if (auto *Fn = getFunction(getVal(V)))
return getFormalParams(CS, Fn, Formals) ? Fn : nullptr;
auto *CE = dyn_cast<ConstantExpr>(V);
if (!CE || CE->getOpcode() != Instruction::BitCast ||
- !getFormalParams(CS, cast<Function>(CE->getOperand(0)), Formals))
+ !getFormalParams(CS, getFunction(CE->getOperand(0)), Formals))
return nullptr;
return dyn_cast<Function>(
@@ -235,6 +246,9 @@ Evaluator::getCalleeWithFormalArgs(CallS
bool Evaluator::getFormalParams(CallSite &CS, Function *F,
SmallVector<Constant *, 8> &Formals) {
+ if (!F)
+ return false;
+
auto *FTy = F->getFunctionType();
if (FTy->getNumParams() > CS.getNumArgOperands()) {
LLVM_DEBUG(dbgs() << "Too few arguments for function.\n");
Modified: llvm/trunk/test/Transforms/GlobalOpt/evaluate-call.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/evaluate-call.ll?rev=336702&r1=336701&r2=336702&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/evaluate-call.ll (original)
+++ llvm/trunk/test/Transforms/GlobalOpt/evaluate-call.ll Tue Jul 10 09:34:23 2018
@@ -28,10 +28,12 @@ target triple = "x86_64-apple-macosx10.1
@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I_main.cpp, i8* null }]
define internal void @__cxx_global_var_init() section "__TEXT,__StaticInit,regular,pure_instructions" {
- call void @_ZN1SC1Ev(%struct.S* @_s)
+ call void @_ZN1SC1Ev_alias(%struct.S* @_s)
ret void
}
+ at _ZN1SC1Ev_alias = linkonce_odr unnamed_addr alias void (%struct.S*), void (%struct.S*)* @_ZN1SC1Ev
+
define linkonce_odr void @_ZN1SC1Ev(%struct.S*) unnamed_addr align 2 {
%2 = alloca %struct.S*, align 8
store %struct.S* %0, %struct.S** %2, align 8
More information about the llvm-commits
mailing list