From d0a8ecaa52c0ced807708f935a67f6d7e6560db2 Mon Sep 17 00:00:00 2001 From: Eduard-Mihai Burtescu Date: Tue, 12 Oct 2021 15:58:53 +0300 Subject: [PATCH] tests: adjust for lack of `PassMode::{Indirect, Cast}`. --- tests/ui/dis/entry-pass-mode-cast-array.rs | 16 ++++++++++ .../ui/dis/entry-pass-mode-cast-array.stderr | 21 +++++++++++++ tests/ui/dis/issue-373.rs | 23 ++++++++++++++ tests/ui/dis/issue-373.stderr | 11 +++++++ tests/ui/dis/issue-723-indirect-input.rs | 17 ----------- tests/ui/dis/issue-723-indirect-input.stderr | 23 -------------- tests/ui/dis/issue-731.rs | 14 +++++++++ tests/ui/dis/issue-731.stderr | 21 +++++++++++++ tests/ui/dis/pass-mode-cast-struct.rs | 30 +++++++++++++++++++ tests/ui/dis/pass-mode-cast-struct.stderr | 22 ++++++++++++++ 10 files changed, 158 insertions(+), 40 deletions(-) create mode 100644 tests/ui/dis/entry-pass-mode-cast-array.rs create mode 100644 tests/ui/dis/entry-pass-mode-cast-array.stderr create mode 100644 tests/ui/dis/issue-373.rs create mode 100644 tests/ui/dis/issue-373.stderr delete mode 100644 tests/ui/dis/issue-723-indirect-input.rs delete mode 100644 tests/ui/dis/issue-723-indirect-input.stderr create mode 100644 tests/ui/dis/issue-731.rs create mode 100644 tests/ui/dis/issue-731.stderr create mode 100644 tests/ui/dis/pass-mode-cast-struct.rs create mode 100644 tests/ui/dis/pass-mode-cast-struct.stderr diff --git a/tests/ui/dis/entry-pass-mode-cast-array.rs b/tests/ui/dis/entry-pass-mode-cast-array.rs new file mode 100644 index 0000000000..8b5f5d2720 --- /dev/null +++ b/tests/ui/dis/entry-pass-mode-cast-array.rs @@ -0,0 +1,16 @@ +// This is a similar setup to the `issue-731` test, but instead of "just" the +// missing copy out of the global (`Input`) `OpVariable`, small enough types +// would fail much earlier (by generating unsupported pointer casts). +// (Just like `issue-373`, the problem was the use of `PassMode::Cast`, through +// the default Rust ABI adjustments, that we now override through query hooks) + +// build-pass +// compile-flags: -C llvm-args=--disassemble-entry=main + +use spirv_std as _; + +#[spirv(fragment)] +pub fn main(mut in_array: [f32; 2], out_array: &mut [f32; 2]) { + in_array[0] += 1.0; + *out_array = in_array; +} diff --git a/tests/ui/dis/entry-pass-mode-cast-array.stderr b/tests/ui/dis/entry-pass-mode-cast-array.stderr new file mode 100644 index 0000000000..6e005555eb --- /dev/null +++ b/tests/ui/dis/entry-pass-mode-cast-array.stderr @@ -0,0 +1,21 @@ +%1 = OpFunction %2 None %3 +%4 = OpLabel +%5 = OpVariable %6 Function +%7 = OpVariable %6 Function +OpLine %8 13 12 +%9 = OpLoad %10 %11 +OpLine %8 13 0 +OpStore %5 %9 +OpLine %8 14 4 +%12 = OpInBoundsAccessChain %13 %5 %14 +%15 = OpInBoundsAccessChain %13 %5 %14 +%16 = OpLoad %17 %15 +%18 = OpFAdd %17 %16 %19 +OpStore %12 %18 +OpLine %8 15 17 +OpCopyMemory %7 %5 +OpLine %8 15 4 +OpCopyMemory %20 %7 +OpLine %8 16 1 +OpReturn +OpFunctionEnd diff --git a/tests/ui/dis/issue-373.rs b/tests/ui/dis/issue-373.rs new file mode 100644 index 0000000000..5f15870316 --- /dev/null +++ b/tests/ui/dis/issue-373.rs @@ -0,0 +1,23 @@ +// Test that returning a single-scalar-field `#[repr(C)] struct` doesn't generate +// unsupported pointer casts (the problem was the use of `PassMode::Cast`, through +// the default Rust ABI adjustments, that we now override through query hooks). + +// build-pass +// compile-flags: -C llvm-args=--disassemble-entry=main + +use spirv_std as _; + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct S { + x: f32, +} + +fn f() -> S { + S { x: 2.0 } +} + +#[spirv(fragment)] +pub fn main(out: &mut f32) { + *out = f().x; +} diff --git a/tests/ui/dis/issue-373.stderr b/tests/ui/dis/issue-373.stderr new file mode 100644 index 0000000000..ab8e636257 --- /dev/null +++ b/tests/ui/dis/issue-373.stderr @@ -0,0 +1,11 @@ +%1 = OpFunction %2 None %3 +%4 = OpLabel +OpLine %5 22 11 +%6 = OpFunctionCall %7 %8 +OpLine %5 22 11 +%9 = OpCompositeExtract %10 %6 0 +OpLine %5 22 4 +OpStore %11 %9 +OpLine %5 23 1 +OpReturn +OpFunctionEnd diff --git a/tests/ui/dis/issue-723-indirect-input.rs b/tests/ui/dis/issue-723-indirect-input.rs deleted file mode 100644 index 6995b37e0b..0000000000 --- a/tests/ui/dis/issue-723-indirect-input.rs +++ /dev/null @@ -1,17 +0,0 @@ -// Test that interface (global) `OpVariable`s mentioned by `OpEntryPoint` don't -// have to be used by the shader, for storage class inference to succeed. - -// NOTE(eddyb) this test will likely become useless (won't fail without the fix) -// once we start doing the copy out of the `Input` and into a `Function`-scoped -// `OpVariable` (see #731), that's why there is another `issue-723-*` test. - -// build-pass -// compile-flags: -C llvm-args=--disassemble-globals -// normalize-stderr-test "OpCapability VulkanMemoryModel\n" -> "" -// normalize-stderr-test "OpExtension .SPV_KHR_vulkan_memory_model.\n" -> "" -// normalize-stderr-test "OpMemoryModel Logical Vulkan" -> "OpMemoryModel Logical Simple" - -use spirv_std as _; - -#[spirv(fragment)] -pub fn main(/* unused Input */ _: [f32; 3]) {} diff --git a/tests/ui/dis/issue-723-indirect-input.stderr b/tests/ui/dis/issue-723-indirect-input.stderr deleted file mode 100644 index 2b511a952b..0000000000 --- a/tests/ui/dis/issue-723-indirect-input.stderr +++ /dev/null @@ -1,23 +0,0 @@ -OpCapability Float64 -OpCapability Int16 -OpCapability Int64 -OpCapability Int8 -OpCapability ShaderClockKHR -OpCapability Shader -OpExtension "SPV_KHR_shader_clock" -OpMemoryModel Logical Simple -OpEntryPoint Fragment %1 "main" %2 -OpExecutionMode %1 OriginUpperLeft -%3 = OpString "$OPSTRING_FILENAME/issue-723-indirect-input.rs" -OpName %4 "issue_723_indirect_input::main" -OpDecorate %5 ArrayStride 4 -OpDecorate %2 Location 0 -%6 = OpTypeVoid -%7 = OpTypeFloat 32 -%8 = OpTypeInt 32 0 -%9 = OpConstant %8 3 -%5 = OpTypeArray %7 %9 -%10 = OpTypeFunction %6 %5 -%11 = OpTypeFunction %6 -%12 = OpTypePointer Input %5 -%2 = OpVariable %12 Input diff --git a/tests/ui/dis/issue-731.rs b/tests/ui/dis/issue-731.rs new file mode 100644 index 0000000000..2617c5ad85 --- /dev/null +++ b/tests/ui/dis/issue-731.rs @@ -0,0 +1,14 @@ +// Test that non-immediate (i.e. not one of scalar/scalar-pair/vector) inputs +// get properly copied out of the global (`Input`) `OpVariable` and mutation is +// only ever done on `fn`-local `OpVariable`s, not on the original global. + +// build-pass +// compile-flags: -C llvm-args=--disassemble-entry=main + +use spirv_std as _; + +#[spirv(fragment)] +pub fn main(mut in_array: [f32; 3], out_array: &mut [f32; 3]) { + in_array[0] += 1.0; + *out_array = in_array; +} diff --git a/tests/ui/dis/issue-731.stderr b/tests/ui/dis/issue-731.stderr new file mode 100644 index 0000000000..98540db57f --- /dev/null +++ b/tests/ui/dis/issue-731.stderr @@ -0,0 +1,21 @@ +%1 = OpFunction %2 None %3 +%4 = OpLabel +%5 = OpVariable %6 Function +%7 = OpVariable %6 Function +OpLine %8 11 12 +%9 = OpLoad %10 %11 +OpLine %8 11 0 +OpStore %5 %9 +OpLine %8 12 4 +%12 = OpInBoundsAccessChain %13 %5 %14 +%15 = OpInBoundsAccessChain %13 %5 %14 +%16 = OpLoad %17 %15 +%18 = OpFAdd %17 %16 %19 +OpStore %12 %18 +OpLine %8 13 17 +OpCopyMemory %7 %5 +OpLine %8 13 4 +OpCopyMemory %20 %7 +OpLine %8 14 1 +OpReturn +OpFunctionEnd diff --git a/tests/ui/dis/pass-mode-cast-struct.rs b/tests/ui/dis/pass-mode-cast-struct.rs new file mode 100644 index 0000000000..f476c8635e --- /dev/null +++ b/tests/ui/dis/pass-mode-cast-struct.rs @@ -0,0 +1,30 @@ +// Test that a small enough `struct` doesn't generate unsupported pointer casts. +// (Just like `issue-373`, the problem was the use of `PassMode::Cast`, through +// the default Rust ABI adjustments, that we now override through query hooks) + +// build-pass +// compile-flags: -C llvm-args=--disassemble-entry=main + +use spirv_std as _; + +struct Foo { + a: u32, + b: u8, + c: u8, +} + +impl Foo { + fn unpack(data: u64) -> Self { + Self { + a: (data >> 16 & 0xffffff) as u32, + b: (data & 0xff >> 8) as u8, + c: (data & 0xff) as u8, + } + } +} + +#[spirv(fragment)] +pub fn main(in_packed: u64, out_sum: &mut u32) { + let foo = Foo::unpack(in_packed); + *out_sum = foo.a + (foo.b + foo.c) as u32; +} diff --git a/tests/ui/dis/pass-mode-cast-struct.stderr b/tests/ui/dis/pass-mode-cast-struct.stderr new file mode 100644 index 0000000000..5c44a83105 --- /dev/null +++ b/tests/ui/dis/pass-mode-cast-struct.stderr @@ -0,0 +1,22 @@ +%1 = OpFunction %2 None %3 +%4 = OpLabel +OpLine %5 27 12 +%6 = OpLoad %7 %8 +OpLine %5 28 14 +%9 = OpFunctionCall %10 %11 %6 +OpLine %5 29 15 +%12 = OpCompositeExtract %13 %9 0 +OpLine %5 29 24 +%14 = OpCompositeExtract %15 %9 1 +OpLine %5 29 32 +%16 = OpCompositeExtract %15 %9 2 +OpLine %5 29 23 +%17 = OpIAdd %15 %14 %16 +OpLine %5 29 23 +%18 = OpUConvert %13 %17 +OpLine %5 29 4 +%19 = OpIAdd %13 %12 %18 +OpStore %20 %19 +OpLine %5 30 1 +OpReturn +OpFunctionEnd