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
|
@ -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.c (bitmap_head::dump): New.
|
||||||
* bitmap.h (bitmap_head): Add dump().
|
* 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,
|
/* If the right sides are not constant, do the same for it. Also,
|
||||||
disallow this optimization if a size or signedness mismatch occurs
|
disallow this optimization if a size, signedness or storage order
|
||||||
between the left and right sides. */
|
mismatch occurs between the left and right sides. */
|
||||||
if (l_const == 0)
|
if (l_const == 0)
|
||||||
{
|
{
|
||||||
if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
|
if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
|
||||||
|| ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp
|
|| ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp
|
||||||
|
|| ll_reversep != lr_reversep
|
||||||
/* Make sure the two fields on the right
|
/* Make sure the two fields on the right
|
||||||
correspond to the left without being swapped. */
|
correspond to the left without being swapped. */
|
||||||
|| ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos)
|
|| 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>
|
2018-10-17 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
PR c++/84705
|
PR c++/84705
|
||||||
|
|
|
@ -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…
Reference in New Issue