// Derived from PR22167, which failed on some RISC targets. The call to // foo() has two successors, one normal and one exceptional, and both // successors use &a[0] and x. Expressions involving &a[0] can be hoisted // before the call but those involving x cannot. // { dg-options "-Os" } // { dg-do run } int a[4]; struct S { S() : x (0) {} ~S() { a[0] = x; } int x; }; void foo (int *x) { if (*x == 1) throw 1; *x = 1; } int main() { S s; foo (&s.x); if (a[0] == s.x) a[0]++; return a[0]; }