blob: 5125b48dc460139a601644a3ee3f51a91e28957d [file] [log] [blame] [edit]
; RUN: clspv-opt --LongVectorLowering --early-cse --instcombine %s -o %t
; RUN: FileCheck %s < %t
; Test that function arguments and return types can be lowered;
; also cover function calls.
; Rely on CSE and InstCombine to simplify the generated IR.
target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
target triple = "spir-unknown-unknown"
; @foo doesn't require any lowering
define spir_func i32 @foo() {
ret i32 42
}
; @id requires lowering for parameter and return types
define spir_func <8 x float> @id(<8 x float> %x) {
ret <8 x float> %x
}
; @test1 requires lowering for parameter and return types, and call instruction.
; Ensures metadata is preserved.
define spir_func <8 x float> @test1(<8 x float> %x) !info !0 {
%y = call spir_func <8 x float> @id(<8 x float> %x), !info !0
ret <8 x float> %y
}
; @test2 requires lowering for return type, but not for call instruction.
define spir_func <8 x i32> @test2(i32 %a) {
%b = call spir_func i32 @foo()
%c = add i32 %a, %b
%d = insertelement <8 x i32> undef, i32 %c, i32 0
%e = shufflevector <8 x i32> %d, <8 x i32> undef, <8 x i32> zeroinitializer
ret <8 x i32> %e
}
!0 = !{!"some metadata"}
; CHECK-NOT: <8 x float>
; CHECK-NOT: <8 x i32>
;
; CHECK-LABEL: define spir_func
; CHECK-SAME: [[INT8:{ i32, i32, i32, i32, i32, i32, i32, i32 }]]
; CHECK-SAME: @test2(i32 {{%[^ ]+}})
; CHECK-NEXT: call spir_func i32 @foo()
; CHECK: ret [[INT8]] {{%[^ ]+}}
;
; CHECK-LABEL: define spir_func
; CHECK-SAME: [[FLOAT8:{ float, float, float, float, float, float, float, float }]]
; CHECK-SAME: @test1([[FLOAT8]] [[X:%[^ ]+]])
; CHECK-SAME: !info [[MD:![0-9]+]]
; CHECK-NEXT: [[Y:%[^ ]+]] = call spir_func [[FLOAT8]] @id([[FLOAT8]] [[X]])
; CHECK-SAME: !info [[MD]]
; CHECK-NEXT: ret [[FLOAT8]] [[Y]]
;
; CHECK-LABEL: define spir_func
; CHECK-SAME: [[FLOAT8]] @id([[FLOAT8]] [[X:%[^ ]+]])
; CHECK-NEXT: ret [[FLOAT8]] [[X]]
;
; CHECK: [[MD]] = !{!"some metadata"}