Hi, While working an optimization, the optimization would produce wrong code but I noticed there was no testcase for that case at all.
Committed as obvious. Thanks, Andrew Pinski ChangeLog: * gcc.c-torture/execute/bitfld-8.c: New testcase. * gcc.c-torture/execute/bitfld-9.c: New testcase.
Index: gcc.c-torture/execute/bitfld-8.c =================================================================== --- gcc.c-torture/execute/bitfld-8.c (nonexistent) +++ gcc.c-torture/execute/bitfld-8.c (working copy) @@ -0,0 +1,63 @@ +struct mouse_button_str { + unsigned char left : 1; + unsigned char right : 1; + unsigned char middle : 1; + } button; + +static char fct (struct mouse_button_str newbutton) __attribute__ ((__noipa__)); +static char +fct (struct mouse_button_str newbutton) +{ + char l = newbutton.left; + char r = newbutton.right; + char m = newbutton.middle; + return l || r || m; +} + +int main(void) +{ + struct mouse_button_str newbutton1; + newbutton1.left = 1; + newbutton1.middle = 1; + newbutton1.right = 1; + if (!fct (newbutton1)) + __builtin_abort (); + + newbutton1.left = 0; + newbutton1.middle = 1; + newbutton1.right = 1; + if (!fct (newbutton1)) + __builtin_abort (); + newbutton1.left = 1; + newbutton1.middle = 0; + newbutton1.right = 1; + if (!fct (newbutton1)) + __builtin_abort (); + newbutton1.left = 1; + newbutton1.middle = 1; + newbutton1.right = 0; + if (!fct (newbutton1)) + __builtin_abort (); + + + newbutton1.left = 1; + newbutton1.middle = 0; + newbutton1.right = 0; + if (!fct (newbutton1)) + __builtin_abort (); + newbutton1.left = 0; + newbutton1.middle = 1; + newbutton1.right = 0; + if (!fct (newbutton1)) + __builtin_abort (); + newbutton1.left = 0; + newbutton1.middle = 0; + newbutton1.right = 1; + if (!fct (newbutton1)) + __builtin_abort (); + newbutton1.left = 0; + newbutton1.middle = 0; + newbutton1.right = 0; + if (fct (newbutton1)) + __builtin_abort (); +} \ No newline at end of file Index: gcc.c-torture/execute/bitfld-9.c =================================================================== --- gcc.c-torture/execute/bitfld-9.c (nonexistent) +++ gcc.c-torture/execute/bitfld-9.c (working copy) @@ -0,0 +1,63 @@ +struct mouse_button_str { + unsigned char left : 1; + unsigned char right : 1; + unsigned char middle : 1; + } button; + +static char fct (struct mouse_button_str newbutton) __attribute__ ((__noipa__)); +static char +fct (struct mouse_button_str newbutton) +{ + char l = newbutton.left; + char r = newbutton.right; + char m = newbutton.middle; + return l && r && m; +} + +int main(void) +{ + struct mouse_button_str newbutton1; + newbutton1.left = 1; + newbutton1.middle = 1; + newbutton1.right = 1; + if (!fct (newbutton1)) + __builtin_abort (); + + newbutton1.left = 0; + newbutton1.middle = 1; + newbutton1.right = 1; + if (fct (newbutton1)) + __builtin_abort (); + newbutton1.left = 1; + newbutton1.middle = 0; + newbutton1.right = 1; + if (fct (newbutton1)) + __builtin_abort (); + newbutton1.left = 1; + newbutton1.middle = 1; + newbutton1.right = 0; + if (fct (newbutton1)) + __builtin_abort (); + + + newbutton1.left = 1; + newbutton1.middle = 0; + newbutton1.right = 0; + if (fct (newbutton1)) + __builtin_abort (); + newbutton1.left = 0; + newbutton1.middle = 1; + newbutton1.right = 0; + if (fct (newbutton1)) + __builtin_abort (); + newbutton1.left = 0; + newbutton1.middle = 0; + newbutton1.right = 1; + if (fct (newbutton1)) + __builtin_abort (); + newbutton1.left = 0; + newbutton1.middle = 0; + newbutton1.right = 0; + if (fct (newbutton1)) + __builtin_abort (); +}