aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/avoid-store-forwarding.cc6
-rw-r--r--gcc/testsuite/gcc.target/i386/pr117835.c20
2 files changed, 21 insertions, 5 deletions
diff --git a/gcc/avoid-store-forwarding.cc b/gcc/avoid-store-forwarding.cc
index 1b8c35b..fa83e10 100644
--- a/gcc/avoid-store-forwarding.cc
+++ b/gcc/avoid-store-forwarding.cc
@@ -238,11 +238,7 @@ process_store_forwarding (vec<store_fwd_info> &stores, rtx_insn *load_insn,
{
start_sequence ();
- /* We can use a paradoxical subreg to force this to a wider mode, as
- the only use will be inserting the bits (i.e., we don't care about
- the value of the higher bits). */
- rtx ext0 = lowpart_subreg (GET_MODE (dest), it->mov_reg,
- GET_MODE (it->mov_reg));
+ rtx ext0 = gen_rtx_ZERO_EXTEND (GET_MODE (dest), it->mov_reg);
if (ext0)
{
rtx_insn *move0 = emit_move_insn (dest, ext0);
diff --git a/gcc/testsuite/gcc.target/i386/pr117835.c b/gcc/testsuite/gcc.target/i386/pr117835.c
new file mode 100644
index 0000000..eac71aa
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr117835.c
@@ -0,0 +1,20 @@
+/* { dg-do run } */
+/* { dg-options "-O -favoid-store-forwarding -mno-push-args --param=store-forwarding-max-distance=0 -Wno-psabi" } */
+
+typedef __attribute__((__vector_size__ (64))) unsigned short V;
+
+__attribute__((__noipa__)) V
+foo (V v, V)
+{
+ return v;
+}
+
+int main ()
+{
+ V a = (V){3, 5, 0, 8, 9, 3, 5, 1, 3, 4, 2, 5, 5, 0, 5, 3, 61886};
+ V b = (V){6, 80, 15, 2, 2, 1, 1, 3, 5};
+ V x = foo (a, b);
+ for (unsigned i = 0; i < sizeof(x)/sizeof(x[0]); i++)
+ if (x[i] != a[i])
+ __builtin_abort();
+} \ No newline at end of file