/* { dg-do compile } */ /* { dg-options "-O3 -fdump-ipa-cp-details -fno-inline" } */ int foo(); #define large_code \ do { \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ foo (); \ } while (1) struct A { char f1; short f2 : 5; int f3; }; int callee1 (struct A a) { if ((a.f2 + 7) & 17) foo (); if ((1300 / (short)a.f3) == 19) large_code; return 1; } int callee2 (short *p) { if ((*p ^ 1) < 8) large_code; return 2; } int callee3 (int v) { if ((27 % ((1 - (v & 0xff)) * 3)) < 6) { large_code; return v + 2; } else return v + 1; } int caller () { struct A a; short b; a.f2 = -7; a.f3 = 68; if (callee1 (a)) foo (); a.f2 = 3; a.f3 = 10; if (callee1 (a)) foo (); b = 9; if (callee2 (&b)) foo (); b = 2; if (callee2 (&b)) foo (); return callee3 (-5) + callee3 (0); } /* { dg-final { scan-ipa-dump-times "Creating a specialized node of callee1" 1 "cp" } } */ /* { dg-final { scan-ipa-dump-times "Creating a specialized node of callee2" 1 "cp" } } */ /* { dg-final { scan-ipa-dump-times "Creating a specialized node of callee3" 1 "cp" } } */ /* { dg-final { scan-ipa-dump "op0\\\[offset: 32],\\(\\(short int\\) #\\),\\(\\(int\\) #\\),\\(1300 / #\\) == 19" "cp" } } */ /* { dg-final { scan-ipa-dump "op0\\\[ref offset: 0],\\(# \\^ 1\\) <" "cp" } } */ /* { dg-final { scan-ipa-dump "op0,\\(# & 255\\),\\(1 - #\\),\\(# \\* 3\\),\\(27 % #\\) <" "cp" } } */