|
@@ -1876,7 +1876,8 @@ void DxilGenerationPass::AddCreateHandleForPhiNode(std::unordered_map<Instructio
|
|
handlePhi->getArgOperand(DXIL::OperandIndex::kCreateHandleResIDOpIdx));
|
|
handlePhi->getArgOperand(DXIL::OperandIndex::kCreateHandleResIDOpIdx));
|
|
PHINode *resAddressPhi = cast<PHINode>(handlePhi->getArgOperand(
|
|
PHINode *resAddressPhi = cast<PHINode>(handlePhi->getArgOperand(
|
|
DXIL::OperandIndex::kCreateHandleResIndexOpIdx));
|
|
DXIL::OperandIndex::kCreateHandleResIndexOpIdx));
|
|
-
|
|
|
|
|
|
+ Value *resClass0 = nullptr;
|
|
|
|
+ Value *resID0 = nullptr;
|
|
for (unsigned i = 0; i < numOperands; i++) {
|
|
for (unsigned i = 0; i < numOperands; i++) {
|
|
|
|
|
|
BasicBlock *BB = phi->getIncomingBlock(i);
|
|
BasicBlock *BB = phi->getIncomingBlock(i);
|
|
@@ -1900,11 +1901,26 @@ void DxilGenerationPass::AddCreateHandleForPhiNode(std::unordered_map<Instructio
|
|
Value *resIDI =
|
|
Value *resIDI =
|
|
handleI->getArgOperand(DXIL::OperandIndex::kCreateHandleResIDOpIdx);
|
|
handleI->getArgOperand(DXIL::OperandIndex::kCreateHandleResIDOpIdx);
|
|
resIDPhi->addIncoming(resIDI, BB);
|
|
resIDPhi->addIncoming(resIDI, BB);
|
|
-
|
|
|
|
|
|
+ if (i == 0) {
|
|
|
|
+ resClass0 = resClassI;
|
|
|
|
+ resID0 = resIDI;
|
|
|
|
+ } else {
|
|
|
|
+ if (resClass0 != resClassI)
|
|
|
|
+ resClass0 = nullptr;
|
|
|
|
+ if (resID0 != resIDI)
|
|
|
|
+ resID0 = nullptr;
|
|
|
|
+ }
|
|
Value *resAddressI = handleI->getArgOperand(
|
|
Value *resAddressI = handleI->getArgOperand(
|
|
DXIL::OperandIndex::kCreateHandleResIndexOpIdx);
|
|
DXIL::OperandIndex::kCreateHandleResIndexOpIdx);
|
|
resAddressPhi->addIncoming(resAddressI, BB);
|
|
resAddressPhi->addIncoming(resAddressI, BB);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (resClass0) {
|
|
|
|
+ handlePhi->setArgOperand(DXIL::OperandIndex::kCreateHandleResClassOpIdx, resClass0);
|
|
|
|
+ }
|
|
|
|
+ if (resID0) {
|
|
|
|
+ handlePhi->setArgOperand(DXIL::OperandIndex::kCreateHandleResIDOpIdx, resID0);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
// Merge res class into imm.
|
|
// Merge res class into imm.
|
|
@@ -2677,15 +2693,18 @@ void UpdateStructTypeForLegacyLayout(DxilResourceBase &Res, DxilTypeSystem &Type
|
|
// Delete old GV.
|
|
// Delete old GV.
|
|
for (auto UserIt = GV->user_begin(); UserIt != GV->user_end(); ) {
|
|
for (auto UserIt = GV->user_begin(); UserIt != GV->user_end(); ) {
|
|
Value *User = *(UserIt++);
|
|
Value *User = *(UserIt++);
|
|
- DXASSERT(User->user_empty(),
|
|
|
|
- "GV user should not have use after HLOperationLower.");
|
|
|
|
if (Instruction *I = dyn_cast<Instruction>(User)) {
|
|
if (Instruction *I = dyn_cast<Instruction>(User)) {
|
|
|
|
+ if (!User->user_empty())
|
|
|
|
+ I->replaceAllUsesWith(UndefValue::get(I->getType()));
|
|
|
|
+
|
|
I->eraseFromParent();
|
|
I->eraseFromParent();
|
|
} else {
|
|
} else {
|
|
ConstantExpr *CE = cast<ConstantExpr>(User);
|
|
ConstantExpr *CE = cast<ConstantExpr>(User);
|
|
- CE->dropAllReferences();
|
|
|
|
|
|
+ if (!CE->user_empty())
|
|
|
|
+ CE->replaceAllUsesWith(UndefValue::get(CE->getType()));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ GV->removeDeadConstantUsers();
|
|
GV->eraseFromParent();
|
|
GV->eraseFromParent();
|
|
}
|
|
}
|
|
}
|
|
}
|