1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 10:42:39 +01:00
llvm-mirror/test/Verifier/reduction-intrinsics.ll
Sanjay Patel 3d791c7666 [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
2021-02-21 12:37:00 -05:00

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>)