Skip to content

Commit f9cfd50

Browse files
committed
LLVM freeze instruction between mask and div 4/?
1 parent 92ee764 commit f9cfd50

File tree

1 file changed

+17
-3
lines changed

1 file changed

+17
-3
lines changed

third_party/intel/lib/LLVMIR/LLVMIRFreezeMaskedDivRem.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,37 @@ static bool processPhiNode(PHINode *phiNode, BasicBlock& BB) {
1818

1919
bool Changed = false;
2020
if (phiHasNullValue) {
21+
for (Instruction &I : BB) {
22+
if (I.getOpcode() == Instruction::SDiv || I.getOpcode() == Instruction::SRem) {
23+
const size_t OpIdx = 1; // I.getOpcode() == Instruction::SRem ? 0 : 1;
24+
if (I.getOperand(OpIdx) == phiNode) {
25+
auto *freezePhi = new FreezeInst(phiNode, phiNode->getName() + ".frozen", I.getIterator());
26+
I.setOperand(OpIdx, freezePhi);
27+
Changed = true;
28+
}
29+
}
30+
}
31+
#if 0
2132
auto FindUse = llvm::find_if(phiNode->users(), [](auto *U) {
2233
auto *Use = cast<Instruction>(U);
2334
llvm::errs() << "User: " << *Use << "\n";
24-
return (Use->getOpcode() == Instruction::SDiv);
35+
return (Use->getOpcode() == Instruction::SDiv || Use->getOpcode() == Instruction::SRem);
2536
});
2637
if (FindUse == phiNode->user_end()) {
2738
llvm::errs() << "no div :(\n";
2839
return false;
2940
}
3041
auto *Use = cast<Instruction>(*FindUse);
31-
if (Use->getOperand(1) == phiNode) {
42+
assert(Use->isIntDivRem());
43+
const size_t OpIdx = Use->getOpcode() == Instruction::SRem ? 0 : 1;
44+
if (Use->getOperand(OpIdx) == phiNode) {
3245
llvm::errs() << "Got our user! " << *Use << "\n";
3346
llvm::errs() << "Operand 1: " << *Use->getOperand(1) << "\n";
3447
auto *freezePhi = new FreezeInst(phiNode, phiNode->getName() + ".frozen", Use->getIterator());
35-
Use->setOperand(1, freezePhi);
48+
Use->setOperand(OpIdx, freezePhi);
3649
Changed = true;
3750
}
51+
#endif
3852
}
3953
return Changed;
4054
}

0 commit comments

Comments
 (0)