aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2019-11-19 16:31:17 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2019-11-19 16:31:17 +0000
commitaa5355781fd8746cb2ac8f0e456f8ac6dc4bf9c5 (patch)
tree8a6f7d7c8f069bf6cce0e53ce6ca951f18c056d7 /gcc
parent4bf29d15f2e01348a45a1f4e1a135962f123fdd6 (diff)
downloadgcc-aa5355781fd8746cb2ac8f0e456f8ac6dc4bf9c5.zip
gcc-aa5355781fd8746cb2ac8f0e456f8ac6dc4bf9c5.tar.gz
gcc-aa5355781fd8746cb2ac8f0e456f8ac6dc4bf9c5.tar.bz2
Revert r278441
To restore powerpc bootstrap. 2019-11-19 Richard Sandiford <richard.sandiford@arm.com> gcc/ Revert: 2019-11-18 Richard Sandiford <richard.sandiford@arm.com> * cse.c (cse_insn): Delete no-op register moves too. * simplify-rtx.c (comparison_to_mask): Handle unsigned comparisons. Take a second comparison to control the value for NE. (mask_to_comparison): Handle unsigned comparisons. (simplify_logical_relational_operation): Likewise. Update call to comparison_to_mask. Handle AND if !HONOR_NANs. (simplify_binary_operation_1): Call the above for AND too. gcc/testsuite/ Revert: 2019-11-18 Richard Sandiford <richard.sandiford@arm.com> * gcc.target/aarch64/sve/acle/asm/ptest_pmore.c: New test. From-SVN: r278455
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cse.c14
-rw-r--r--gcc/simplify-rtx.c56
-rw-r--r--gcc/testsuite/ChangeLog10
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ptest_pmore.c77
4 files changed, 31 insertions, 126 deletions
diff --git a/gcc/cse.c b/gcc/cse.c
index 0ab79b9..ab9b8b4 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -4625,7 +4625,7 @@ cse_insn (rtx_insn *insn)
for (i = 0; i < n_sets; i++)
{
bool repeat = false;
- bool noop_insn = false;
+ bool mem_noop_insn = false;
rtx src, dest;
rtx src_folded;
struct table_elt *elt = 0, *p;
@@ -5324,17 +5324,17 @@ cse_insn (rtx_insn *insn)
}
/* Similarly, lots of targets don't allow no-op
- (set (mem x) (mem x)) moves. Even (set (reg x) (reg x))
- might be impossible for certain registers (like CC registers). */
+ (set (mem x) (mem x)) moves. */
else if (n_sets == 1
- && (MEM_P (trial) || REG_P (trial))
+ && MEM_P (trial)
+ && MEM_P (dest)
&& rtx_equal_p (trial, dest)
&& !side_effects_p (dest)
&& (cfun->can_delete_dead_exceptions
|| insn_nothrow_p (insn)))
{
SET_SRC (sets[i].rtl) = trial;
- noop_insn = true;
+ mem_noop_insn = true;
break;
}
@@ -5562,8 +5562,8 @@ cse_insn (rtx_insn *insn)
sets[i].rtl = 0;
}
- /* Similarly for no-op moves. */
- else if (noop_insn)
+ /* Similarly for no-op MEM moves. */
+ else if (mem_noop_insn)
{
if (cfun->can_throw_non_call_exceptions && can_throw_internal (insn))
cse_cfg_altered = true;
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index f16516e..b2ba922 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -2125,17 +2125,12 @@ simplify_associative_operation (enum rtx_code code, machine_mode mode,
return 0;
}
-/* Return a mask describing the COMPARISON. Treat NE as unsigned
- if OTHER_COMPARISON is. */
+/* Return a mask describing the COMPARISON. */
static int
-comparison_to_mask (rtx_code comparison, rtx_code other_comparison)
+comparison_to_mask (enum rtx_code comparison)
{
switch (comparison)
{
- case LTU:
- return 32;
- case GTU:
- return 16;
case LT:
return 8;
case GT:
@@ -2145,10 +2140,6 @@ comparison_to_mask (rtx_code comparison, rtx_code other_comparison)
case UNORDERED:
return 1;
- case LEU:
- return 34;
- case GEU:
- return 18;
case LTGT:
return 12;
case LE:
@@ -2165,10 +2156,7 @@ comparison_to_mask (rtx_code comparison, rtx_code other_comparison)
case ORDERED:
return 14;
case NE:
- return (other_comparison == LTU
- || other_comparison == LEU
- || other_comparison == GTU
- || other_comparison == GEU ? 48 : 13);
+ return 13;
case UNLE:
return 11;
case UNGE:
@@ -2185,10 +2173,6 @@ mask_to_comparison (int mask)
{
switch (mask)
{
- case 32:
- return LTU;
- case 16:
- return GTU;
case 8:
return LT;
case 4:
@@ -2198,10 +2182,6 @@ mask_to_comparison (int mask)
case 1:
return UNORDERED;
- case 34:
- return LEU;
- case 18:
- return GEU;
case 12:
return LTGT;
case 10:
@@ -2217,7 +2197,6 @@ mask_to_comparison (int mask)
case 14:
return ORDERED;
- case 48:
case 13:
return NE;
case 11:
@@ -2237,9 +2216,8 @@ rtx
simplify_logical_relational_operation (enum rtx_code code, machine_mode mode,
rtx op0, rtx op1)
{
- /* We only handle AND if we can ignore unordered cases. */
- bool honor_nans_p = HONOR_NANS (GET_MODE (op0));
- if (code != IOR && (code != AND || honor_nans_p))
+ /* We only handle IOR of two relational operations. */
+ if (code != IOR)
return 0;
if (!(COMPARISON_P (op0) && COMPARISON_P (op1)))
@@ -2252,20 +2230,18 @@ simplify_logical_relational_operation (enum rtx_code code, machine_mode mode,
enum rtx_code code0 = GET_CODE (op0);
enum rtx_code code1 = GET_CODE (op1);
- int mask0 = comparison_to_mask (code0, code1);
- int mask1 = comparison_to_mask (code1, code0);
-
- /* Reject combinations of signed and unsigned comparisons,
- with ORDERED being signed. */
- if (((mask0 & 13) && (mask1 & 48)) || ((mask1 & 13) && (mask0 & 48)))
- return NULL_RTX;
+ /* We don't handle unsigned comparisons currently. */
+ if (code0 == LTU || code0 == GTU || code0 == LEU || code0 == GEU)
+ return 0;
+ if (code1 == LTU || code1 == GTU || code1 == LEU || code1 == GEU)
+ return 0;
- int mask = (code == IOR ? mask0 | mask1 : mask0 & mask1);
+ int mask0 = comparison_to_mask (code0);
+ int mask1 = comparison_to_mask (code1);
- if (mask == 0)
- return const0_rtx;
+ int mask = mask0 | mask1;
- if (mask == 50 || mask == 15)
+ if (mask == 15)
return const_true_rtx;
code = mask_to_comparison (mask);
@@ -3474,10 +3450,6 @@ simplify_binary_operation_1 (enum rtx_code code, machine_mode mode,
tem = simplify_associative_operation (code, mode, op0, op1);
if (tem)
return tem;
-
- tem = simplify_logical_relational_operation (code, mode, op0, op1);
- if (tem)
- return tem;
break;
case UDIV:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 13ce849..32d6223 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,13 @@
+2019-11-19 Richard Sandiford <richard.sandiford@arm.com>
+gcc/
+ Revert:
+ 2019-11-18 Richard Sandiford <richard.sandiford@arm.com>
+
+ Revert:
+ 2019-11-18 Richard Sandiford <richard.sandiford@arm.com>
+
+ * gcc.target/aarch64/sve/acle/asm/ptest_pmore.c: New test.
+
2019-11-15 Andrew Sutton <asutton@lock3software.com>
PR c++/89913
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ptest_pmore.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ptest_pmore.c
deleted file mode 100644
index bdae9b8..0000000
--- a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ptest_pmore.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/* { dg-additional-options "-msve-vector-bits=scalable" } */
-/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
-
-#include "test_sve_acle.h"
-#include <stdbool.h>
-
-/*
-** test_bool_pmore:
-** ptest p0, p1\.b
-** cset [wx]0, pmore
-** ret
-*/
-TEST_PTEST (test_bool_pmore, bool,
- x0 = svptest_any (p0, p1) & !svptest_last (p0, p1));
-
-/*
-** test_bool_plast:
-** ptest p0, p1\.b
-** cset [wx]0, plast
-** ret
-*/
-TEST_PTEST (test_bool_plast, bool,
- x0 = !svptest_any (p0, p1) | svptest_last (p0, p1));
-
-/*
-** test_int_pmore:
-** ptest p0, p1\.b
-** cset [wx]0, pmore
-** ret
-*/
-TEST_PTEST (test_int_pmore, int,
- x0 = svptest_any (p0, p1) & !svptest_last (p0, p1));
-
-/*
-** test_int_plast:
-** ptest p0, p1\.b
-** cset [wx]0, plast
-** ret
-*/
-TEST_PTEST (test_int_plast, int,
- x0 = !svptest_any (p0, p1) | svptest_last (p0, p1));
-
-/*
-** test_int64_t_pmore:
-** ptest p0, p1\.b
-** cset [wx]0, pmore
-** ret
-*/
-TEST_PTEST (test_int64_t_pmore, int64_t,
- x0 = svptest_any (p0, p1) & !svptest_last (p0, p1));
-
-/*
-** test_int64_t_plast:
-** ptest p0, p1\.b
-** cset [wx]0, plast
-** ret
-*/
-TEST_PTEST (test_int64_t_plast, int64_t,
- x0 = !svptest_any (p0, p1) | svptest_last (p0, p1));
-
-/*
-** sel_pmore:
-** ptest p0, p1\.b
-** csel x0, (x0, x1, pmore|x1, x0, plast)
-** ret
-*/
-TEST_PTEST (sel_pmore, int64_t,
- x0 = svptest_any (p0, p1) & !svptest_last (p0, p1) ? x0 : x1);
-
-/*
-** sel_plast:
-** ptest p0, p1\.b
-** csel x0, (x0, x1, plast|x1, x0, pmore)
-** ret
-*/
-TEST_PTEST (sel_plast, int64_t,
- x0 = !svptest_any (p0, p1) | svptest_last (p0, p1) ? x0 : x1);