aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2016-10-15 18:46:02 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2016-10-15 18:46:02 +0000
commitbaa33d8380e5a74a8709ed5790856c8d07739cc3 (patch)
tree6d8669aea59b7a3885fe9277ffce84a5f64aa031 /gcc
parent523ee218bbdc17a0cd1137e20671d73da990d329 (diff)
downloadgcc-baa33d8380e5a74a8709ed5790856c8d07739cc3.zip
gcc-baa33d8380e5a74a8709ed5790856c8d07739cc3.tar.gz
gcc-baa33d8380e5a74a8709ed5790856c8d07739cc3.tar.bz2
optabs.c (expand_parity): Fix mode mismatch, add final conversion and keep looping on failure.
* optabs.c (expand_parity): Fix mode mismatch, add final conversion and keep looping on failure. From-SVN: r241202
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/optabs.c18
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.target/sparc/popc-1.c (renamed from gcc/testsuite/gcc.target/sparc/popc.c)0
-rw-r--r--gcc/testsuite/gcc.target/sparc/popc-2.c7
5 files changed, 31 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2cf3f94..a574484 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2016-10-15 Eric Botcazou <ebotcazou@adacore.com>
+
+ * optabs.c (expand_parity): Fix mode mismatch, add final conversion
+ and keep looping on failure.
+
2016-10-14 David Malcolm <dmalcolm@redhat.com>
* print-rtl-function.c (print_edge): Omit "(flags)" when none are
diff --git a/gcc/optabs.c b/gcc/optabs.c
index c5e9b4f..f78d998 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -2382,18 +2382,26 @@ expand_parity (machine_mode mode, rtx op0, rtx target)
last = get_last_insn ();
- if (target == 0)
- target = gen_reg_rtx (mode);
+ if (target == 0 || GET_MODE (target) != wider_mode)
+ target = gen_reg_rtx (wider_mode);
+
xop0 = widen_operand (op0, wider_mode, mode, true, false);
temp = expand_unop (wider_mode, popcount_optab, xop0, NULL_RTX,
true);
if (temp != 0)
temp = expand_binop (wider_mode, and_optab, temp, const1_rtx,
target, true, OPTAB_DIRECT);
- if (temp == 0)
- delete_insns_since (last);
- return temp;
+ if (temp)
+ {
+ if (mclass != MODE_INT
+ || !TRULY_NOOP_TRUNCATION_MODES_P (mode, wider_mode))
+ return convert_to_mode (mode, temp, 0);
+ else
+ return gen_lowpart (mode, temp);
+ }
+ else
+ delete_insns_since (last);
}
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 63eafa6..d318333 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2016-10-15 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc.target/sparc/popc.c: Rename to...
+ * gcc.target/sparc/popc-1.c: ...this.
+ * gcc.target/sparc/popc-2.c: New test.
+
2016-10-15 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/77972
diff --git a/gcc/testsuite/gcc.target/sparc/popc.c b/gcc/testsuite/gcc.target/sparc/popc-1.c
index 5442a61..5442a61 100644
--- a/gcc/testsuite/gcc.target/sparc/popc.c
+++ b/gcc/testsuite/gcc.target/sparc/popc-1.c
diff --git a/gcc/testsuite/gcc.target/sparc/popc-2.c b/gcc/testsuite/gcc.target/sparc/popc-2.c
new file mode 100644
index 0000000..8809f18
--- /dev/null
+++ b/gcc/testsuite/gcc.target/sparc/popc-2.c
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-mcpu=niagara2 -Os" } */
+
+int foo (unsigned long long l)
+{
+ return __builtin_parityll (l);
+}