re PR middle-end/87623 (bytes swapped in register when comparing cause fail when compiled with -O1 or higher)
PR middle-end/87623 * fold-const.c (fold_truth_andor_1): If the right side is not constant, bail out if both sides do not have the same storage order. From-SVN: r265242
This commit is contained in:
parent
54994253d3
commit
1906e1a607
4 changed files with 48 additions and 3 deletions
|
@ -1,4 +1,10 @@
|
|||
2018-10-09 Aldy Hernandez <aldyh@redhat.com>
|
||||
2018-10-17 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
PR middle-end/87623
|
||||
* fold-const.c (fold_truth_andor_1): If the right side is not constant,
|
||||
bail out if both sides do not have the same storage order.
|
||||
|
||||
2018-10-17 Aldy Hernandez <aldyh@redhat.com>
|
||||
|
||||
* bitmap.c (bitmap_head::dump): New.
|
||||
* bitmap.h (bitmap_head): Add dump().
|
||||
|
|
|
@ -6009,12 +6009,13 @@ fold_truth_andor_1 (location_t loc, enum tree_code code, tree truth_type,
|
|||
}
|
||||
|
||||
/* If the right sides are not constant, do the same for it. Also,
|
||||
disallow this optimization if a size or signedness mismatch occurs
|
||||
between the left and right sides. */
|
||||
disallow this optimization if a size, signedness or storage order
|
||||
mismatch occurs between the left and right sides. */
|
||||
if (l_const == 0)
|
||||
{
|
||||
if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
|
||||
|| ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp
|
||||
|| ll_reversep != lr_reversep
|
||||
/* Make sure the two fields on the right
|
||||
correspond to the left without being swapped. */
|
||||
|| ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos)
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2018-10-17 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* gcc.c-torture/execute/pr87623.c: New test.
|
||||
|
||||
2018-10-17 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/84705
|
||||
|
|
34
gcc/testsuite/gcc.c-torture/execute/pr87623.c
Normal file
34
gcc/testsuite/gcc.c-torture/execute/pr87623.c
Normal file
|
@ -0,0 +1,34 @@
|
|||
/* PR middle-end/87623 */
|
||||
/* Testcase by George Thopas <george.thopas@gmail.com> */
|
||||
|
||||
struct be {
|
||||
unsigned short pad[1];
|
||||
unsigned char a;
|
||||
unsigned char b;
|
||||
} __attribute__((scalar_storage_order("big-endian")));
|
||||
|
||||
typedef struct be t_be;
|
||||
|
||||
struct le {
|
||||
unsigned short pad[3];
|
||||
unsigned char a;
|
||||
unsigned char b;
|
||||
};
|
||||
|
||||
typedef struct le t_le;
|
||||
|
||||
int a_or_b_different(t_be *x,t_le *y)
|
||||
{
|
||||
return (x->a != y->a) || (x->b != y->b);
|
||||
}
|
||||
|
||||
int main (void)
|
||||
{
|
||||
t_be x = { .a=1, .b=2 };
|
||||
t_le y = { .a=1, .b=2 };
|
||||
|
||||
if (a_or_b_different(&x,&y))
|
||||
__builtin_abort ();
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Reference in a new issue