34 lines
874 B
C
34 lines
874 B
C
/* { dg-do run } */
|
|
/* { dg-options "-O2" } */
|
|
|
|
/* Test that gcn_expand_scalar_to_vector_address does not clobber VCC.
|
|
If it does then spills and reloads will be unsafe, leading to unexpected
|
|
conditional branch behaviour. */
|
|
|
|
extern void abort ();
|
|
|
|
__attribute__((vector_size(256))) int vec[2] = {{0}, {0}};
|
|
|
|
int
|
|
main()
|
|
{
|
|
long vcc = 0;
|
|
|
|
/* Load a known value into VCC. The memory barrier ensures that the vector
|
|
load must happen after this point. */
|
|
asm volatile ("s_mov_b32 vcc_lo, 0x12345689\n\t"
|
|
"s_mov_b32 vcc_hi, 0xabcdef0"
|
|
::: "memory");
|
|
|
|
/* Compiler inserts vector load here. */
|
|
|
|
/* Consume the abitrary vector, and return the current value of VCC. */
|
|
asm volatile ("; no-op" : "=cV"(vcc) : "v"(vec[0]), "v"(vec[1]));
|
|
|
|
/* The value should match the initialized value. */
|
|
if (vcc != 0xabcdef012345689)
|
|
abort ();
|
|
|
|
return 0;
|
|
}
|