summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Nemet <anemet@caviumnetworks.com>2009-07-09 05:43:56 +0000
committerAdam Nemet <nemet@gcc.gnu.org>2009-07-09 05:43:56 +0000
commitfcaf7e12508287e62674b64bb2813930dfccb49b (patch)
treeb15ea351d95755f96844045e63fdbd14ec86dbcd
parent3f36bac24bce8dff4633e0238c94487f8d3d82ae (diff)
downloadgcc-fcaf7e12508287e62674b64bb2813930dfccb49b.tar.gz
simplify-rtx.c (simplify_binary_operation_1): Transform (and (truncate)) into (truncate (and)).
* simplify-rtx.c (simplify_binary_operation_1) <AND>: Transform (and (truncate)) into (truncate (and)). testsuite/ * gcc.target/mips/truncate-5.c: New test. From-SVN: r149402
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/simplify-rtx.c12
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.target/mips/truncate-5.c14
4 files changed, 37 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4007a660c21..0347c24ae88 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2009-07-08 Adam Nemet <anemet@caviumnetworks.com>
+ * simplify-rtx.c (simplify_binary_operation_1) <AND>: Transform (and
+ (truncate)) into (truncate (and)).
+
+2009-07-08 Adam Nemet <anemet@caviumnetworks.com>
+
* combine.c (make_extraction): Check TRULY_NOOP_TRUNCATION before
creating LHS paradoxical subregs. Fix surrounding returns to
use NULL_RTX rather than 0.
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index 782d7172091..ff690684ee6 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -2336,6 +2336,18 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
return simplify_gen_unary (ZERO_EXTEND, mode, tem, imode);
}
+ /* Transform (and (truncate X) C) into (truncate (and X C)). This way
+ we might be able to further simplify the AND with X and potentially
+ remove the truncation altogether. */
+ if (GET_CODE (op0) == TRUNCATE && CONST_INT_P (trueop1))
+ {
+ rtx x = XEXP (op0, 0);
+ enum machine_mode xmode = GET_MODE (x);
+ tem = simplify_gen_binary (AND, xmode, x,
+ gen_int_mode (INTVAL (trueop1), xmode));
+ return simplify_gen_unary (TRUNCATE, mode, tem, xmode);
+ }
+
/* Canonicalize (A | C1) & C2 as (A & C2) | (C1 & C2). */
if (GET_CODE (op0) == IOR
&& CONST_INT_P (trueop1)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 72585073651..3dcfad3fe3a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,9 +1,13 @@
+2009-07-08 Adam Nemet <anemet@caviumnetworks.com>
+
+ * gcc.target/mips/truncate-5.c: New test.
+
2009-07-08 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libfortran/40330
PR libfortran/40662
* gfortran.dg/fmt_cache_1.f: New test.
-
+
2009-07-08 Tobias Burnus <burnus@net-b.de>
PR fortran/40675
@@ -24,7 +28,7 @@
* gfortran.dg/proc_ptr_21.f90: New test.
2009-07-08 Manuel López-Ibáñez <manu@gcc.gnu.org>
-
+
PR c++/31246
* g++.dg/warn/pr31246.C: New.
* g++.dg/warn/pr31246-2.C: New.
diff --git a/gcc/testsuite/gcc.target/mips/truncate-5.c b/gcc/testsuite/gcc.target/mips/truncate-5.c
new file mode 100644
index 00000000000..046ef80c453
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/truncate-5.c
@@ -0,0 +1,14 @@
+/* If we AND in DI mode (i.e. replace the order of TRUNCATE and AND) then we
+ can remove the TRUNCATE. */
+/* { dg-options "-O -mgp64" } */
+/* { dg-final { scan-assembler-not "\tsll\t\[^\n\]*,0" } } */
+
+struct s
+{
+ unsigned a:5;
+};
+
+f (struct s *s, unsigned long long a)
+{
+ s->a = a & 0x3;
+}