From ea96581da7ec1afd8bc57a50c929fb7f23bc5941 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Wed, 19 Oct 2016 17:00:06 +0200 Subject: [PATCH] re PR target/77991 (ICE on x32 in plus_constant, at explow.c:87) PR target/77991 * config/i386/i386.c (legitimize_tls_address) : For TARGET_64BIT || TARGET_ANY_GNU_TLS convert dest to Pmode if different than Pmode. testsuite/ChangeLog: PR target/77991 * gcc.target/i386/pr77991.c: New test. From-SVN: r241346 --- gcc/ChangeLog | 7 +++++++ gcc/config/i386/i386.c | 4 +++- gcc/testsuite/ChangeLog | 11 ++++++++--- gcc/testsuite/gcc.target/i386/pr77991.c | 19 +++++++++++++++++++ 4 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr77991.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a99e9ad46ed1..880196d4bd19 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-10-19 Uros Bizjak + + PR target/77991 + * config/i386/i386.c (legitimize_tls_address) + : For TARGET_64BIT || TARGET_ANY_GNU_TLS + convert dest to Pmode if different than Pmode. + 2016-10-18 Kugan Vivekanandarajah Backport from mainline diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index e032b388ac7d..10de2c9fdcdd 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -14286,7 +14286,9 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov) base = get_thread_pointer (tp_mode, for_mov || !TARGET_TLS_DIRECT_SEG_REFS); off = force_reg (tp_mode, off); - return gen_rtx_PLUS (tp_mode, base, off); + dest = gen_rtx_PLUS (tp_mode, base, off); + if (tp_mode != Pmode) + dest = convert_to_mode (Pmode, dest, 1); } else { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c7345038d9eb..020ee03d14d2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-10-19 Uros Bizjak + + PR target/77991 + * gcc.target/i386/pr77991.c: New test. + 2016-10-17 Steven G. Kargl Backport from trunk @@ -81,7 +86,7 @@ subroutine as an actual argument when numeric argument is expected. 2016-09-30 Steven G. Kargl - + Backport from trunk PR fortran/69867 @@ -107,14 +112,14 @@ 2016-09-30 Steven G. Kargl Backport from trunk - + PR fortran/71799 * gfortran.dg/pr71799.f90: New test. 2016-09-30 Steven G. Kargl Backport from trunk - + PR fortran/70006 * gfortran.dg/pr70006.f90: New test. diff --git a/gcc/testsuite/gcc.target/i386/pr77991.c b/gcc/testsuite/gcc.target/i386/pr77991.c new file mode 100644 index 000000000000..6784fbcb9fb4 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr77991.c @@ -0,0 +1,19 @@ +/* { dg-do compile { target { ! ia32 } } } */ +/* { dg-require-effective-target maybe_x32 } */ +/* { dg-options "-O2 -mx32 -maddress-mode=short" } */ + +struct rcu_reader_data +{ + unsigned ctr; + _Bool waiting; +} + +extern __thread rcu_reader; + +void rcu_read_lock() +{ + struct rcu_reader_data *x = &rcu_reader; + _Bool val = 0; + + __atomic_store(&x->waiting, &val, 0); +} -- 2.47.2