[vmkit-commits] [vmkit] r146843 - /vmkit/trunk/mmtk/magic/LowerMagic.cpp
Will Dietz
wdietz2 at illinois.edu
Sat Dec 17 21:05:51 PST 2011
Author: wdietz2
Date: Sat Dec 17 23:05:51 2011
New Revision: 146843
URL: http://llvm.org/viewvc/llvm-project?rev=146843&view=rev
Log:
LowerMagic: remove multiple null checks if exist, avoid iterator badness
Modified:
vmkit/trunk/mmtk/magic/LowerMagic.cpp
Modified: vmkit/trunk/mmtk/magic/LowerMagic.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/magic/LowerMagic.cpp?rev=146843&r1=146842&r2=146843&view=diff
==============================================================================
--- vmkit/trunk/mmtk/magic/LowerMagic.cpp (original)
+++ vmkit/trunk/mmtk/magic/LowerMagic.cpp Sat Dec 17 23:05:51 2011
@@ -7,6 +7,7 @@
//
//===----------------------------------------------------------------------===//
+#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/Constants.h"
#include "llvm/Function.h"
#include "llvm/Instructions.h"
@@ -37,6 +38,7 @@
char LowerMagic::ID = 0;
static RegisterPass<LowerMagic> X("LowerMagic",
"Lower magic calls");
+ typedef SmallPtrSet<Instruction*,128> InstSet;
static const char* AddressClass = "JnJVM_org_vmmagic_unboxed_Address_";
static const char* AddressZeroMethod = 0;
@@ -353,24 +355,25 @@
}
}
-
-static bool removePotentialNullCheck(BasicBlock* Cur, Value* Obj) {
+static bool removePotentialNullCheck(BasicBlock* Cur, Value* Obj, InstSet& RemoveSet) {
if (!Obj->getType()->isPointerTy()) return false;
if (vmkit::System::SupportsHardwareNullCheck()) {
+ bool changed = false;
for (Value::use_iterator I = Obj->use_begin(), E = Obj->use_end(); I != E; I++) {
if (GetElementPtrInst* GE = dyn_cast<GetElementPtrInst>(*I)) {
for (Value::use_iterator II = GE->use_begin(), EE = GE->use_end(); II != EE; II++) {
if (LoadInst* LI = dyn_cast<LoadInst>(*II)) {
if (LI->isVolatile()) {
assert(LI->use_empty());
- LI->eraseFromParent();
- return true;
+ RemoveSet.insert(LI);
+ changed = true;
}
}
}
}
}
+ return changed;
} else {
BasicBlock* BB = Cur->getUniquePredecessor();
LLVMContext& Context = Cur->getParent()->getContext();
@@ -425,6 +428,8 @@
}
+ InstSet RemoveSet;
+
for (Function::iterator BI = F.begin(), BE = F.end(); BI != BE; BI++) {
BasicBlock *Cur = BI;
for (BasicBlock::iterator II = Cur->begin(), IE = Cur->end(); II != IE;) {
@@ -447,7 +452,7 @@
Changed = true;
// Remove the null check
if (Call.arg_begin() != Call.arg_end()) {
- removePotentialNullCheck(Cur, Call.getArgument(0));
+ removePotentialNullCheck(Cur, Call.getArgument(0), RemoveSet);
}
if (!strcmp(FCur->getName().data(), AddressZeroMethod)) {
@@ -700,7 +705,7 @@
Changed = true;
// Remove the null check
if (Call.arg_begin() != Call.arg_end()) {
- removePotentialNullCheck(Cur, Call.getArgument(0));
+ removePotentialNullCheck(Cur, Call.getArgument(0), RemoveSet);
}
if (!strcmp(FCur->getName().data(), ExtentToWordMethod)) {
@@ -828,7 +833,7 @@
Changed = true;
// Remove the null check
if (Call.arg_begin() != Call.arg_end()) {
- removePotentialNullCheck(Cur, Call.getArgument(0));
+ removePotentialNullCheck(Cur, Call.getArgument(0), RemoveSet);
}
if (!strcmp(FCur->getName().data(), OffsetSLTMethod)) {
@@ -955,7 +960,7 @@
Changed = true;
// Remove the null check
if (Call.arg_begin() != Call.arg_end()) {
- removePotentialNullCheck(Cur, Call.getArgument(0));
+ removePotentialNullCheck(Cur, Call.getArgument(0), RemoveSet);
}
if (!strcmp(FCur->getName().data(), ObjectReferenceNullReferenceMethod)) {
@@ -994,7 +999,7 @@
Changed = true;
// Remove the null check
if (Call.arg_begin() != Call.arg_end()) {
- removePotentialNullCheck(Cur, Call.getArgument(0));
+ removePotentialNullCheck(Cur, Call.getArgument(0), RemoveSet);
}
if (!strcmp(FCur->getName().data(), WordOrMethod)) {
@@ -1264,6 +1269,13 @@
}
}
}
+
+ Changed |= !RemoveSet.empty();
+ for (InstSet::iterator I = RemoveSet.begin(),
+ E = RemoveSet.end(); I != E; ++I) {
+ (*I)->eraseFromParent();
+ }
+
return Changed;
}
More information about the vmkit-commits
mailing list