Lines Matching refs:Ops

714   Value *EmitMul(const BinOpInfo &Ops) {  in EmitMul()  argument
715 if (Ops.Ty->isSignedIntegerOrEnumerationType()) { in EmitMul()
718 return Builder.CreateMul(Ops.LHS, Ops.RHS, "mul"); in EmitMul()
721 return Builder.CreateNSWMul(Ops.LHS, Ops.RHS, "mul"); in EmitMul()
724 if (CanElideOverflowCheck(CGF.getContext(), Ops)) in EmitMul()
725 return Builder.CreateNSWMul(Ops.LHS, Ops.RHS, "mul"); in EmitMul()
726 return EmitOverflowCheckedBinOp(Ops); in EmitMul()
730 if (Ops.Ty->isConstantMatrixType()) { in EmitMul()
734 auto *BO = cast<BinaryOperator>(Ops.E); in EmitMul()
739 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Ops.FPFeatures); in EmitMul()
741 return MB.CreateMatrixMultiply(Ops.LHS, Ops.RHS, LHSMatTy->getNumRows(), in EmitMul()
744 return MB.CreateScalarMultiply(Ops.LHS, Ops.RHS); in EmitMul()
747 if (Ops.Ty->isUnsignedIntegerType() && in EmitMul()
749 !CanElideOverflowCheck(CGF.getContext(), Ops)) in EmitMul()
750 return EmitOverflowCheckedBinOp(Ops); in EmitMul()
752 if (Ops.LHS->getType()->isFPOrFPVectorTy()) { in EmitMul()
754 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Ops.FPFeatures); in EmitMul()
755 return Builder.CreateFMul(Ops.LHS, Ops.RHS, "mul"); in EmitMul()
757 if (Ops.isFixedPointOp()) in EmitMul()
758 return EmitFixedPointBinOp(Ops); in EmitMul()
759 return Builder.CreateMul(Ops.LHS, Ops.RHS, "mul"); in EmitMul()
763 Value *EmitOverflowCheckedBinOp(const BinOpInfo &Ops);
766 void EmitUndefinedBehaviorIntegerDivAndRemCheck(const BinOpInfo &Ops,
775 Value *EmitDiv(const BinOpInfo &Ops);
776 Value *EmitRem(const BinOpInfo &Ops);
777 Value *EmitAdd(const BinOpInfo &Ops);
778 Value *EmitSub(const BinOpInfo &Ops);
779 Value *EmitShl(const BinOpInfo &Ops);
780 Value *EmitShr(const BinOpInfo &Ops);
781 Value *EmitAnd(const BinOpInfo &Ops) { in EmitAnd() argument
782 return Builder.CreateAnd(Ops.LHS, Ops.RHS, "and"); in EmitAnd()
784 Value *EmitXor(const BinOpInfo &Ops) { in EmitXor() argument
785 return Builder.CreateXor(Ops.LHS, Ops.RHS, "xor"); in EmitXor()
787 Value *EmitOr (const BinOpInfo &Ops) { in EmitOr() argument
788 return Builder.CreateOr(Ops.LHS, Ops.RHS, "or"); in EmitOr()
792 Value *EmitFixedPointBinOp(const BinOpInfo &Ops);
3219 const BinOpInfo &Ops, llvm::Value *Zero, bool isDiv) { in EmitUndefinedBehaviorIntegerDivAndRemCheck() argument
3223 Checks.push_back(std::make_pair(Builder.CreateICmpNE(Ops.RHS, Zero), in EmitUndefinedBehaviorIntegerDivAndRemCheck()
3227 const auto *BO = cast<BinaryOperator>(Ops.E); in EmitUndefinedBehaviorIntegerDivAndRemCheck()
3229 Ops.Ty->hasSignedIntegerRepresentation() && in EmitUndefinedBehaviorIntegerDivAndRemCheck()
3231 Ops.mayHaveIntegerOverflow()) { in EmitUndefinedBehaviorIntegerDivAndRemCheck()
3238 llvm::Value *LHSCmp = Builder.CreateICmpNE(Ops.LHS, IntMin); in EmitUndefinedBehaviorIntegerDivAndRemCheck()
3239 llvm::Value *RHSCmp = Builder.CreateICmpNE(Ops.RHS, NegOne); in EmitUndefinedBehaviorIntegerDivAndRemCheck()
3246 EmitBinOpCheck(Checks, Ops); in EmitUndefinedBehaviorIntegerDivAndRemCheck()
3249 Value *ScalarExprEmitter::EmitDiv(const BinOpInfo &Ops) { in EmitDiv() argument
3254 Ops.Ty->isIntegerType() && in EmitDiv()
3255 (Ops.mayHaveIntegerDivisionByZero() || Ops.mayHaveIntegerOverflow())) { in EmitDiv()
3256 llvm::Value *Zero = llvm::Constant::getNullValue(ConvertType(Ops.Ty)); in EmitDiv()
3257 EmitUndefinedBehaviorIntegerDivAndRemCheck(Ops, Zero, true); in EmitDiv()
3259 Ops.Ty->isRealFloatingType() && in EmitDiv()
3260 Ops.mayHaveFloatDivisionByZero()) { in EmitDiv()
3261 llvm::Value *Zero = llvm::Constant::getNullValue(ConvertType(Ops.Ty)); in EmitDiv()
3262 llvm::Value *NonZero = Builder.CreateFCmpUNE(Ops.RHS, Zero); in EmitDiv()
3264 Ops); in EmitDiv()
3268 if (Ops.Ty->isConstantMatrixType()) { in EmitDiv()
3272 auto *BO = cast<BinaryOperator>(Ops.E); in EmitDiv()
3279 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Ops.FPFeatures); in EmitDiv()
3280 return MB.CreateScalarDiv(Ops.LHS, Ops.RHS, in EmitDiv()
3281 Ops.Ty->hasUnsignedIntegerRepresentation()); in EmitDiv()
3284 if (Ops.LHS->getType()->isFPOrFPVectorTy()) { in EmitDiv()
3286 CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Ops.FPFeatures); in EmitDiv()
3287 Val = Builder.CreateFDiv(Ops.LHS, Ops.RHS, "div"); in EmitDiv()
3305 else if (Ops.isFixedPointOp()) in EmitDiv()
3306 return EmitFixedPointBinOp(Ops); in EmitDiv()
3307 else if (Ops.Ty->hasUnsignedIntegerRepresentation()) in EmitDiv()
3308 return Builder.CreateUDiv(Ops.LHS, Ops.RHS, "div"); in EmitDiv()
3310 return Builder.CreateSDiv(Ops.LHS, Ops.RHS, "div"); in EmitDiv()
3313 Value *ScalarExprEmitter::EmitRem(const BinOpInfo &Ops) { in EmitRem() argument
3317 Ops.Ty->isIntegerType() && in EmitRem()
3318 (Ops.mayHaveIntegerDivisionByZero() || Ops.mayHaveIntegerOverflow())) { in EmitRem()
3320 llvm::Value *Zero = llvm::Constant::getNullValue(ConvertType(Ops.Ty)); in EmitRem()
3321 EmitUndefinedBehaviorIntegerDivAndRemCheck(Ops, Zero, false); in EmitRem()
3324 if (Ops.Ty->hasUnsignedIntegerRepresentation()) in EmitRem()
3325 return Builder.CreateURem(Ops.LHS, Ops.RHS, "rem"); in EmitRem()
3327 return Builder.CreateSRem(Ops.LHS, Ops.RHS, "rem"); in EmitRem()
3330 Value *ScalarExprEmitter::EmitOverflowCheckedBinOp(const BinOpInfo &Ops) { in EmitOverflowCheckedBinOp() argument
3335 bool isSigned = Ops.Ty->isSignedIntegerOrEnumerationType(); in EmitOverflowCheckedBinOp()
3336 switch (Ops.Opcode) { in EmitOverflowCheckedBinOp()
3366 llvm::Type *opTy = CGF.CGM.getTypes().ConvertType(Ops.Ty); in EmitOverflowCheckedBinOp()
3370 Value *resultAndOverflow = Builder.CreateCall(intrinsic, {Ops.LHS, Ops.RHS}); in EmitOverflowCheckedBinOp()
3384 EmitBinOpCheck(std::make_pair(NotOverflow, Kind), Ops); in EmitOverflowCheckedBinOp()
3412 llvm::Value *lhs = Builder.CreateSExt(Ops.LHS, CGF.Int64Ty); in EmitOverflowCheckedBinOp()
3413 llvm::Value *rhs = Builder.CreateSExt(Ops.RHS, CGF.Int64Ty); in EmitOverflowCheckedBinOp()
3918 Value *ScalarExprEmitter::EmitShl(const BinOpInfo &Ops) { in EmitShl() argument
3920 if (Ops.isFixedPointOp()) in EmitShl()
3921 return EmitFixedPointBinOp(Ops); in EmitShl()
3925 Value *RHS = Ops.RHS; in EmitShl()
3926 if (Ops.LHS->getType() != RHS->getType()) in EmitShl()
3927 RHS = Builder.CreateIntCast(RHS, Ops.LHS->getType(), false, "sh_prom"); in EmitShl()
3930 Ops.Ty->hasSignedIntegerRepresentation() && in EmitShl()
3935 Ops.Ty->hasUnsignedIntegerRepresentation(); in EmitShl()
3940 RHS = ConstrainShiftValue(Ops.LHS, RHS, "shl.mask"); in EmitShl()
3942 isa<llvm::IntegerType>(Ops.LHS->getType())) { in EmitShl()
3945 llvm::Value *WidthMinusOne = GetWidthMinusOneValue(Ops.LHS, Ops.RHS); in EmitShl()
3946 llvm::Value *ValidExponent = Builder.CreateICmpULE(Ops.RHS, WidthMinusOne); in EmitShl()
3962 (RHS == Ops.RHS) ? WidthMinusOne in EmitShl()
3963 : GetWidthMinusOneValue(Ops.LHS, RHS); in EmitShl()
3966 Ops.LHS, Builder.CreateSub(PromotedWidthMinusOne, RHS, "shl.zeros", in EmitShl()
3990 EmitBinOpCheck(Checks, Ops); in EmitShl()
3993 return Builder.CreateShl(Ops.LHS, RHS, "shl"); in EmitShl()
3996 Value *ScalarExprEmitter::EmitShr(const BinOpInfo &Ops) { in EmitShr() argument
3998 if (Ops.isFixedPointOp()) in EmitShr()
3999 return EmitFixedPointBinOp(Ops); in EmitShr()
4003 Value *RHS = Ops.RHS; in EmitShr()
4004 if (Ops.LHS->getType() != RHS->getType()) in EmitShr()
4005 RHS = Builder.CreateIntCast(RHS, Ops.LHS->getType(), false, "sh_prom"); in EmitShr()
4009 RHS = ConstrainShiftValue(Ops.LHS, RHS, "shr.mask"); in EmitShr()
4011 isa<llvm::IntegerType>(Ops.LHS->getType())) { in EmitShr()
4014 Builder.CreateICmpULE(RHS, GetWidthMinusOneValue(Ops.LHS, RHS)); in EmitShr()
4015 EmitBinOpCheck(std::make_pair(Valid, SanitizerKind::ShiftExponent), Ops); in EmitShr()
4018 if (Ops.Ty->hasUnsignedIntegerRepresentation()) in EmitShr()
4019 return Builder.CreateLShr(Ops.LHS, RHS, "shr"); in EmitShr()
4020 return Builder.CreateAShr(Ops.LHS, RHS, "shr"); in EmitShr()