From d7685183c11486a86721e03c8b3b64fcfd44f0cc Mon Sep 17 00:00:00 2001 From: Michael Meissner Date: Tue, 5 Jun 2012 19:40:34 +0000 Subject: [PATCH] re PR target/53487 (Unrecognizable insn for conditional move) [gcc] 2012-06-04 Michael Meissner 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 * gcc.target/powerpc/pr53487.c: New test. From-SVN: r188248 --- gcc/ChangeLog | 9 ++++++++ gcc/config/rs6000/rs6000.c | 15 ++++++++++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.target/powerpc/pr53487.c | 27 ++++++++++++++++++++++ 4 files changed, 55 insertions(+) create mode 100644 gcc/testsuite/gcc.target/powerpc/pr53487.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d11f0016788..7ed28072a10 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2012-06-05 Michael Meissner + + 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 * config/rs6000/e5500.md: New file. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index ffb00230acd..11c4bf725ee 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 a43d899d975..c25aadbc35e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2012-06-05 Michael Meissner + + * gcc.target/powerpc/pr53487.c: New test. + 2012-06-05 Pat Haugen * 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 00000000000..3e8265b3711 --- /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); +} -- 2.30.2