@@ -1027,39 +1027,47 @@ llvm::ConstantFoldCountZeros(Register Src, const MachineRegisterInfo &MRI,
10271027
10281028std::optional<SmallVector<APInt>>
10291029llvm::ConstantFoldICmp (unsigned Pred, const Register Op1, const Register Op2,
1030+ unsigned DstSizeInBits, unsigned ExtOp,
10301031 const MachineRegisterInfo &MRI) {
1032+ assert (ExtOp == TargetOpcode::G_SEXT || ExtOp == TargetOpcode::G_ZEXT ||
1033+ ExtOp == TargetOpcode::G_ANYEXT);
1034+
10311035 LLT Ty = MRI.getType (Op1);
10321036 if (Ty != MRI.getType (Op2))
10331037 return std::nullopt ;
10341038
1035- auto TryFoldScalar = [&MRI, Pred](Register LHS,
1036- Register RHS) -> std::optional<APInt> {
1039+ const APInt FalseCst = APInt::getZero (DstSizeInBits);
1040+ const APInt TrueCst = (ExtOp == TargetOpcode::G_SEXT)
1041+ ? APInt::getAllOnes (DstSizeInBits)
1042+ : APInt::getOneBitSet (DstSizeInBits, 0 );
1043+
1044+ auto TryFoldScalar = [&](Register LHS, Register RHS) -> std::optional<APInt> {
10371045 auto LHSCst = getIConstantVRegVal (LHS, MRI);
10381046 auto RHSCst = getIConstantVRegVal (RHS, MRI);
10391047 if (!LHSCst || !RHSCst)
10401048 return std::nullopt ;
10411049
10421050 switch (Pred) {
10431051 case CmpInst::Predicate::ICMP_EQ:
1044- return APInt ( /* numBits= */ 1 , LHSCst->eq (*RHSCst)) ;
1052+ return LHSCst->eq (*RHSCst) ? TrueCst : FalseCst ;
10451053 case CmpInst::Predicate::ICMP_NE:
1046- return APInt ( /* numBits= */ 1 , LHSCst->ne (*RHSCst)) ;
1054+ return LHSCst->ne (*RHSCst) ? TrueCst : FalseCst ;
10471055 case CmpInst::Predicate::ICMP_UGT:
1048- return APInt ( /* numBits= */ 1 , LHSCst->ugt (*RHSCst)) ;
1056+ return LHSCst->ugt (*RHSCst) ? TrueCst : FalseCst ;
10491057 case CmpInst::Predicate::ICMP_UGE:
1050- return APInt ( /* numBits= */ 1 , LHSCst->uge (*RHSCst)) ;
1058+ return LHSCst->uge (*RHSCst) ? TrueCst : FalseCst ;
10511059 case CmpInst::Predicate::ICMP_ULT:
1052- return APInt ( /* numBits= */ 1 , LHSCst->ult (*RHSCst)) ;
1060+ return LHSCst->ult (*RHSCst) ? TrueCst : FalseCst ;
10531061 case CmpInst::Predicate::ICMP_ULE:
1054- return APInt ( /* numBits= */ 1 , LHSCst->ule (*RHSCst)) ;
1062+ return LHSCst->ule (*RHSCst) ? TrueCst : FalseCst ;
10551063 case CmpInst::Predicate::ICMP_SGT:
1056- return APInt ( /* numBits= */ 1 , LHSCst->sgt (*RHSCst)) ;
1064+ return LHSCst->sgt (*RHSCst) ? TrueCst : FalseCst ;
10571065 case CmpInst::Predicate::ICMP_SGE:
1058- return APInt ( /* numBits= */ 1 , LHSCst->sge (*RHSCst)) ;
1066+ return LHSCst->sge (*RHSCst) ? TrueCst : FalseCst ;
10591067 case CmpInst::Predicate::ICMP_SLT:
1060- return APInt ( /* numBits= */ 1 , LHSCst->slt (*RHSCst)) ;
1068+ return LHSCst->slt (*RHSCst) ? TrueCst : FalseCst ;
10611069 case CmpInst::Predicate::ICMP_SLE:
1062- return APInt ( /* numBits= */ 1 , LHSCst->sle (*RHSCst)) ;
1070+ return LHSCst->sle (*RHSCst) ? TrueCst : FalseCst ;
10631071 default :
10641072 return std::nullopt ;
10651073 }
0 commit comments