/* Origin: PR target/6981 from Mattias Engdegaard . */ void exit (int); void abort (void); unsigned long long *cp, m; void foo (void) { } void bar (unsigned rop, unsigned long long *r) { unsigned rs1, rs2, rd; top: rs2 = (rop >> 23) & 0x1ff; rs1 = (rop >> 9) & 0x1ff; rd = rop & 0x1ff; *cp = 1; m = r[rs1] + r[rs2]; *cp = 2; foo(); if (!rd) goto top; r[rd] = 1; } int main(void) { static unsigned long long r[64]; unsigned long long cr; cp = &cr; r[4] = 47; r[8] = 11; bar((8 << 23) | (4 << 9) | 15, r); if (m != 47 + 11) abort (); exit (0); }