https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93945
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2020-02-26
CC| |pinskia at gcc dot gnu.org
Ever confirmed|0 |1
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
My bet is there missing the following somewhere:
+ if (BYTES_BIG_ENDIAN)
+ bitpos = TYPE_PRECISION (type) - bitpos - bitsize;
I have not looked where though. I do know BIT_INSERT_EXPR is broken with that
respect.
The following patch fixes that:
commit 7490f8e4f52d38d1ae265bec50ab518e86a53d19
Author: Andrew Pinski <[email protected]>
Date: Tue Dec 17 03:54:46 2019 +0000
Fix big-endian constant folding of BIT_INSERT_EXPR
Big-endian has a different idea of what bit order
should be compared to little-endian. This fixes
it by correcting the shift/mask to be in the correct
order.
Change-Id: I3e4ba3c27d62a20affd08100083cee5f921edc7d
Signed-off-by: Andrew Pinski <[email protected]>
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index aefa91666e2..f515d776c57 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -12506,6 +12506,8 @@ fold_ternary_loc (location_t loc, enum tree_code code,
tree type,
{
unsigned HOST_WIDE_INT bitpos = tree_to_uhwi (op2);
unsigned bitsize = TYPE_PRECISION (TREE_TYPE (arg1));
+ if (BYTES_BIG_ENDIAN)
+ bitpos = TYPE_PRECISION (type) - bitpos - bitsize;
wide_int tem = (wi::to_wide (arg0)
& wi::shifted_mask (bitpos, bitsize, true,
TYPE_PRECISION (type)));