aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Pinski <quic_apinski@quicinc.com>2024-10-29 09:16:18 -0700
committerAndrew Pinski <quic_apinski@quicinc.com>2024-10-29 15:34:45 -0700
commit3d8cd34a450e9ffe2b2ac8a0c8eb33fd5d613483 (patch)
treef493341b6a881a6927aa1167f9eb75f615d0e5ed
parent3d06e9c3e07e13eab715e19dafbcfc1a0b7e43d6 (diff)
downloadgcc-3d8cd34a450e9ffe2b2ac8a0c8eb33fd5d613483.zip
gcc-3d8cd34a450e9ffe2b2ac8a0c8eb33fd5d613483.tar.gz
gcc-3d8cd34a450e9ffe2b2ac8a0c8eb33fd5d613483.tar.bz2
aarch64: Use canonicalize_comparison in ccmp expansion [PR117346]
While testing the patch for PR 85605 on aarch64, it was noticed that imm_choice_comparison.c test failed. This was because canonicalize_comparison was not being called in the ccmp case. This can be noticed without the patch for PR 85605 as evidence of the new testcase. Bootstrapped and tested on aarch64-linux-gnu. PR target/117346 gcc/ChangeLog: * config/aarch64/aarch64.cc (aarch64_gen_ccmp_first): Call canonicalize_comparison before figuring out the cmp_mode/cc_mode. (aarch64_gen_ccmp_next): Likewise. gcc/testsuite/ChangeLog: * gcc.target/aarch64/imm_choice_comparison-1.c: New test. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
-rw-r--r--gcc/config/aarch64/aarch64.cc6
-rw-r--r--gcc/testsuite/gcc.target/aarch64/imm_choice_comparison-1.c42
2 files changed, 48 insertions, 0 deletions
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index b2dd23c..df170d8 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -27344,6 +27344,9 @@ aarch64_gen_ccmp_first (rtx_insn **prep_seq, rtx_insn **gen_seq,
if (op_mode == VOIDmode)
op_mode = GET_MODE (op1);
+ if (CONST_SCALAR_INT_P (op1))
+ canonicalize_comparison (op_mode, &code, &op1);
+
switch (op_mode)
{
case E_QImode:
@@ -27420,6 +27423,9 @@ aarch64_gen_ccmp_next (rtx_insn **prep_seq, rtx_insn **gen_seq, rtx prev,
if (op_mode == VOIDmode)
op_mode = GET_MODE (op1);
+ if (CONST_SCALAR_INT_P (op1))
+ canonicalize_comparison (op_mode, &cmp_code, &op1);
+
switch (op_mode)
{
case E_QImode:
diff --git a/gcc/testsuite/gcc.target/aarch64/imm_choice_comparison-1.c b/gcc/testsuite/gcc.target/aarch64/imm_choice_comparison-1.c
new file mode 100644
index 0000000..2afebe1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/imm_choice_comparison-1.c
@@ -0,0 +1,42 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+/* PR target/117346 */
+/* Make sure going through ccmp uses similar to non ccmp-case. */
+/* This is similar to imm_choice_comparison.c's check except to force
+ the use of ccmp by reording the comparison and putting the cast before. */
+
+/*
+** check:
+** ...
+** mov w[0-9]+, -16777217
+** ...
+*/
+
+int
+check (int x, int y)
+{
+ unsigned xu = x;
+ if (xu > 0xfefffffe && x > y)
+ return 100;
+
+ return x;
+}
+
+/*
+** check1:
+** ...
+** mov w[0-9]+, -16777217
+** ...
+*/
+
+int
+check1 (int x, int y)
+{
+ unsigned xu = x;
+ if (x > y && xu > 0xfefffffe)
+ return 100;
+
+ return x;
+}