@@ -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