Skip to content

Commit

Permalink
tests: adjust for lack of PassMode::{Indirect, Cast}.
Browse files Browse the repository at this point in the history
  • Loading branch information
eddyb committed Oct 20, 2021
1 parent 38f460a commit d0a8eca
Show file tree
Hide file tree
Showing 10 changed files with 158 additions and 40 deletions.
16 changes: 16 additions & 0 deletions tests/ui/dis/entry-pass-mode-cast-array.rs
Original file line number Diff line number Diff line change
@@ -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;
}
21 changes: 21 additions & 0 deletions tests/ui/dis/entry-pass-mode-cast-array.stderr
Original file line number Diff line number Diff line change
@@ -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
23 changes: 23 additions & 0 deletions tests/ui/dis/issue-373.rs
Original file line number Diff line number Diff line change
@@ -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;
}
11 changes: 11 additions & 0 deletions tests/ui/dis/issue-373.stderr
Original file line number Diff line number Diff line change
@@ -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
17 changes: 0 additions & 17 deletions tests/ui/dis/issue-723-indirect-input.rs

This file was deleted.

23 changes: 0 additions & 23 deletions tests/ui/dis/issue-723-indirect-input.stderr

This file was deleted.

14 changes: 14 additions & 0 deletions tests/ui/dis/issue-731.rs
Original file line number Diff line number Diff line change
@@ -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;
}
21 changes: 21 additions & 0 deletions tests/ui/dis/issue-731.stderr
Original file line number Diff line number Diff line change
@@ -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
30 changes: 30 additions & 0 deletions tests/ui/dis/pass-mode-cast-struct.rs
Original file line number Diff line number Diff line change
@@ -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;
}
22 changes: 22 additions & 0 deletions tests/ui/dis/pass-mode-cast-struct.stderr
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit d0a8eca

Please sign in to comment.