mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
3d791c7666
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
68 lines
2.1 KiB
LLVM
68 lines
2.1 KiB
LLVM
; RUN: not opt -S -verify < %s 2>&1 | FileCheck %s
|
|
|
|
; Reject a vector reduction with a non-vector argument.
|
|
|
|
define float @reduce_vector_not_vec_arg(float %x) {
|
|
; CHECK: Intrinsic has incorrect argument type!
|
|
%r0 = call float @llvm.vector.reduce.fmax.f32(float %x)
|
|
ret float %r0
|
|
}
|
|
|
|
define i32 @reduce_vector_not_vec_arg2(i32 %x) {
|
|
; CHECK: Intrinsic has incorrect argument type!
|
|
%r0 = call i32 @llvm.vector.reduce.smax.i32(i32 %x)
|
|
ret i32 %r0
|
|
}
|
|
|
|
; Type mismatch for start value.
|
|
|
|
define float @fadd_match_arg_types(<4 x float> %x) {
|
|
; CHECK: Intrinsic has incorrect argument type!
|
|
%r = call float @llvm.vector.reduce.fadd.v4f32(double 0.0, <4 x float> %x)
|
|
ret float %r
|
|
}
|
|
|
|
; Wrong result type.
|
|
|
|
define i64 @result_too_wide(<4 x i32> %x) {
|
|
; CHECK: Intrinsic has incorrect return type!
|
|
%r = call i64 @llvm.vector.reduce.add.v4i32(<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>)
|
|
declare float @llvm.vector.reduce.fadd.v4f32(double, <4 x float>)
|
|
declare i32* @llvm.vector.reduce.fmin.v4p0i32(<4 x i32*>)
|
|
declare float @llvm.vector.reduce.fmax.f32(float)
|
|
declare i32 @llvm.vector.reduce.smax.i32(i32)
|
|
declare i64 @llvm.vector.reduce.add.v4i32(<4 x i32>)
|