From: Chris Lattner Date: Sun, 1 Nov 2009 18:11:50 +0000 (+0000) Subject: the verifier shouldn't modify the IR. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=4a7642ec9c33bcf8ed65231f382fb6d9a0f46f3a;p=oota-llvm.git the verifier shouldn't modify the IR. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85722 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/BasicBlock.h b/include/llvm/BasicBlock.h index 11afa404778..ba4caeb96a5 100644 --- a/include/llvm/BasicBlock.h +++ b/include/llvm/BasicBlock.h @@ -241,9 +241,6 @@ public: /// other than direct branches, switches, etc. to it. bool hasAddressTaken() const { return SubclassData != 0; } - /// removeDeadBlockAddress - If there is a blockaddress node for this basic - /// block, try to remove it and any dead constant users of it. - void removeDeadBlockAddress(); private: /// AdjustBlockAddressRefCount - BasicBlock stores the number of BlockAddress /// objects using it. This is almost always 0, sometimes one, possibly but diff --git a/include/llvm/Constant.h b/include/llvm/Constant.h index bcaa56e3902..8072fd9f498 100644 --- a/include/llvm/Constant.h +++ b/include/llvm/Constant.h @@ -65,6 +65,10 @@ public: /// true for things like constant expressions that could divide by zero. bool canTrap() const; + /// isConstantUsed - Return true if the constant has users other than constant + /// exprs and other dangling things. + bool isConstantUsed() const; + enum PossibleRelocationsTy { NoRelocation = 0, LocalRelocation = 1, diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index fe4f90af06d..e2e5396da5f 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -160,6 +160,21 @@ bool Constant::canTrap() const { } } +/// isConstantUsed - Return true if the constant has users other than constant +/// exprs and other dangling things. +bool Constant::isConstantUsed() const { + for (use_const_iterator UI = use_begin(), E = use_end(); UI != E; ++UI) { + const Constant *UC = dyn_cast(*UI); + if (UC == 0 || isa(UC)) + return true; + + if (UC->isConstantUsed()) + return true; + } + return false; +} + + /// getRelocationInfo - This method classifies the entry according to /// whether or not it may generate a relocation entry. This must be diff --git a/lib/VMCore/Globals.cpp b/lib/VMCore/Globals.cpp index 763fc721e09..03ceecb6f1a 100644 --- a/lib/VMCore/Globals.cpp +++ b/lib/VMCore/Globals.cpp @@ -75,13 +75,6 @@ void GlobalValue::removeDeadConstantUsers() const { } } -/// removeDeadBlockAddress - If there is a blockaddress node for this basic -/// block, try to remove it and any dead constant users of it. -void BasicBlock::removeDeadBlockAddress() { - if (!hasAddressTaken()) return; - removeDeadUsersOfConstant(BlockAddress::get(this)); -} - /// Override destroyConstant to make sure it doesn't get called on /// GlobalValue's because they shouldn't be treated like other constants. diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp index 6b10d69ac5e..5990e481686 100644 --- a/lib/VMCore/Verifier.cpp +++ b/lib/VMCore/Verifier.cpp @@ -661,8 +661,7 @@ void Verifier::visitFunction(Function &F) { // The address of the entry block cannot be taken, unless it is dead. if (Entry->hasAddressTaken()) { - Entry->removeDeadBlockAddress(); - Assert1(!Entry->hasAddressTaken(), + Assert1(!BlockAddress::get(Entry)->isConstantUsed(), "blockaddress may not be used with the entry block!", Entry); } }