From 39b2ac744aa646a35dee80b7b4d47d21b7a30d2b Mon Sep 17 00:00:00 2001 From: Jakub Jelinek <jakub@redhat.com> Date: Sat, 14 Mar 2009 09:10:55 +0100 Subject: [PATCH] re PR bootstrap/39454 (Bootstrap failure on sparcv9-linux with profiledbootstrap) PR bootstrap/39454 * cse.c (fold_rtx): Don't modify original const_arg1 when canonicalizing SHIFT_COUNT_TRUNCATED shift count, do it on a separate variable instead. * rtlanal.c (nonzero_bits1) <case ASHIFTRT>: Don't assume anything from out of range shift counts. (num_sign_bit_copies1) <case ASHIFTRT, case ASHIFT>: Similarly. From-SVN: r144857 --- gcc/ChangeLog | 11 ++++++++++- gcc/cse.c | 9 ++++++--- gcc/rtlanal.c | 9 ++++++--- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 000add773b4e..5cd91bd023b3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,15 @@ +2009-03-14 Jakub Jelinek <jakub@redhat.com> + + PR bootstrap/39454 + * cse.c (fold_rtx): Don't modify original const_arg1 when + canonicalizing SHIFT_COUNT_TRUNCATED shift count, do it on a + separate variable instead. + * rtlanal.c (nonzero_bits1) <case ASHIFTRT>: Don't assume anything + from out of range shift counts. + (num_sign_bit_copies1) <case ASHIFTRT, case ASHIFT>: Similarly. + 2008-03-13 Catherine Moore <clm@codesourcery.com> - gcc/ * gcc/config/i386/x-mingw32 (host-mingw32.o): Replace diagnostic.h with $(DIAGNOSTIC_H). diff --git a/gcc/cse.c b/gcc/cse.c index bab0908c9847..04f52fb7d77d 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -3464,6 +3464,7 @@ fold_rtx (rtx x, rtx insn) int is_shift = (code == ASHIFT || code == ASHIFTRT || code == LSHIFTRT); rtx y, inner_const, new_const; + rtx canon_const_arg1 = const_arg1; enum rtx_code associate_code; if (is_shift @@ -3471,8 +3472,9 @@ fold_rtx (rtx x, rtx insn) || INTVAL (const_arg1) < 0)) { if (SHIFT_COUNT_TRUNCATED) - const_arg1 = GEN_INT (INTVAL (const_arg1) - & (GET_MODE_BITSIZE (mode) - 1)); + canon_const_arg1 = GEN_INT (INTVAL (const_arg1) + & (GET_MODE_BITSIZE (mode) + - 1)); else break; } @@ -3531,7 +3533,8 @@ fold_rtx (rtx x, rtx insn) associate_code = (is_shift || code == MINUS ? PLUS : code); new_const = simplify_binary_operation (associate_code, mode, - const_arg1, inner_const); + canon_const_arg1, + inner_const); if (new_const == 0) break; diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 26f69b09300c..b35d774859cd 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -4061,7 +4061,8 @@ nonzero_bits1 (const_rtx x, enum machine_mode mode, const_rtx known_x, low-order bits by left shifts. */ if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) >= 0 - && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT) + && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT + && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (GET_MODE (x))) { enum machine_mode inner_mode = GET_MODE (x); unsigned int width = GET_MODE_BITSIZE (inner_mode); @@ -4542,7 +4543,8 @@ num_sign_bit_copies1 (const_rtx x, enum machine_mode mode, const_rtx known_x, num0 = cached_num_sign_bit_copies (XEXP (x, 0), mode, known_x, known_mode, known_ret); if (GET_CODE (XEXP (x, 1)) == CONST_INT - && INTVAL (XEXP (x, 1)) > 0) + && INTVAL (XEXP (x, 1)) > 0 + && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (GET_MODE (x))) num0 = MIN ((int) bitwidth, num0 + INTVAL (XEXP (x, 1))); return num0; @@ -4551,7 +4553,8 @@ num_sign_bit_copies1 (const_rtx x, enum machine_mode mode, const_rtx known_x, /* Left shifts destroy copies. */ if (GET_CODE (XEXP (x, 1)) != CONST_INT || INTVAL (XEXP (x, 1)) < 0 - || INTVAL (XEXP (x, 1)) >= (int) bitwidth) + || INTVAL (XEXP (x, 1)) >= (int) bitwidth + || INTVAL (XEXP (x, 1)) >= GET_MODE_BITSIZE (GET_MODE (x))) return 1; num0 = cached_num_sign_bit_copies (XEXP (x, 0), mode, -- GitLab