From a7d551541989a53c964d5cc54359069bf4cf919a Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 31 Mar 2017 08:32:46 +0200 Subject: [PATCH] re PR middle-end/80163 (ICE on hopefully valid code) PR middle-end/80163 * varasm.c (initializer_constant_valid_p_1): Disallow sign-extending conversions to integer types wider than word and pointer. * gcc.dg/pr80163.c: New test. From-SVN: r246607 --- gcc/ChangeLog | 4 ++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.dg/pr80163.c | 22 ++++++++++++++++++++++ gcc/varasm.c | 11 +++++++++-- 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr80163.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1dca2cfb196..65aaca77706 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2017-03-31 Jakub Jelinek + PR middle-end/80163 + * varasm.c (initializer_constant_valid_p_1): Disallow sign-extending + conversions to integer types wider than word and pointer. + PR debug/80025 * cselib.h (rtx_equal_for_cselib_1): Add depth argument. (rtx_equal_for_cselib_p): Pass 0 to it. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1b30193e01b..af79d42596f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2017-03-31 Jakub Jelinek + PR middle-end/80163 + * gcc.dg/pr80163.c: New test. + PR debug/80025 * gcc.dg/torture/pr80025.c: New test. diff --git a/gcc/testsuite/gcc.dg/pr80163.c b/gcc/testsuite/gcc.dg/pr80163.c new file mode 100644 index 00000000000..37a7abd1181 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr80163.c @@ -0,0 +1,22 @@ +/* PR middle-end/80163 */ +/* { dg-do compile { target int128 } } */ +/* { dg-options "-O0" } */ + +void bar (void); + +__int128_t * +foo (void) +{ +a: + bar (); +b:; + static __int128_t d = (long) &&a - (long) &&b; /* { dg-error "initializer element is not computable at load time" } */ + return &d; +} + +__int128_t * +baz (void) +{ + static __int128_t d = (long) (3 * 4); + return &d; +} diff --git a/gcc/varasm.c b/gcc/varasm.c index 11a8ac4bc8c..05e48a5b894 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -4472,8 +4472,15 @@ initializer_constant_valid_p_1 (tree value, tree endtype, tree *cache) return initializer_constant_valid_p_1 (src, endtype, cache); /* Allow conversions between other integer types only if - explicit value. */ - if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type)) + explicit value. Don't allow sign-extension to a type larger + than word and pointer, there aren't relocations that would + allow to sign extend it to a wider type. */ + if (INTEGRAL_TYPE_P (dest_type) + && INTEGRAL_TYPE_P (src_type) + && (TYPE_UNSIGNED (src_type) + || TYPE_PRECISION (dest_type) <= TYPE_PRECISION (src_type) + || TYPE_PRECISION (dest_type) <= BITS_PER_WORD + || TYPE_PRECISION (dest_type) <= POINTER_SIZE)) { tree inner = initializer_constant_valid_p_1 (src, endtype, cache); if (inner == null_pointer_node)