void visitCallInst(CallInst &I) { string intrinsic = I.getCalledFunction()->getName().str(); if(intrinsic.find("modmul") != -1) { CallInst *enterMontpro1 = enterMontgomery(I.getOperand(0), I.getOperand(2), &I); CallInst *enterMontpro2 = enterMontgomery(I.getOperand(1), I.getOperand(2), &I); CallInst *mulMontpro = mulMontgomery(I.getName().str(), enterMontpro1, enterMontpro2, I.getOperand(2), &I); CallInst *exitMontpro = leaveMontgomery(mulMontpro, I.getOperand(2), &I); I.replaceAllUsesWith(exitMontpro); I.removeFromParent(); } else if(intrinsic.find("modexp") != -1) { CallInst *enterMontpro1 = enterMontgomery(I.getOperand(0), I.getOperand(2), &I); CallInst *expMontpro = expMontgomery(I.getName().str(), enterMontpro1, I.getOperand(1), I.getOperand(2), &I); CallInst *exitMontpro = leaveMontgomery(expMontpro, I.getOperand(2), &I); I.replaceAllUsesWith(exitMontpro); I.eraseFromParent(); } }