[llvm] [InstSimplify] Implement simple folds for `ucmp`/`scmp` intrinsics (PR #95601)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Sat Jun 15 14:24:48 PDT 2024
================
@@ -6505,6 +6505,29 @@ Value *llvm::simplifyBinaryIntrinsic(Intrinsic::ID IID, Type *ReturnType,
break;
}
+ case Intrinsic::scmp:
+ case Intrinsic::ucmp: {
+ // Fold cmp x, x -> 0
+ if (Op0 == Op1)
+ return Constant::getNullValue(ReturnType);
+
+ // Fold to a constant if the relationship between operands can be
+ // established with certainty
+ if (isICmpTrue(CmpInst::ICMP_EQ, Op0, Op1, Q, RecursionLimit))
+ return Constant::getNullValue(ReturnType);
+
+ ICmpInst::Predicate PredGT =
+ IID == Intrinsic::scmp ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
+ if (isICmpTrue(PredGT, Op0, Op1, Q, RecursionLimit))
+ return ConstantInt::get(ReturnType, 1);
+
+ ICmpInst::Predicate PredLT =
+ IID == Intrinsic::scmp ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
+ if (isICmpTrue(PredLT, Op0, Op1, Q, RecursionLimit))
+ return ConstantInt::get(ReturnType, -1, /*IsSigned*/ true);
----------------
dtcxzyw wrote:
```suggestion
return ConstantInt::getSigned(ReturnType, -1);
```
https://github.com/llvm/llvm-project/pull/95601
More information about the llvm-commits
mailing list