diff options
author | Andrew Pinski <apinski@cavium.com> | 2012-09-01 18:52:19 +0000 |
---|---|---|
committer | Andrew Pinski <pinskia@gcc.gnu.org> | 2012-09-01 11:52:19 -0700 |
commit | dcf8468f1cad977c1f82aa008aecc74f5c858161 (patch) | |
tree | be556f5593c16ed2a60e57ca2ab1b9d6e738f2be /gcc | |
parent | 2caf633d4f8d4281dd428a1cfeac28b92bc9b6f8 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/simplify-rtx.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/mips/truncate-8.c | 18 |
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; +} + |