From 3d3f9e7e6980d6d226b3a11e7ff0256158116b04 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 13 Apr 2016 14:26:26 +0200 Subject: [PATCH] re PR debug/70628 (ICE in get_reg_rtx, at emit-rtl.c:1025) PR debug/70628 * rtl.h (convert_memory_address_addr_space_1): New prototype. * explow.c (convert_memory_address_addr_space_1): No longer static, add NO_EMIT argument and don't call convert_modes if true, pass it down recursively, remove break after return. (convert_memory_address_addr_space): Adjust caller. * simplify-rtx.c (simplify_unary_operation_1): Call convert_memory_address_addr_space_1 instead of convert_memory_address, if it returns NULL, don't simplify. * gcc.dg/torture/pr70628.c: New test. From-SVN: r234933 --- gcc/ChangeLog | 12 +++++++ gcc/explow.c | 36 +++++++++++--------- gcc/rtl.h | 2 ++ gcc/simplify-rtx.c | 18 ++++++++-- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/torture/pr70628.c | 46 ++++++++++++++++++++++++++ 6 files changed, 102 insertions(+), 17 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr70628.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e4d0b0ffa4b..1e03812a12a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2016-04-13 Jakub Jelinek + + PR debug/70628 + * rtl.h (convert_memory_address_addr_space_1): New prototype. + * explow.c (convert_memory_address_addr_space_1): No longer static, + add NO_EMIT argument and don't call convert_modes if true, pass + it down recursively, remove break after return. + (convert_memory_address_addr_space): Adjust caller. + * simplify-rtx.c (simplify_unary_operation_1): Call + convert_memory_address_addr_space_1 instead of convert_memory_address, + if it returns NULL, don't simplify. + 2016-04-12 Eric Botcazou PR target/70630 diff --git a/gcc/explow.c b/gcc/explow.c index 249318f44b5..48acd36b405 100644 --- a/gcc/explow.c +++ b/gcc/explow.c @@ -259,12 +259,14 @@ break_out_memory_refs (rtx x) which way). We take advantage of the fact that pointers are not allowed to overflow by commuting arithmetic operations over conversions so that address arithmetic insns can be used. IN_CONST is true if this conversion is inside - a CONST. */ + a CONST. NO_EMIT is true if no insns should be emitted, and instead + it should return NULL if it can't be simplified without emitting insns. */ -static rtx +rtx convert_memory_address_addr_space_1 (machine_mode to_mode ATTRIBUTE_UNUSED, rtx x, addr_space_t as ATTRIBUTE_UNUSED, - bool in_const ATTRIBUTE_UNUSED) + bool in_const ATTRIBUTE_UNUSED, + bool no_emit ATTRIBUTE_UNUSED) { #ifndef POINTERS_EXTEND_UNSIGNED gcc_assert (GET_MODE (x) == to_mode || GET_MODE (x) == VOIDmode); @@ -310,19 +312,16 @@ convert_memory_address_addr_space_1 (machine_mode to_mode ATTRIBUTE_UNUSED, temp = gen_rtx_LABEL_REF (to_mode, LABEL_REF_LABEL (x)); LABEL_REF_NONLOCAL_P (temp) = LABEL_REF_NONLOCAL_P (x); return temp; - break; case SYMBOL_REF: temp = shallow_copy_rtx (x); PUT_MODE (temp, to_mode); return temp; - break; case CONST: - return gen_rtx_CONST (to_mode, - convert_memory_address_addr_space_1 - (to_mode, XEXP (x, 0), as, true)); - break; + temp = convert_memory_address_addr_space_1 (to_mode, XEXP (x, 0), as, + true, no_emit); + return temp ? gen_rtx_CONST (to_mode, temp) : temp; case PLUS: case MULT: @@ -338,18 +337,25 @@ convert_memory_address_addr_space_1 (machine_mode to_mode ATTRIBUTE_UNUSED, && CONST_INT_P (XEXP (x, 1)) && ((in_const && POINTERS_EXTEND_UNSIGNED != 0) || XEXP (x, 1) == convert_memory_address_addr_space_1 - (to_mode, XEXP (x, 1), as, in_const) + (to_mode, XEXP (x, 1), as, in_const, + no_emit) || POINTERS_EXTEND_UNSIGNED < 0))) - return gen_rtx_fmt_ee (GET_CODE (x), to_mode, - convert_memory_address_addr_space_1 - (to_mode, XEXP (x, 0), as, in_const), - XEXP (x, 1)); + { + temp = convert_memory_address_addr_space_1 (to_mode, XEXP (x, 0), + as, in_const, no_emit); + return temp ? gen_rtx_fmt_ee (GET_CODE (x), to_mode, + temp, XEXP (x, 1)) + : temp; + } break; default: break; } + if (no_emit) + return NULL_RTX; + return convert_modes (to_mode, from_mode, x, POINTERS_EXTEND_UNSIGNED); #endif /* defined(POINTERS_EXTEND_UNSIGNED) */ @@ -364,7 +370,7 @@ convert_memory_address_addr_space_1 (machine_mode to_mode ATTRIBUTE_UNUSED, rtx convert_memory_address_addr_space (machine_mode to_mode, rtx x, addr_space_t as) { - return convert_memory_address_addr_space_1 (to_mode, x, as, false); + return convert_memory_address_addr_space_1 (to_mode, x, as, false, false); } diff --git a/gcc/rtl.h b/gcc/rtl.h index 79916ad844a..8267252b196 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -2747,6 +2747,8 @@ extern unsigned int subreg_highpart_offset (machine_mode, machine_mode); extern int byte_lowpart_offset (machine_mode, machine_mode); extern rtx make_safe_from (rtx, rtx); +extern rtx convert_memory_address_addr_space_1 (machine_mode, rtx, + addr_space_t, bool, bool); extern rtx convert_memory_address_addr_space (machine_mode, rtx, addr_space_t); #define convert_memory_address(to_mode,x) \ diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index b1b993663f1..fdc4b366c74 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -1482,7 +1482,14 @@ simplify_unary_operation_1 (enum rtx_code code, machine_mode mode, rtx op) && REG_POINTER (SUBREG_REG (op)) && GET_MODE (SUBREG_REG (op)) == Pmode)) && !targetm.have_ptr_extend ()) - return convert_memory_address (Pmode, op); + { + temp + = convert_memory_address_addr_space_1 (Pmode, op, + ADDR_SPACE_GENERIC, false, + true); + if (temp) + return temp; + } #endif break; @@ -1604,7 +1611,14 @@ simplify_unary_operation_1 (enum rtx_code code, machine_mode mode, rtx op) && REG_POINTER (SUBREG_REG (op)) && GET_MODE (SUBREG_REG (op)) == Pmode)) && !targetm.have_ptr_extend ()) - return convert_memory_address (Pmode, op); + { + temp + = convert_memory_address_addr_space_1 (Pmode, op, + ADDR_SPACE_GENERIC, false, + true); + if (temp) + return temp; + } #endif break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 75c4fa810cc..427803644da 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-04-13 Jakub Jelinek + + PR debug/70628 + * gcc.dg/torture/pr70628.c: New test. + 2016-04-12 Patrick Palka PR c++/70610 diff --git a/gcc/testsuite/gcc.dg/torture/pr70628.c b/gcc/testsuite/gcc.dg/torture/pr70628.c new file mode 100644 index 00000000000..00acae74b4d --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr70628.c @@ -0,0 +1,46 @@ +/* PR debug/70628 */ +/* { dg-do compile } */ +/* { dg-options "-g -w" } */ + +struct S { char s[64]; int *t; } *a; +char b[64]; +int *foo (void); +struct S *bar (int *); +int baz (void); + +void +test (const char *p, long q) +{ + int *c; + c = foo (); + while (a = bar (c)) + { + if (__builtin_strstr (p, "ABCD") + || __builtin_strstr (p, "EFGHI") + || __builtin_strstr (p, "JKL") + || __builtin_strstr (p, "MNOPQR") + || __builtin_strstr (p, "STUV") + || __builtin_strstr (p, "WXYZabcd") + || __builtin_strstr (p, "efghij") + || __builtin_strstr (p, "klmno") + || __builtin_strstr (p, "pqrstuvw") + || __builtin_strstr (b, "MNOPQR") != "EFGHI" + || __builtin_strstr (b, "JKL")) + if (__builtin_strstr (a->s, "xyz12")) + continue; + __builtin_printf ("%p\n", a->t); + } + bar (c); + while (a) + if (__builtin_strstr (p, "ABCD") + || __builtin_strstr (p, "EFGHI") + || __builtin_strstr (p, "JKL") + || __builtin_strstr (p, "MNOPQR") + || __builtin_strstr (p, "STUV") + || __builtin_strstr (p, "WXYZabcd") + || __builtin_strstr (p, "efghij") + || __builtin_strstr (p, "klmno") + || __builtin_strstr (p, "pqrstuvw") + || __builtin_strstr ((const char *) q, "MNOPQR")) + baz (); +} -- 2.30.2