summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>2013-11-14 21:26:09 +0000
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>2013-11-14 21:26:09 +0000
commit0176405ee82807e01f2c9fa4cbf575fc9d450d01 (patch)
treebc793ed311423f9142b07156d8168c16e186d503
parentc5dd641cffd21ec88047c104465bf3e8088cf10f (diff)
downloadgcc-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/ChangeLog21
-rw-r--r--gcc/config/i386/i386.c6
-rw-r--r--gcc/mode-switching.c7
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.target/i386/pr59021.c23
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" } } */