aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Pinski <apinski@cavium.com>2012-09-01 18:52:19 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2012-09-01 11:52:19 -0700
commitdcf8468f1cad977c1f82aa008aecc74f5c858161 (patch)
treebe556f5593c16ed2a60e57ca2ab1b9d6e738f2be
parent2caf633d4f8d4281dd428a1cfeac28b92bc9b6f8 (diff)
downloadgcc-dcf8468f1cad977c1f82aa008aecc74f5c858161.zip
gcc-dcf8468f1cad977c1f82aa008aecc74f5c858161.tar.gz
gcc-dcf8468f1cad977c1f82aa008aecc74f5c858161.tar.bz2
simplify-rtx.c (simplify_unary_operation_1 <case TRUNCATE>): A truncate of a memory is just loading the low part of the memory.
2012-09-01 Andrew Pinski <apinski@cavium.com> * simplify-rtx.c (simplify_unary_operation_1 <case TRUNCATE>): A truncate of a memory is just loading the low part of the memory. 2012-09-01 Andrew Pinski <apinski@cavium.com> * gcc.target/mips/truncate-8.c: New testcase. From-SVN: r190848
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/simplify-rtx.c8
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/mips/truncate-8.c18
4 files changed, 35 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 14b923c..45325cb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2012-09-01 Andrew Pinski <apinski@cavium.com>
+
+ * simplify-rtx.c (simplify_unary_operation_1 <case TRUNCATE>):
+ A truncate of a memory is just loading the low part of the memory.
+
2012-09-01 Uros Bizjak <ubizjak@gmail.com>
PR target/46829
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index a878048..f59150e 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -869,6 +869,14 @@ simplify_unary_operation_1 (enum rtx_code code, enum machine_mode mode, rtx op)
&& COMPARISON_P (op)
&& (STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0)
return rtl_hooks.gen_lowpart_no_emit (mode, op);
+
+ /* A truncate of a memory is just loading the low part of the memory
+ if we are not changing the meaning of the address. */
+ if (GET_CODE (op) == MEM
+ && !MEM_VOLATILE_P (op)
+ && !mode_dependent_address_p (XEXP (op, 0)))
+ return rtl_hooks.gen_lowpart_no_emit (mode, op);
+
break;
case FLOAT_TRUNCATE:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c5f88b7..648b014 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2012-09-01 Andrew Pinski <apinski@cavium.com>
+
+ * gcc.target/mips/truncate-8.c: New testcase.
+
2012-09-01 Uros Bizjak <ubizjak@gmail.com>
PR target/46829
diff --git a/gcc/testsuite/gcc.target/mips/truncate-8.c b/gcc/testsuite/gcc.target/mips/truncate-8.c
new file mode 100644
index 0000000..f172b22
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/truncate-8.c
@@ -0,0 +1,18 @@
+/* { dg-options "-mgp64" } */
+/* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */
+/* { dg-final { scan-assembler "\tlw\t" } } */
+/* { dg-final { scan-assembler-not "\tsll\t" } } */
+/* { dg-final { scan-assembler-not "\tld\t" } } */
+
+struct s
+{
+ long long a;
+ int b;
+};
+
+int
+foo (struct s *x)
+{
+ return x->a;
+}
+