mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-26 13:10:34 +00:00
the verifier shouldn't modify the IR.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85722 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
076124ef26
commit
4a7642ec9c
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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<Constant>(*UI);
|
||||
if (UC == 0 || isa<GlobalValue>(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
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user