|
@@ -4619,6 +4619,12 @@ void SROA_Parameter_HLSL::flattenGlobal(GlobalVariable *GV) {
|
|
|
|
|
|
// Flat Global vector if no dynamic vector indexing.
|
|
// Flat Global vector if no dynamic vector indexing.
|
|
bool bFlatVector = !hasDynamicVectorIndexing(EltGV);
|
|
bool bFlatVector = !hasDynamicVectorIndexing(EltGV);
|
|
|
|
+
|
|
|
|
+ // Disable scalarization of groupshared vector arrays
|
|
|
|
+ if (GV->getType()->getAddressSpace() == DXIL::kTGSMAddrSpace &&
|
|
|
|
+ Ty->isArrayTy())
|
|
|
|
+ bFlatVector = false;
|
|
|
|
+
|
|
std::vector<Value *> Elts;
|
|
std::vector<Value *> Elts;
|
|
bool SROAed = SROA_Helper::DoScalarReplacement(
|
|
bool SROAed = SROA_Helper::DoScalarReplacement(
|
|
EltGV, Elts, Builder, bFlatVector,
|
|
EltGV, Elts, Builder, bFlatVector,
|
|
@@ -6636,6 +6642,8 @@ private:
|
|
void ReplaceVectorWithArray(Value *Vec, Value *Array);
|
|
void ReplaceVectorWithArray(Value *Vec, Value *Array);
|
|
void ReplaceVectorArrayWithArray(Value *VecArray, Value *Array);
|
|
void ReplaceVectorArrayWithArray(Value *VecArray, Value *Array);
|
|
void ReplaceStaticIndexingOnVector(Value *V);
|
|
void ReplaceStaticIndexingOnVector(Value *V);
|
|
|
|
+ void ReplaceAddrSpaceCast(ConstantExpr *CE,
|
|
|
|
+ Value *A, IRBuilder<> &Builder);
|
|
};
|
|
};
|
|
|
|
|
|
void DynamicIndexingVectorToArray::applyOptions(PassOptions O) {
|
|
void DynamicIndexingVectorToArray::applyOptions(PassOptions O) {
|
|
@@ -6738,13 +6746,23 @@ void DynamicIndexingVectorToArray::ReplaceVecGEP(Value *GEP, ArrayRef<Value *> i
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void DynamicIndexingVectorToArray::ReplaceAddrSpaceCast(ConstantExpr *CE,
|
|
|
|
+ Value *A, IRBuilder<> &Builder) {
|
|
|
|
+ // create new AddrSpaceCast.
|
|
|
|
+ Value *NewAddrSpaceCast = Builder.CreateAddrSpaceCast(
|
|
|
|
+ A,
|
|
|
|
+ PointerType::get(A->getType()->getPointerElementType(),
|
|
|
|
+ CE->getType()->getPointerAddressSpace()));
|
|
|
|
+ ReplaceVectorWithArray(CE, NewAddrSpaceCast);
|
|
|
|
+}
|
|
|
|
+
|
|
void DynamicIndexingVectorToArray::ReplaceVectorWithArray(Value *Vec, Value *A) {
|
|
void DynamicIndexingVectorToArray::ReplaceVectorWithArray(Value *Vec, Value *A) {
|
|
unsigned size = Vec->getType()->getPointerElementType()->getVectorNumElements();
|
|
unsigned size = Vec->getType()->getPointerElementType()->getVectorNumElements();
|
|
for (auto U = Vec->user_begin(); U != Vec->user_end();) {
|
|
for (auto U = Vec->user_begin(); U != Vec->user_end();) {
|
|
User *User = (*U++);
|
|
User *User = (*U++);
|
|
|
|
|
|
// GlobalVariable user.
|
|
// GlobalVariable user.
|
|
- if (isa<ConstantExpr>(User)) {
|
|
|
|
|
|
+ if (ConstantExpr * CE = dyn_cast<ConstantExpr>(User)) {
|
|
if (User->user_empty())
|
|
if (User->user_empty())
|
|
continue;
|
|
continue;
|
|
if (GEPOperator *GEP = dyn_cast<GEPOperator>(User)) {
|
|
if (GEPOperator *GEP = dyn_cast<GEPOperator>(User)) {
|
|
@@ -6752,7 +6770,12 @@ void DynamicIndexingVectorToArray::ReplaceVectorWithArray(Value *Vec, Value *A)
|
|
SmallVector<Value *, 4> idxList(GEP->idx_begin(), GEP->idx_end());
|
|
SmallVector<Value *, 4> idxList(GEP->idx_begin(), GEP->idx_end());
|
|
ReplaceVecGEP(GEP, idxList, A, Builder);
|
|
ReplaceVecGEP(GEP, idxList, A, Builder);
|
|
continue;
|
|
continue;
|
|
|
|
+ } else if (CE->getOpcode() == Instruction::AddrSpaceCast) {
|
|
|
|
+ IRBuilder<> Builder(Vec->getContext());
|
|
|
|
+ ReplaceAddrSpaceCast(CE, A, Builder);
|
|
|
|
+ continue;
|
|
}
|
|
}
|
|
|
|
+ DXASSERT(0, "not implemented yet");
|
|
}
|
|
}
|
|
// Instrution user.
|
|
// Instrution user.
|
|
Instruction *UserInst = cast<Instruction>(User);
|
|
Instruction *UserInst = cast<Instruction>(User);
|
|
@@ -6961,7 +6984,7 @@ void ReplaceMultiDimGEP(User *GEP, Value *OneDim, IRBuilder<> &Builder) {
|
|
void MultiDimArrayToOneDimArray::lowerUseWithNewValue(Value *MultiDim, Value *OneDim) {
|
|
void MultiDimArrayToOneDimArray::lowerUseWithNewValue(Value *MultiDim, Value *OneDim) {
|
|
LLVMContext &Context = MultiDim->getContext();
|
|
LLVMContext &Context = MultiDim->getContext();
|
|
// All users should be element type.
|
|
// All users should be element type.
|
|
- // Replace users of AI.
|
|
|
|
|
|
+ // Replace users of AI or GV.
|
|
for (auto it = MultiDim->user_begin(); it != MultiDim->user_end();) {
|
|
for (auto it = MultiDim->user_begin(); it != MultiDim->user_end();) {
|
|
User *U = *(it++);
|
|
User *U = *(it++);
|
|
if (U->user_empty())
|
|
if (U->user_empty())
|
|
@@ -6970,21 +6993,29 @@ void MultiDimArrayToOneDimArray::lowerUseWithNewValue(Value *MultiDim, Value *On
|
|
BCI->setOperand(0, OneDim);
|
|
BCI->setOperand(0, OneDim);
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
- // Must be GEP.
|
|
|
|
- GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(U);
|
|
|
|
|
|
|
|
- if (!GEP) {
|
|
|
|
- DXASSERT_NOMSG(isa<GEPOperator>(U));
|
|
|
|
- // NewGEP must be GEPOperator too.
|
|
|
|
- // No instruction will be build.
|
|
|
|
|
|
+ if (ConstantExpr *CE = dyn_cast<ConstantExpr>(U)) {
|
|
IRBuilder<> Builder(Context);
|
|
IRBuilder<> Builder(Context);
|
|
- ReplaceMultiDimGEP(U, OneDim, Builder);
|
|
|
|
- } else {
|
|
|
|
|
|
+ if (GEPOperator *GEP = dyn_cast<GEPOperator>(U)) {
|
|
|
|
+ // NewGEP must be GEPOperator too.
|
|
|
|
+ // No instruction will be build.
|
|
|
|
+ ReplaceMultiDimGEP(U, OneDim, Builder);
|
|
|
|
+ } else if (CE->getOpcode() == Instruction::AddrSpaceCast) {
|
|
|
|
+ Value *NewAddrSpaceCast = Builder.CreateAddrSpaceCast(
|
|
|
|
+ OneDim,
|
|
|
|
+ PointerType::get(OneDim->getType()->getPointerElementType(),
|
|
|
|
+ CE->getType()->getPointerAddressSpace()));
|
|
|
|
+ lowerUseWithNewValue(CE, NewAddrSpaceCast);
|
|
|
|
+ } else {
|
|
|
|
+ DXASSERT(0, "not implemented");
|
|
|
|
+ }
|
|
|
|
+ } else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(U)) {
|
|
IRBuilder<> Builder(GEP);
|
|
IRBuilder<> Builder(GEP);
|
|
ReplaceMultiDimGEP(U, OneDim, Builder);
|
|
ReplaceMultiDimGEP(U, OneDim, Builder);
|
|
- }
|
|
|
|
- if (GEP)
|
|
|
|
GEP->eraseFromParent();
|
|
GEP->eraseFromParent();
|
|
|
|
+ } else {
|
|
|
|
+ DXASSERT(0, "not implemented");
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|