aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorClaudiu Zissulescu <claziss@gmail.com>2023-10-10 10:11:39 +0300
committerClaudiu Zissulescu <claziss@gmail.com>2023-10-10 11:38:55 +0300
commitaaa5a5318adbefe87c1b781b8a3e5fc332e661ec (patch)
tree4e574ad01b1c8f8d008b034b7b5b65f7022a814c /gcc
parent4ecb9b03d9a058925d5a5bc43bdc3a505a587b0c (diff)
downloadgcc-aaa5a5318adbefe87c1b781b8a3e5fc332e661ec.zip
gcc-aaa5a5318adbefe87c1b781b8a3e5fc332e661ec.tar.gz
gcc-aaa5a5318adbefe87c1b781b8a3e5fc332e661ec.tar.bz2
arc: Refurbish add.f combiner patterns
Refurbish add compare patterns: use 'r' constraint, fix identation, and fix pattern to match 'if (a+b) { ... }' constructions. gcc/ * config/arc/arc.cc (arc_select_cc_mode): Match NEG code with the first operand. * config/arc/arc.md (addsi_compare): Make pattern canonical. (addsi_compare_2): Fix identation, constraint letters. (addsi_compare_3): Likewise. gcc/testsuite/ * gcc.target/arc/add_f-combine.c: New test. Signed-off-by: Claudiu Zissulescu <claziss@gmail.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/arc/arc.cc2
-rw-r--r--gcc/config/arc/arc.md25
-rw-r--r--gcc/testsuite/gcc.target/arc/add_f-combine.c15
3 files changed, 28 insertions, 14 deletions
diff --git a/gcc/config/arc/arc.cc b/gcc/config/arc/arc.cc
index ecc681c..00427d8 100644
--- a/gcc/config/arc/arc.cc
+++ b/gcc/config/arc/arc.cc
@@ -1562,7 +1562,7 @@ arc_select_cc_mode (enum rtx_code op, rtx x, rtx y)
/* add.f for if (a+b) */
if (mode == SImode
- && GET_CODE (y) == NEG
+ && GET_CODE (x) == NEG
&& (op == EQ || op == NE))
return CC_ZNmode;
diff --git a/gcc/config/arc/arc.md b/gcc/config/arc/arc.md
index cedb951..a936a8b 100644
--- a/gcc/config/arc/arc.md
+++ b/gcc/config/arc/arc.md
@@ -1102,34 +1102,33 @@ archs4x, archs4xd"
; the combiner needs this pattern
(define_insn "*addsi_compare"
[(set (reg:CC_ZN CC_REG)
- (compare:CC_ZN (match_operand:SI 0 "register_operand" "c")
- (neg:SI (match_operand:SI 1 "register_operand" "c"))))]
+ (compare:CC_ZN (neg:SI
+ (match_operand:SI 0 "register_operand" "r"))
+ (match_operand:SI 1 "register_operand" "r")))]
""
- "add.f 0,%0,%1"
+ "add.f\\t0,%0,%1"
[(set_attr "cond" "set")
(set_attr "type" "compare")
(set_attr "length" "4")])
-; for flag setting 'add' instructions like if (a+b < a) { ...}
-; the combiner needs this pattern
(define_insn "addsi_compare_2"
[(set (reg:CC_C CC_REG)
- (compare:CC_C (plus:SI (match_operand:SI 0 "register_operand" "c,c")
- (match_operand:SI 1 "nonmemory_operand" "cL,Cal"))
- (match_dup 0)))]
+ (compare:CC_C (plus:SI (match_operand:SI 0 "register_operand" "r,r")
+ (match_operand:SI 1 "nonmemory_operand" "rL,Cal"))
+ (match_dup 0)))]
""
- "add.f 0,%0,%1"
+ "add.f\\t0,%0,%1"
[(set_attr "cond" "set")
(set_attr "type" "compare")
(set_attr "length" "4,8")])
(define_insn "*addsi_compare_3"
[(set (reg:CC_C CC_REG)
- (compare:CC_C (plus:SI (match_operand:SI 0 "register_operand" "c")
- (match_operand:SI 1 "register_operand" "c"))
- (match_dup 1)))]
+ (compare:CC_C (plus:SI (match_operand:SI 0 "register_operand" "r")
+ (match_operand:SI 1 "register_operand" "r"))
+ (match_dup 1)))]
""
- "add.f 0,%0,%1"
+ "add.f\\t0,%0,%1"
[(set_attr "cond" "set")
(set_attr "type" "compare")
(set_attr "length" "4")])
diff --git a/gcc/testsuite/gcc.target/arc/add_f-combine.c b/gcc/testsuite/gcc.target/arc/add_f-combine.c
new file mode 100644
index 0000000..cfa3676
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arc/add_f-combine.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O1" } */
+
+/* Check if combiner is matching add.f patterns. */
+
+int a1 (int a, int b)
+{
+ if (a + b)
+ {
+ return 1;
+ }
+ return a + 2;
+}
+
+/* { dg-final { scan-assembler "add.f\\s+0,r\\d+,r\\d+" } } */