Skip to content

Commit bb78ef0

Browse files
apronin-inteligcbot
authored andcommitted
Fix Phi handling in SIMD CF Conformance
1 parent 79aa84f commit bb78ef0

File tree

1 file changed

+34
-8
lines changed

1 file changed

+34
-8
lines changed

IGC/VectorCompiler/lib/GenXCodeGen/GenXSimdCFConformance.cpp

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,8 @@ class GenXSimdCFConformance {
403403
Value *findLoweredEMValue(Value *Val);
404404
Value *buildLoweringViaGetEM(Value *Val, Instruction *InsertBefore);
405405
Value *getGetEMLoweredValue(Value *Val, Instruction *InsertBefore);
406-
Value *lowerEVIUse(ExtractValueInst *EVI, Instruction *User);
406+
Value *lowerEVIUse(ExtractValueInst *EVI, Instruction *User,
407+
BasicBlock *PhiPredBlock = nullptr);
407408
Value *lowerPHIUse(PHINode *PN, SetVector<Value *> &ToRemove);
408409
Value *lowerArgumentUse(Argument *Arg);
409410
Value *insertCond(Value *OldVal, Value *NewVal, const Twine &Name, Instruction *InsertBefore, const DebugLoc &DL);
@@ -742,7 +743,7 @@ Value *GenXSimdCFConformance::findGotoJoinVal(int Cat, BasicBlock *Loc, Instruct
742743

743744
LLVM_DEBUG(dbgs() << "Entering " << Loc->getName() << "\n");
744745

745-
// Check if value were found before
746+
// Check if value was found before
746747
auto ResIt = foundVals.find(Loc);
747748
if (ResIt != foundVals.end())
748749
return ResIt->second;
@@ -2976,7 +2977,8 @@ Value *GenXSimdCFConformance::getGetEMLoweredValue(Value *Val,
29762977
* EM is being lowered via genx_simdcf_get_em intrinsic.
29772978
*/
29782979
Value *GenXSimdCFConformance::lowerEVIUse(ExtractValueInst *EVI,
2979-
Instruction *User) {
2980+
Instruction *User,
2981+
BasicBlock *PhiPredBlock) {
29802982
LLVM_DEBUG(dbgs() << "Lowering EVI use:\n" << *EVI << "\n");
29812983

29822984
CallInst *GotoJoin = dyn_cast<CallInst>(EVI->getOperand(0));
@@ -2996,16 +2998,26 @@ Value *GenXSimdCFConformance::lowerEVIUse(ExtractValueInst *EVI,
29962998
BasicBlock *DefBB = GotoJoin->getParent();
29972999
BasicBlock *TrueBlock = DefBB->getTerminator()->getSuccessor(0);
29983000
BasicBlock *FalseBlock = DefBB->getTerminator()->getSuccessor(1);
3001+
BasicBlock *Loc = PhiPredBlock ? PhiPredBlock : User->getParent();
29993002

3003+
// GetEM is removed later if redundant.
30003004
Value *TrueVal = Constant::getNullValue(EVI->getType());
30013005
Value *FalseVal = getGetEMLoweredValue(EVI, FalseBlock->getFirstNonPHI());
30023006

3007+
// Early return for direct phi true edge: lowered value is zeroed
3008+
if (PhiPredBlock == DefBB && TrueBlock == User->getParent()) {
3009+
IGC_ASSERT(PhiPredBlock);
3010+
IGC_ASSERT_MESSAGE(FalseBlock != TrueBlock,
3011+
"Crit edge should be inserted earlier!");
3012+
return TrueVal;
3013+
}
3014+
30033015
std::map<BasicBlock *, Value *> foundVals;
30043016
BasicBlockEdge TrueEdge(DefBB, TrueBlock);
30053017
BasicBlockEdge FalseEdge(DefBB, FalseBlock);
30063018

3007-
return findGotoJoinVal(RegCategory::EM, User->getParent(), EVI, TrueEdge,
3008-
FalseEdge, TrueVal, FalseVal, foundVals);
3019+
return findGotoJoinVal(RegCategory::EM, Loc, EVI, TrueEdge, FalseEdge,
3020+
TrueVal, FalseVal, foundVals);
30093021
}
30103022

30113023
// Non-branching case: must be join. Insert get_em right after join's EM
@@ -3022,8 +3034,11 @@ Value *GenXSimdCFConformance::lowerEVIUse(ExtractValueInst *EVI,
30223034
* lowerPHIUse : lower PHI use.
30233035
*
30243036
* EM is being lowered via genx_simdcf_get_em intrinsic.
3025-
* When PHI lowering is needed, we have to lower all incoming
3026-
* values. Lowered phis are also stored in LoweredPhisMap to
3037+
* This intrinsic is inserted right after the phis in current BB
3038+
* in case of non-join block. For join blocks, the full PHI lowering
3039+
* is performed: we have to lower all incoming values.
3040+
*
3041+
* Lowered phis are also stored in LoweredPhisMap to
30273042
* prevent redundant lowerings.
30283043
*/
30293044
Value *GenXSimdCFConformance::lowerPHIUse(PHINode *PN,
@@ -3035,6 +3050,14 @@ Value *GenXSimdCFConformance::lowerPHIUse(PHINode *PN,
30353050
return FoundVal;
30363051
}
30373052

3053+
if (!GotoJoin::isJoinLabel(PN->getParent())) {
3054+
auto res = getGetEMLoweredValue(PN, PN->getParent()->getFirstNonPHI());
3055+
LLVM_DEBUG(dbgs() << "Created " << *res << "\n");
3056+
return res;
3057+
}
3058+
3059+
LLVM_DEBUG(dbgs() << "Performing full lowering\n");
3060+
30383061
// Clone phi and store it as lowered value.
30393062
auto *newPN = cast<PHINode>(PN->clone());
30403063
newPN->insertAfter(PN);
@@ -3081,7 +3104,10 @@ void GenXSimdCFConformance::replaceUseWithLoweredEM(Instruction *Val, unsigned o
30813104
Value *LoweredEM = nullptr;
30823105

30833106
if (auto *EVI = dyn_cast<ExtractValueInst>(EM)) {
3084-
LoweredEM = lowerEVIUse(EVI, Val);
3107+
BasicBlock *PhiPredBlock = nullptr;
3108+
if (auto *PN = dyn_cast<PHINode>(Val))
3109+
PhiPredBlock = PN->getIncomingBlock(operandNo);
3110+
LoweredEM = lowerEVIUse(EVI, Val, PhiPredBlock);
30853111
} else if (auto *SVI = dyn_cast<ShuffleVectorInst>(EM)) {
30863112
// Shuffle vector: go through it and lower its pred.
30873113
// All changes will be applied here.

0 commit comments

Comments
 (0)