mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-15 22:37:59 +00:00
[RewriteStatepointsForGC] Code cleanup [NFC]
Factor out common code related to naming values, fix a small style issue. More to follow in separate changes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247211 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b04fde3708
commit
25c13adbe7
@ -258,6 +258,13 @@ static bool order_by_name(llvm::Value *a, llvm::Value *b) {
|
||||
}
|
||||
}
|
||||
|
||||
// Return the name of the value suffixed with the provided value, or if the
|
||||
// value didn't have a name, the default value specified.
|
||||
static std::string suffixed_name_or(Value *V, StringRef Suffix,
|
||||
StringRef DefaultName) {
|
||||
return V->hasName() ? (V->getName() + Suffix).str() : DefaultName.str();
|
||||
}
|
||||
|
||||
// Conservatively identifies any definitions which might be live at the
|
||||
// given instruction. The analysis is performed immediately before the
|
||||
// given instruction. Values defined by that instruction are not considered
|
||||
@ -798,8 +805,8 @@ static Value *findBasePointer(Value *I, DefiningValueMapTy &cache) {
|
||||
// effect the result. TODO: We could use a worklist here and make this run
|
||||
// much faster.
|
||||
for (auto Pair : states) {
|
||||
Value *v = Pair.first;
|
||||
assert(!isKnownBaseResult(v) && "why did it get added?");
|
||||
Value *BDV = Pair.first;
|
||||
assert(!isKnownBaseResult(BDV) && "why did it get added?");
|
||||
|
||||
// Given an input value for the current instruction, return a BDVState
|
||||
// instance which represents the BDV of that value.
|
||||
@ -809,29 +816,29 @@ static Value *findBasePointer(Value *I, DefiningValueMapTy &cache) {
|
||||
};
|
||||
|
||||
MeetBDVStates calculateMeet;
|
||||
if (SelectInst *select = dyn_cast<SelectInst>(v)) {
|
||||
if (SelectInst *select = dyn_cast<SelectInst>(BDV)) {
|
||||
calculateMeet.meetWith(getStateForInput(select->getTrueValue()));
|
||||
calculateMeet.meetWith(getStateForInput(select->getFalseValue()));
|
||||
} else if (PHINode *Phi = dyn_cast<PHINode>(v)) {
|
||||
} else if (PHINode *Phi = dyn_cast<PHINode>(BDV)) {
|
||||
for (Value *Val : Phi->incoming_values())
|
||||
calculateMeet.meetWith(getStateForInput(Val));
|
||||
} else if (auto *EE = dyn_cast<ExtractElementInst>(v)) {
|
||||
} else if (auto *EE = dyn_cast<ExtractElementInst>(BDV)) {
|
||||
// The 'meet' for an extractelement is slightly trivial, but it's still
|
||||
// useful in that it drives us to conflict if our input is.
|
||||
calculateMeet.meetWith(getStateForInput(EE->getVectorOperand()));
|
||||
} else {
|
||||
// Given there's a inherent type mismatch between the operands, will
|
||||
// *always* produce Conflict.
|
||||
auto *IE = cast<InsertElementInst>(v);
|
||||
auto *IE = cast<InsertElementInst>(BDV);
|
||||
calculateMeet.meetWith(getStateForInput(IE->getOperand(0)));
|
||||
calculateMeet.meetWith(getStateForInput(IE->getOperand(1)));
|
||||
}
|
||||
|
||||
BDVState oldState = states[v];
|
||||
BDVState oldState = states[BDV];
|
||||
BDVState newState = calculateMeet.getResult();
|
||||
if (oldState != newState) {
|
||||
progress = true;
|
||||
states[v] = newState;
|
||||
states[BDV] = newState;
|
||||
}
|
||||
}
|
||||
|
||||
@ -888,28 +895,24 @@ static Value *findBasePointer(Value *I, DefiningValueMapTy &cache) {
|
||||
BasicBlock *BB = I->getParent();
|
||||
int NumPreds = std::distance(pred_begin(BB), pred_end(BB));
|
||||
assert(NumPreds > 0 && "how did we reach here");
|
||||
std::string Name = I->hasName() ?
|
||||
(I->getName() + ".base").str() : "base_phi";
|
||||
std::string Name = suffixed_name_or(I, ".base", "base_phi");
|
||||
return PHINode::Create(I->getType(), NumPreds, Name, I);
|
||||
} else if (SelectInst *Sel = dyn_cast<SelectInst>(I)) {
|
||||
// The undef will be replaced later
|
||||
UndefValue *Undef = UndefValue::get(Sel->getType());
|
||||
std::string Name = I->hasName() ?
|
||||
(I->getName() + ".base").str() : "base_select";
|
||||
std::string Name = suffixed_name_or(I, ".base", "base_select");
|
||||
return SelectInst::Create(Sel->getCondition(), Undef,
|
||||
Undef, Name, Sel);
|
||||
} else if (auto *EE = dyn_cast<ExtractElementInst>(I)) {
|
||||
UndefValue *Undef = UndefValue::get(EE->getVectorOperand()->getType());
|
||||
std::string Name = I->hasName() ?
|
||||
(I->getName() + ".base").str() : "base_ee";
|
||||
std::string Name = suffixed_name_or(I, ".base", "base_ee");
|
||||
return ExtractElementInst::Create(Undef, EE->getIndexOperand(), Name,
|
||||
EE);
|
||||
} else {
|
||||
auto *IE = cast<InsertElementInst>(I);
|
||||
UndefValue *VecUndef = UndefValue::get(IE->getOperand(0)->getType());
|
||||
UndefValue *ScalarUndef = UndefValue::get(IE->getOperand(1)->getType());
|
||||
std::string Name = I->hasName() ?
|
||||
(I->getName() + ".base").str() : "base_ie";
|
||||
std::string Name = suffixed_name_or(I, ".base", "base_ie");
|
||||
return InsertElementInst::Create(VecUndef, ScalarUndef,
|
||||
IE->getOperand(2), Name, IE);
|
||||
}
|
||||
@ -1112,13 +1115,11 @@ static Value *findBasePointer(Value *I, DefiningValueMapTy &cache) {
|
||||
Value *base = Pair.second.getBase();
|
||||
assert(BDV && base);
|
||||
|
||||
std::string fromstr =
|
||||
cache.count(BDV) ? (cache[BDV]->hasName() ? cache[BDV]->getName() : "")
|
||||
: "none";
|
||||
std::string fromstr = cache.count(BDV) ? cache[BDV]->getName() : "none";
|
||||
DEBUG(dbgs() << "Updating base value cache"
|
||||
<< " for: " << (BDV->hasName() ? BDV->getName() : "")
|
||||
<< " for: " << BDV->getName()
|
||||
<< " from: " << fromstr
|
||||
<< " to: " << (base->hasName() ? base->getName() : "") << "\n");
|
||||
<< " to: " << base->getName() << "\n");
|
||||
|
||||
if (cache.count(BDV)) {
|
||||
// Once we transition from the BDV relation being store in the cache to
|
||||
@ -1328,8 +1329,7 @@ static void CreateGCRelocates(ArrayRef<llvm::Value *> LiveVariables,
|
||||
// only specify a debug name if we can give a useful one
|
||||
CallInst *Reloc = Builder.CreateCall(
|
||||
GCRelocateDecl, {StatepointToken, BaseIdx, LiveIdx},
|
||||
LiveVariables[i]->hasName() ? LiveVariables[i]->getName() + ".relocated"
|
||||
: "");
|
||||
suffixed_name_or(LiveVariables[i], ".relocated", ""));
|
||||
// Trick CodeGen into thinking there are lots of free registers at this
|
||||
// fake call.
|
||||
Reloc->setCallingConv(CallingConv::Cold);
|
||||
@ -1578,8 +1578,9 @@ insertRelocationStores(iterator_range<Value::user_iterator> GCRelocs,
|
||||
assert(RelocatedValue->getNextNode() && "Should always have one since it's not a terminator");
|
||||
IRBuilder<> Builder(RelocatedValue->getNextNode());
|
||||
Value *CastedRelocatedValue =
|
||||
Builder.CreateBitCast(RelocatedValue, cast<AllocaInst>(Alloca)->getAllocatedType(),
|
||||
RelocatedValue->hasName() ? RelocatedValue->getName() + ".casted" : "");
|
||||
Builder.CreateBitCast(RelocatedValue,
|
||||
cast<AllocaInst>(Alloca)->getAllocatedType(),
|
||||
suffixed_name_or(RelocatedValue, ".casted", ""));
|
||||
|
||||
StoreInst *Store = new StoreInst(CastedRelocatedValue, Alloca);
|
||||
Store->insertAfter(cast<Instruction>(CastedRelocatedValue));
|
||||
|
Loading…
x
Reference in New Issue
Block a user