aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMichael Meissner <meissner@linux.vnet.ibm.com>2012-06-05 19:40:34 +0000
committerMichael Meissner <meissner@gcc.gnu.org>2012-06-05 19:40:34 +0000
commitd7685183c11486a86721e03c8b3b64fcfd44f0cc (patch)
tree2965431741fdd7023479a8b0d618d9a1b0d848e3 /gcc
parent951c68fac82a2980b1b703c9daad8f0560daabd1 (diff)
downloadgcc-d7685183c11486a86721e03c8b3b64fcfd44f0cc.zip
gcc-d7685183c11486a86721e03c8b3b64fcfd44f0cc.tar.gz
gcc-d7685183c11486a86721e03c8b3b64fcfd44f0cc.tar.bz2
re PR target/53487 (Unrecognizable insn for conditional move)
[gcc] 2012-06-04 Michael Meissner <meissner@linux.vnet.ibm.com> PR target/53487 * config/rs6000/rs6000.c (rs6000_generate_compare): If we are doing an unsigned compare, make sure the second argument is not a negative constant. (rs6000_emit_cmove): Don't allow floating point comparisons when generating ISEL moves. [gcc/testsuite] 2012-06-04 Michael Meissner <meissner@linux.vnet.ibm.com> * gcc.target/powerpc/pr53487.c: New test. From-SVN: r188248
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/rs6000/rs6000.c15
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr53487.c27
4 files changed, 55 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d11f001..7ed2807 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2012-06-05 Michael Meissner <meissner@linux.vnet.ibm.com>
+
+ PR target/53487
+ * config/rs6000/rs6000.c (rs6000_generate_compare): If we are
+ doing an unsigned compare, make sure the second argument is not a
+ negative constant.
+ (rs6000_emit_cmove): Don't allow floating point comparisons when
+ generating ISEL moves.
+
2012-06-05 Edmar Wienskoski <edmar@freescale.com>
* config/rs6000/e5500.md: New file.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index ffb0023..11c4bf7 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -15419,6 +15419,16 @@ rs6000_generate_compare (rtx cmp, enum machine_mode mode)
else
comp_mode = CCmode;
+ /* If we have an unsigned compare, make sure we don't have a signed value as
+ an immediate. */
+ if (comp_mode == CCUNSmode && GET_CODE (op1) == CONST_INT
+ && INTVAL (op1) < 0)
+ {
+ op0 = copy_rtx_if_shared (op0);
+ op1 = force_reg (GET_MODE (op0), op1);
+ cmp = gen_rtx_fmt_ee (code, GET_MODE (cmp), op0, op1);
+ }
+
/* First, the compare. */
compare_result = gen_reg_rtx (comp_mode);
@@ -16172,6 +16182,11 @@ rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
if (GET_MODE (false_cond) != result_mode)
return 0;
+ /* Don't allow using floating point comparisons for integer results for
+ now. */
+ if (FLOAT_MODE_P (compare_mode) && !FLOAT_MODE_P (result_mode))
+ return 0;
+
/* First, work out if the hardware can do this at all, or
if it's too slow.... */
if (!FLOAT_MODE_P (compare_mode))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a43d899..c25aadb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2012-06-05 Michael Meissner <meissner@linux.vnet.ibm.com>
+
+ * gcc.target/powerpc/pr53487.c: New test.
+
2012-06-05 Pat Haugen <pthaugen@us.ibm.com>
* gcc.target/powerpc/lhs-1.c: Use parm instead of stack space.
diff --git a/gcc/testsuite/gcc.target/powerpc/pr53487.c b/gcc/testsuite/gcc.target/powerpc/pr53487.c
new file mode 100644
index 0000000..3e8265b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr53487.c
@@ -0,0 +1,27 @@
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-require-effective-target powerpc_vsx_ok } */
+/* { dg-options "-O3 -mcpu=power7 -misel -ffast-math" } */
+
+struct phylo_s {
+ int left;
+};
+
+int Cluster(float **dmx, int N, struct phylo_s *tree)
+{
+ float **mx;
+ int *coord;
+ int i;
+ int Np;
+ int row, col;
+ float min;
+ for (col = 0; col < N; Np--)
+ {
+ for (row = 0; row < Np; row++)
+ for (col = row+1; col < Np; col++)
+ if (mx[row][col] < min)
+ i = row;
+ tree[Np-2].left = coord[i];
+ }
+ Free2DArray((void **) mx, N);
+}