/* PR target/80968 */
/* { dg-do compile } */
/* { dg-skip-if "no register windows" { *-*-* } { "-mflat" } { "" } } */
/* { dg-require-effective-target ilp32 } */
/* { dg-options "-mcpu=ultrasparc -O" } */

/* Make sure references to the stack frame do not slip into the delay slot
   of a return instruction.  */

struct crypto_shash {
	unsigned int descsize;
};
struct crypto_shash *tfm;

struct shash_desc {
	struct crypto_shash *tfm;
	unsigned int flags;

	void *__ctx[] __attribute__((aligned(8)));
};

static inline unsigned int crypto_shash_descsize(struct crypto_shash *tfm)
{
	return tfm->descsize;
}

static inline void *shash_desc_ctx(struct shash_desc *desc)
{
	return desc->__ctx;
}

#define SHASH_DESC_ON_STACK(shash, ctx)				  \
	char __##shash##_desc[sizeof(struct shash_desc) +	  \
			      crypto_shash_descsize(ctx)] __attribute__((aligned(8))); \
	struct shash_desc *shash = (struct shash_desc *)__##shash##_desc

extern int crypto_shash_update(struct shash_desc *, const void *, unsigned int);

unsigned int bug(unsigned int crc, const void *address, unsigned int length)
{
	SHASH_DESC_ON_STACK(shash, tfm);
	unsigned int *ctx = (unsigned int *)shash_desc_ctx(shash);
	int err;

	shash->tfm = tfm;
	shash->flags = 0;
	*ctx = crc;

	err = crypto_shash_update(shash, address, length);

	return *ctx;
}
/* { dg-final { scan-assembler "ld\[ \t\]*\\\[%\[a-z0-9\]*\\+\[0-9\]*\\\], %i0\n\[^\n\]*return\[ \t\]*%i7\\+8" } } */
