From 6a3e3053263904fa296c86dc91778f54a8bb29c5 Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Tue, 7 Dec 2010 02:41:11 +0000 Subject: [PATCH] Temporarily revert r121100 as it's causing clang to fail CodeGenCXX/virtual-base-ctor.cpp. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121102 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/GlobalOpt.cpp | 90 ++-------------------- .../GlobalOpt/ctor-list-opt-constexpr.ll | 23 ------ 2 files changed, 5 insertions(+), 108 deletions(-) delete mode 100644 test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index 366179563d6..f66e70d43dc 100644 --- a/lib/Transforms/IPO/GlobalOpt.cpp +++ b/lib/Transforms/IPO/GlobalOpt.cpp @@ -2046,82 +2046,14 @@ static GlobalVariable *InstallGlobalCtors(GlobalVariable *GCL, } -static Constant *getVal(DenseMap &ComputedValues, Value *V) { +static Constant *getVal(DenseMap &ComputedValues, + Value *V) { if (Constant *CV = dyn_cast(V)) return CV; Constant *R = ComputedValues[V]; assert(R && "Reference to an uncomputed value!"); return R; } -static inline bool -isSimpleEnoughValueToCommit(Constant *C, - SmallPtrSet &SimpleConstants); - - -/// isSimpleEnoughValueToCommit - Return true if the specified constant can be -/// handled by the code generator. We don't want to generate something like: -/// void *X = &X/42; -/// because the code generator doesn't have a relocation that can handle that. -/// -/// This function should be called if C was not found (but just got inserted) -/// in SimpleConstants to avoid having to rescan the same constants all the -/// time. -static bool isSimpleEnoughValueToCommitHelper(Constant *C, - SmallPtrSet &SimpleConstants) { - // Simple integer, undef, constant aggregate zero, global addresses, etc are - // all supported. - if (C->getNumOperands() == 0 || isa(C) || - isa(C)) - return true; - - // Aggregate values are safe if all their elements are. - if (isa(C) || isa(C) || - isa(C)) { - for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) { - Constant *Op = cast(C->getOperand(i)); - if (!isSimpleEnoughValueToCommit(Op, SimpleConstants)) - return false; - } - return true; - } - - // We don't know exactly what relocations are allowed in constant expressions, - // so we allow &global+constantoffset, which is safe and uniformly supported - // across targets. - ConstantExpr *CE = cast(C); - switch (CE->getOpcode()) { - case Instruction::BitCast: - case Instruction::IntToPtr: - case Instruction::PtrToInt: - // These casts are always fine if the casted value is. - return isSimpleEnoughValueToCommit(CE->getOperand(0), SimpleConstants); - - // GEP is fine if it is simple + constant offset. - case Instruction::GetElementPtr: - for (unsigned i = 1, e = CE->getNumOperands(); i != e; ++i) - if (!isa(CE->getOperand(i))) - return false; - return isSimpleEnoughValueToCommit(CE->getOperand(0), SimpleConstants); - - case Instruction::Add: - // We allow simple+cst. - if (!isa(CE->getOperand(1))) - return false; - return isSimpleEnoughValueToCommit(CE->getOperand(0), SimpleConstants); - } - return false; -} - -static inline bool -isSimpleEnoughValueToCommit(Constant *C, - SmallPtrSet &SimpleConstants) { - // If we already checked this constant, we win. - if (!SimpleConstants.insert(C)) return true; - // Check the constant. - return isSimpleEnoughValueToCommitHelper(C, SimpleConstants); -} - - /// isSimpleEnoughPointerToCommit - Return true if this constant is simple /// enough for us to understand. In particular, if it is a cast of something, /// we punt. We basically just support direct accesses to globals and GEP's of @@ -2287,8 +2219,7 @@ static bool EvaluateFunction(Function *F, Constant *&RetVal, const SmallVectorImpl &ActualArgs, std::vector &CallStack, DenseMap &MutatedMemory, - std::vector &AllocaTmps, - SmallPtrSet &SimpleConstants) { + std::vector &AllocaTmps) { // Check to see if this function is already executing (recursion). If so, // bail out. TODO: we might want to accept limited recursion. if (std::find(CallStack.begin(), CallStack.end(), F) != CallStack.end()) @@ -2323,13 +2254,7 @@ static bool EvaluateFunction(Function *F, Constant *&RetVal, if (!isSimpleEnoughPointerToCommit(Ptr)) // If this is too complex for us to commit, reject it. return false; - Constant *Val = getVal(Values, SI->getOperand(0)); - - // If this might be too difficult for the backend to handle (e.g. the addr - // of one global variable divided by another) then we can't commit it. - if (!isSimpleEnoughValueToCommit(Val, SimpleConstants)) - return false; MutatedMemory[Ptr] = Val; } else if (BinaryOperator *BO = dyn_cast(CurInst)) { InstResult = ConstantExpr::get(BO->getOpcode(), @@ -2406,7 +2331,7 @@ static bool EvaluateFunction(Function *F, Constant *&RetVal, Constant *RetVal; // Execute the call, if successful, use the return value. if (!EvaluateFunction(Callee, RetVal, Formals, CallStack, - MutatedMemory, AllocaTmps, SimpleConstants)) + MutatedMemory, AllocaTmps)) return false; InstResult = RetVal; } @@ -2492,16 +2417,11 @@ static bool EvaluateStaticConstructor(Function *F) { /// unbounded. std::vector CallStack; - /// SimpleConstants - These are constants we have checked and know to be - /// simple enough to live in a static initializer of a global. - SmallPtrSet SimpleConstants; - // Call the function. Constant *RetValDummy; bool EvalSuccess = EvaluateFunction(F, RetValDummy, SmallVector(), CallStack, - MutatedMemory, AllocaTmps, - SimpleConstants); + MutatedMemory, AllocaTmps); if (EvalSuccess) { // We succeeded at evaluation: commit the result. DEBUG(dbgs() << "FULLY EVALUATED GLOBAL CTOR FUNCTION '" diff --git a/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll b/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll deleted file mode 100644 index 204f979ed3e..00000000000 --- a/test/Transforms/GlobalOpt/ctor-list-opt-constexpr.ll +++ /dev/null @@ -1,23 +0,0 @@ -; RUN: opt -globalopt %s -S | FileCheck %s -target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" -target triple = "x86_64-apple-darwin10.0.0" - -%0 = type { i32, void ()* } -%struct.foo = type { i32* } - -@G = global i32 0, align 4 -@H = global i32 0, align 4 -@X = global %struct.foo zeroinitializer, align 8 -@llvm.global_ctors = appending global [1 x %0] [%0 { i32 65535, void ()* @init }] - -; PR8710 - GlobalOpt shouldn't change the global's initializer to have this -; arbitrary constant expression, the code generator can't handle it. -define internal void @init() { -entry: - %tmp = getelementptr inbounds %struct.foo* @X, i32 0, i32 0 - store i32* inttoptr (i64 sdiv (i64 ptrtoint (i32* @G to i64), i64 ptrtoint (i32* @H to i64)) to i32*), i32** %tmp, align 8 - ret void -} - -; CHECK: @init -; CHECK: store i32* -- 2.11.0