summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/simplify-rtx.cc2
-rw-r--r--gcc/testsuite/g++.target/i386/pr114187.C13
2 files changed, 14 insertions, 1 deletions
diff --git a/gcc/simplify-rtx.cc b/gcc/simplify-rtx.cc
index 36dd5227917..dceaa13333c 100644
--- a/gcc/simplify-rtx.cc
+++ b/gcc/simplify-rtx.cc
@@ -7846,7 +7846,7 @@ simplify_context::simplify_subreg (machine_mode outermode, rtx op,
{
rtx tem = simplify_subreg (int_outermode, op, innermode, byte);
if (tem)
- return simplify_gen_subreg (outermode, tem, int_outermode, byte);
+ return lowpart_subreg (outermode, tem, int_outermode);
}
/* If OP is a vector comparison and the subreg is not changing the
diff --git a/gcc/testsuite/g++.target/i386/pr114187.C b/gcc/testsuite/g++.target/i386/pr114187.C
new file mode 100644
index 00000000000..69912a94cef
--- /dev/null
+++ b/gcc/testsuite/g++.target/i386/pr114187.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+struct P2d {
+ double x, y;
+};
+
+double sumxy_p(P2d p) {
+ return p.x + p.y;
+}
+
+/* { dg-final { scan-assembler-not "movq" } } */
+/* { dg-final { scan-assembler-not "xchg" } } */