|
@@ -105,7 +105,6 @@ private:
|
|
|
|
|
|
void RewriteForConstExpr(ConstantExpr *user, IRBuilder<> &Builder);
|
|
|
void RewriteForGEP(GEPOperator *GEP, IRBuilder<> &Builder);
|
|
|
- void RewriteForAddrSpaceCast(ConstantExpr *user, IRBuilder<> &Builder);
|
|
|
void RewriteForLoad(LoadInst *loadInst);
|
|
|
void RewriteForStore(StoreInst *storeInst);
|
|
|
void RewriteMemIntrin(MemIntrinsic *MI, Instruction *Inst);
|
|
@@ -3099,22 +3098,6 @@ void SROA_Helper::RewriteCall(CallInst *CI) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/// RewriteForConstExpr - Rewrite the GEP which is ConstantExpr.
|
|
|
-void SROA_Helper::RewriteForAddrSpaceCast(ConstantExpr *CE,
|
|
|
- IRBuilder<> &Builder) {
|
|
|
- SmallVector<Value *, 8> NewCasts;
|
|
|
- // create new AddrSpaceCast.
|
|
|
- for (unsigned i = 0, e = NewElts.size(); i != e; ++i) {
|
|
|
- Value *NewGEP = Builder.CreateAddrSpaceCast(
|
|
|
- NewElts[i],
|
|
|
- PointerType::get(NewElts[i]->getType()->getPointerElementType(),
|
|
|
- CE->getType()->getPointerAddressSpace()));
|
|
|
- NewCasts.emplace_back(NewGEP);
|
|
|
- }
|
|
|
- SROA_Helper helper(CE, NewCasts, DeadInsts);
|
|
|
- helper.RewriteForScalarRepl(CE, Builder);
|
|
|
-}
|
|
|
-
|
|
|
/// RewriteForConstExpr - Rewrite the GEP which is ConstantExpr.
|
|
|
void SROA_Helper::RewriteForConstExpr(ConstantExpr *CE, IRBuilder<> &Builder) {
|
|
|
if (GEPOperator *GEP = dyn_cast<GEPOperator>(CE)) {
|
|
@@ -3124,26 +3107,17 @@ void SROA_Helper::RewriteForConstExpr(ConstantExpr *CE, IRBuilder<> &Builder) {
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
- if (CE->getOpcode() == Instruction::AddrSpaceCast) {
|
|
|
- if (OldVal == CE->getOperand(0)) {
|
|
|
- // Flatten AddrSpaceCast.
|
|
|
- RewriteForAddrSpaceCast(CE, Builder);
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
// Skip unused CE.
|
|
|
if (CE->use_empty())
|
|
|
return;
|
|
|
|
|
|
+ Instruction *constInst = CE->getAsInstruction();
|
|
|
+ Builder.Insert(constInst);
|
|
|
+ // Replace CE with constInst.
|
|
|
for (Value::use_iterator UI = CE->use_begin(), E = CE->use_end(); UI != E;) {
|
|
|
Use &TheUse = *UI++;
|
|
|
- if (Instruction *I = dyn_cast<Instruction>(TheUse.getUser())) {
|
|
|
- IRBuilder<> tmpBuilder(I);
|
|
|
- // Replace CE with constInst.
|
|
|
- Instruction *tmpInst = CE->getAsInstruction();
|
|
|
- tmpBuilder.Insert(tmpInst);
|
|
|
- TheUse.set(tmpInst);
|
|
|
- }
|
|
|
+ if (isa<Instruction>(TheUse.getUser()))
|
|
|
+ TheUse.set(constInst);
|
|
|
else {
|
|
|
RewriteForConstExpr(cast<ConstantExpr>(TheUse.getUser()), Builder);
|
|
|
}
|