diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp index f1e97ce006beb7..eba3a11bff195e 100644 --- a/llvm/lib/Transforms/Scalar/SCCP.cpp +++ b/llvm/lib/Transforms/Scalar/SCCP.cpp @@ -965,6 +965,10 @@ void SCCPSolver::visitBinaryOperator(Instruction &I) { return (void)markConstant(IV, &I, C); } + // Only use ranges for binary operators on integers. + if (!I.getType()->isIntegerTy()) + return markOverdefined(&I); + // Operands are either constant ranges, notconstant, overdefined or one of the // operands is a constant. ConstantRange A = ConstantRange::getFull(I.getType()->getScalarSizeInBits()); diff --git a/llvm/test/Transforms/SCCP/ip-ranges-casts.ll b/llvm/test/Transforms/SCCP/ip-ranges-casts.ll index 6a4e5764dcf384..c7a53c11897749 100644 --- a/llvm/test/Transforms/SCCP/ip-ranges-casts.ll +++ b/llvm/test/Transforms/SCCP/ip-ranges-casts.ll @@ -294,3 +294,20 @@ define i1 @int_range_to_double_cast(i32 %a) { %tmp11 = fcmp olt double %tmp4, %tmp10 ret i1 %tmp11 } + +; Make sure we do not use ranges to propagate info from vectors. +define i16 @vector_binop_and_cast() { +; CHECK-LABEL: define i16 @vector_binop_and_cast( +; CHECK-NEXT: entry: +; CHECK-NEXT: %vecinit7 = insertelement <8 x i16> , i16 undef, i32 0 +; CHECK-NEXT: %rem = srem <8 x i16> , %vecinit7 +; CHECK-NEXT: %0 = bitcast <8 x i16> %rem to i128 +; CHECK-NEXT: %1 = trunc i128 %0 to i16 +; CHECK-NEXT: ret i16 %1 +entry: + %vecinit7 = insertelement <8 x i16> , i16 undef, i32 0 + %rem = srem <8 x i16> , %vecinit7 + %0 = bitcast <8 x i16> %rem to i128 + %1 = trunc i128 %0 to i16 + ret i16 %1 +}