| /* { dg-do compile } */ |
| /* { dg-options "-fno-tree-sra" } */ |
| typedef struct { |
| unsigned int en : 1; |
| unsigned int bit_order : 1; |
| unsigned int scl_io : 1; |
| unsigned int scl_inv : 1; |
| unsigned int sda0_io : 1; |
| unsigned int sda0_idle : 1; |
| unsigned int sda1_io : 1; |
| unsigned int sda1_idle : 1; |
| unsigned int sda2_io : 1; |
| unsigned int sda2_idle : 1; |
| unsigned int sda3_io : 1; |
| unsigned int sda3_idle : 1; |
| unsigned int sda_sel : 2; |
| unsigned int sen_idle : 1; |
| unsigned int sen_inv : 1; |
| unsigned int sen_sel : 2; |
| unsigned int dummy1 : 14; |
| } reg_gio_rw_i2c1_cfg; |
| |
| typedef struct { |
| unsigned int data0 : 8; |
| unsigned int data1 : 8; |
| unsigned int data2 : 8; |
| unsigned int data3 : 8; |
| } reg_gio_rw_i2c1_data; |
| |
| typedef struct { |
| unsigned int trf_bits : 6; |
| unsigned int switch_dir : 6; |
| unsigned int extra_start : 3; |
| unsigned int early_end : 1; |
| unsigned int start_stop : 1; |
| unsigned int ack_dir0 : 1; |
| unsigned int ack_dir1 : 1; |
| unsigned int ack_dir2 : 1; |
| unsigned int ack_dir3 : 1; |
| unsigned int ack_dir4 : 1; |
| unsigned int ack_dir5 : 1; |
| unsigned int ack_bit : 1; |
| unsigned int start_bit : 1; |
| unsigned int freq : 2; |
| unsigned int dummy1 : 5; |
| } reg_gio_rw_i2c1_ctrl; |
| |
| extern reg_gio_rw_i2c1_cfg reg_gio; |
| extern reg_gio_rw_i2c1_data reg_data; |
| extern int reg_start; |
| extern reg_gio_rw_i2c1_ctrl reg_ctrl; |
| |
| extern void foobar(void); |
| extern void foo(int); |
| extern void frob(unsigned int); |
| extern void bar(int); |
| extern void baz(void); |
| |
| unsigned int f(int *devspec, unsigned int addr) |
| { |
| reg_gio_rw_i2c1_ctrl ctrl = {0}; |
| reg_gio_rw_i2c1_data data = {0}; |
| |
| foobar(); |
| |
| static int first = 1; |
| |
| if (first) { |
| reg_gio_rw_i2c1_cfg cfg = {0}; |
| first = 0; |
| |
| foo(1); |
| cfg.sda0_idle = 1; |
| cfg.sda0_io = 0; |
| cfg.scl_inv = 0; |
| cfg.scl_io = 0; |
| cfg.bit_order = 1; |
| cfg.sda_sel = 0; |
| cfg.sen_sel = 0; |
| cfg.en = 1; |
| reg_gio = cfg; |
| } |
| |
| ctrl.freq = 1; |
| ctrl.start_bit = 0; |
| ctrl.ack_bit = 1; |
| ctrl.ack_dir0 = 0; |
| ctrl.ack_dir1 = 0; |
| ctrl.ack_dir2 = 0; |
| ctrl.ack_dir3 = 1; |
| ctrl.ack_dir4 = 0; |
| ctrl.ack_dir5 = 0; |
| ctrl.start_stop = 1; |
| ctrl.early_end = 0; |
| ctrl.extra_start = 2; |
| ctrl.switch_dir = 8*3; |
| ctrl.trf_bits = 8*4; |
| reg_ctrl = ctrl; |
| frob(0xac); |
| data.data0 = devspec[1] & 192; |
| data.data1 = addr; |
| data.data2 = devspec[1] | 0x01; |
| reg_data = data; |
| reg_start = 1; |
| bar(100); |
| data = reg_data; |
| baz(); |
| |
| return data.data3; |
| } |