diff options
author | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-14 21:26:09 +0000 |
---|---|---|
committer | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-14 21:26:09 +0000 |
commit | 0176405ee82807e01f2c9fa4cbf575fc9d450d01 (patch) | |
tree | bc793ed311423f9142b07156d8168c16e186d503 | |
parent | c5dd641cffd21ec88047c104465bf3e8088cf10f (diff) | |
download | gcc-0176405ee82807e01f2c9fa4cbf575fc9d450d01.tar.gz |
Backport from mainline
2013-11-10 Uros Bizjak <ubizjak@gmail.com>
* mode-switching.c (optimize_mode_switching): Mark block as
nontransparent, if last_mode at block exit is different from no_mode.
Backport from mainline
2013-11-06 Uros Bizjak <ubizjak@gmail.com>
PR target/59021
* config/i386/i386.c (ix86_avx_u128_mode_needed): Require
AVX_U128_DIRTY mode for call_insn RTXes that use AVX256 registers.
(ix86_avx_u128_mode_needed): Return AVX_U128_DIRTY mode for call_insn
RTXes that return in AVX256 register.
testsuite/ChangeLog:
Backport from mainline
2013-11-11 Uros Bizjak <ubizjak@gmail.com>
PR target/58853
* gcc.target/i386/pr58853.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_8-branch@204823 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 21 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 6 | ||||
-rw-r--r-- | gcc/mode-switching.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr59021.c | 23 |
5 files changed, 58 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5982440197a..e580b142333 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,20 @@ +2013-11-14 Uros Bizjak <ubizjak@gmail.com> + + Backport from mainline + 2013-11-10 Uros Bizjak <ubizjak@gmail.com> + + * mode-switching.c (optimize_mode_switching): Mark block as + nontransparent, if last_mode at block exit is different from no_mode. + + Backport from mainline + 2013-11-06 Uros Bizjak <ubizjak@gmail.com> + + PR target/59021 + * config/i386/i386.c (ix86_avx_u128_mode_needed): Require + AVX_U128_DIRTY mode for call_insn RTXes that use AVX256 registers. + (ix86_avx_u128_mode_needed): Return AVX_U128_DIRTY mode for call_insn + RTXes that return in AVX256 register. + 2013-11-14 Jakub Jelinek <jakub@redhat.com> Uros Bizjak <ubizjak@gmail.com> @@ -18,7 +35,7 @@ 2013-11-11 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> Backported from mainline - 2013-10-30 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> + 2013-10-30 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> PR target/58854 * config/arm/arm.c (arm_expand_epilogue_apcs_frame): Emit blockage @@ -96,7 +113,7 @@ PR middle-end/58789 Backport from mainline - 2013-05-09 Martin Jambor <mjambor@suse.cz> + 2013-05-09 Martin Jambor <mjambor@suse.cz> PR lto/57084 * gimple-fold.c (canonicalize_constructor_val): Call diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 5fef9729cfe..13dd164846a 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -15350,7 +15350,7 @@ ix86_avx_u128_mode_needed (rtx insn) rtx arg = XEXP (XEXP (link, 0), 0); if (ix86_check_avx256_register (&arg, NULL)) - return AVX_U128_ANY; + return AVX_U128_DIRTY; } } @@ -15470,8 +15470,8 @@ ix86_avx_u128_mode_after (int mode, rtx insn) { bool avx_reg256_found = false; note_stores (pat, ix86_check_avx256_stores, &avx_reg256_found); - if (!avx_reg256_found) - return AVX_U128_CLEAN; + + return avx_reg256_found ? AVX_U128_DIRTY : AVX_U128_CLEAN; } /* Otherwise, return current mode. Remember that if insn diff --git a/gcc/mode-switching.c b/gcc/mode-switching.c index 2bcb154d22b..5dd9627c36e 100644 --- a/gcc/mode-switching.c +++ b/gcc/mode-switching.c @@ -568,12 +568,15 @@ optimize_mode_switching (void) info[bb->index].computing = last_mode; /* Check for blocks without ANY mode requirements. - N.B. because of MODE_AFTER, last_mode might still be different - from no_mode. */ + N.B. because of MODE_AFTER, last_mode might still + be different from no_mode, in which case we need to + mark the block as nontransparent. */ if (!any_set_required) { ptr = new_seginfo (no_mode, BB_END (bb), bb->index, live_now); add_seginfo (info + bb->index, ptr); + if (last_mode != no_mode) + bitmap_clear_bit (transp[bb->index], j); } } #if defined (MODE_ENTRY) && defined (MODE_EXIT) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0651a442224..fde430041a4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2013-11-14 Uros Bizjak <ubizjak@gmail.com> + + Backport from mainline + 2013-11-11 Uros Bizjak <ubizjak@gmail.com> + + PR target/58853 + * gcc.target/i386/pr58853.c: New test. + 2013-11-14 Jakub Jelinek <jakub@redhat.com> PR target/59101 diff --git a/gcc/testsuite/gcc.target/i386/pr59021.c b/gcc/testsuite/gcc.target/i386/pr59021.c new file mode 100644 index 00000000000..a1df27b105e --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr59021.c @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mavx -mvzeroupper" } */ + +extern void abort (void); + +struct S { + int i1; + int i2; + int i3; +}; + +typedef double v4df __attribute__ ((vector_size (32))); + +extern int foo (v4df, int i1, int i2, int i3, int i4, int i5, struct S s); + +void bar (v4df v, struct S s) +{ + int r = foo (v, 1, 2, 3, 4, 5, s); + if (r) + abort (); +} + +/* { dg-final { scan-assembler-not "vzeroupper" } } */ |