|
@@ -105,6 +105,7 @@ 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);
|
|
@@ -3098,6 +3099,22 @@ 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)) {
|
|
@@ -3107,17 +3124,26 @@ 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 (isa<Instruction>(TheUse.getUser()))
|
|
|
- TheUse.set(constInst);
|
|
|
+ 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);
|
|
|
+ }
|
|
|
else {
|
|
|
RewriteForConstExpr(cast<ConstantExpr>(TheUse.getUser()), Builder);
|
|
|
}
|