[llvm] [SCCP] [Transform] Adding ICMP folding for zext and sext in SCCPSolver (PR #67594)
Marianne Mailhot-Sarrasin via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 27 12:59:28 PDT 2023
================
@@ -193,6 +193,60 @@ static bool replaceSignedInst(SCCPSolver &Solver,
NewInst = BinaryOperator::Create(NewOpcode, Op0, Op1, "", &Inst);
break;
}
+ case Instruction::ICmp: {
+ ICmpInst &ICmp = cast<ICmpInst>(Inst);
+
+ ZExtInst *Op0_zext = dyn_cast<ZExtInst>(ICmp.getOperand(0));
+ SExtInst *Op0_sext = dyn_cast<SExtInst>(ICmp.getOperand(0));
+
+ ZExtInst *Op1_zext = dyn_cast<ZExtInst>(ICmp.getOperand(1));
+ SExtInst *Op1_sext = dyn_cast<SExtInst>(ICmp.getOperand(1));
+
+ CastInst *Op0;
+ CastInst *Op1;
+
+ if (Op0_zext) Op0 = Op0_zext; else Op0 = Op0_sext;
+ if (Op1_zext) Op1 = Op1_zext; else Op1 = Op1_sext;
+
+ bool reversed = false;
+
+ if (!Op0 || !Op1){
+ // Op0 and Op1 must be defined
+ return false;
+ }
+
+ if (Op1_zext && (! Op0_zext)){
+ // We force Op0 to be a zext and reverse the arguments
+ // at the end if we swap
+ reversed = true;
+
+ std::swap(Op0_zext, Op1_zext);
+ std::swap(Op0_sext, Op1_sext);
+ std::swap(Op0, Op1);
+ }
+
+
+ if(Op0->getType() != Op1->getType()){
----------------
mariannems wrote:
Its is always better to exit early. This check should ideally be done before potential swapping.
https://github.com/llvm/llvm-project/pull/67594
More information about the llvm-commits
mailing list