Value* cg_extension::safe_idiv_imod_sv( Value* lhs, Value* rhs, binary_intrin_functor div_or_mod_sv ) { Type* rhs_ty = rhs->getType(); Type* rhs_scalar_ty = rhs_ty->getScalarType(); assert( rhs_scalar_ty->isIntegerTy() ); Value* zero = Constant::getNullValue( rhs_ty ); Value* is_zero = builder_->CreateICmpEQ( rhs, zero ); Value* one_value = Constant::getIntegerValue( rhs_ty, APInt(rhs_scalar_ty->getIntegerBitWidth(), 1) ); Value* non_zero_rhs = builder_->CreateSelect( is_zero, one_value, rhs ); return div_or_mod_sv( lhs, non_zero_rhs ); }