1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00

[IR] restrict vector reduction intrinsic types

The arguments in all cases should be vectors of exactly one of integer or FP.

All of the tests currently pass the verifier because we check for any vector
type regardless of the type of reduction.
This obviously can't work if we mix up integer and FP, and based on current
LangRef text it was not intended to work for pointers either.

The pointer case from https://llvm.org/PR49215 is what led me here. That
example was avoided with 5b250a27ec.

Differential Revision: https://reviews.llvm.org/D96904
This commit is contained in:
Sanjay Patel 2021-02-21 12:33:53 -05:00
parent 80c50652f7
commit 3d791c7666
2 changed files with 57 additions and 0 deletions

View File

@ -5018,6 +5018,36 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
break;
}
case Intrinsic::vector_reduce_and:
case Intrinsic::vector_reduce_or:
case Intrinsic::vector_reduce_xor:
case Intrinsic::vector_reduce_add:
case Intrinsic::vector_reduce_mul:
case Intrinsic::vector_reduce_smax:
case Intrinsic::vector_reduce_smin:
case Intrinsic::vector_reduce_umax:
case Intrinsic::vector_reduce_umin: {
Type *ArgTy = Call.getArgOperand(0)->getType();
Assert(ArgTy->isIntOrIntVectorTy() && ArgTy->isVectorTy(),
"Intrinsic has incorrect argument type!");
break;
}
case Intrinsic::vector_reduce_fmax:
case Intrinsic::vector_reduce_fmin: {
Type *ArgTy = Call.getArgOperand(0)->getType();
Assert(ArgTy->isFPOrFPVectorTy() && ArgTy->isVectorTy(),
"Intrinsic has incorrect argument type!");
break;
}
case Intrinsic::vector_reduce_fadd:
case Intrinsic::vector_reduce_fmul: {
// Unlike the other reductions, the first argument is a start value. The
// second argument is the vector to be reduced.
Type *ArgTy = Call.getArgOperand(1)->getType();
Assert(ArgTy->isFPOrFPVectorTy() && ArgTy->isVectorTy(),
"Intrinsic has incorrect argument type!");
break;
}
case Intrinsic::smul_fix:
case Intrinsic::smul_fix_sat:
case Intrinsic::umul_fix:

View File

@ -30,6 +30,33 @@ define i64 @result_too_wide(<4 x i32> %x) {
ret i64 %r
}
; We should have the appropriate (either int or FP) type of argument
; for any vector reduction.
define float @not_float_reduce(<4 x float> %x) {
; CHECK: Intrinsic has incorrect argument type!
%r = call float @llvm.vector.reduce.umin.v4f32(<4 x float> %x)
ret float %r
}
define i32* @not_pointer_reduce(<4 x i32*> %x) {
; CHECK: Intrinsic has incorrect argument type!
%r = call i32* @llvm.vector.reduce.or.v4p0i32(<4 x i32*> %x)
ret i32* %r
}
define i32 @not_integer_reduce(<4 x i32> %x) {
; CHECK: Intrinsic has incorrect argument type!
%r = call i32 @llvm.vector.reduce.fadd.v4i32(i32 0, <4 x i32> %x)
ret i32 %r
}
define i32* @not_pointer_reduce2(<4 x i32*> %x) {
; CHECK: Intrinsic has incorrect argument type!
%r = call i32* @llvm.vector.reduce.fmin.v4p0i32(<4 x i32*> %x)
ret i32* %r
}
declare float @llvm.vector.reduce.umin.v4f32(<4 x float>)
declare i32* @llvm.vector.reduce.or.v4p0i32(<4 x i32*>)
declare i32 @llvm.vector.reduce.fadd.v4i32(i32, <4 x i32>)