1 /* { dg-do compile } */ 2 /* { dg-options "-O1 -fdump-tree-dom2" } */ 3 4 extern void abort (void); 5 struct rtx_def; 6 typedef struct rtx_def *rtx; 7 8 9 struct rtx_def 10 { 11 12 int code; 13 unsigned int unchanging:1; 14 15 }; 16 rtx current_sym_addr; 17 18 int foo()19foo () 20 { 21 if (current_sym_addr->code == 42 22 && (({ 23 rtx _rtx = current_sym_addr; 24 if (((_rtx)->code) != 42) 25 abort (); 26 _rtx;} 27 )->unchanging)) 28 return 0; 29 } 30 31 /* There should be precisely one load of ->code. If there is 32 more than, then the dominator optimizations failed. */ 33 /* { dg-final { scan-tree-dump-times "->code" 1 "dom2"} } */ 34 35 /* There should be two IF statements. One for 'current_sym_addr->code == 42'. 36 The other one for '(EXPR)->unchanging'. */ 37 /* { dg-final { scan-tree-dump-times "if " 2 "dom2"} } */ 38 39