diff options
author | Claudiu Zissulescu <claziss@gmail.com> | 2023-10-10 10:11:39 +0300 |
---|---|---|
committer | Claudiu Zissulescu <claziss@gmail.com> | 2023-10-10 11:38:55 +0300 |
commit | aaa5a5318adbefe87c1b781b8a3e5fc332e661ec (patch) | |
tree | 4e574ad01b1c8f8d008b034b7b5b65f7022a814c /gcc | |
parent | 4ecb9b03d9a058925d5a5bc43bdc3a505a587b0c (diff) | |
download | gcc-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.cc | 2 | ||||
-rw-r--r-- | gcc/config/arc/arc.md | 25 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arc/add_f-combine.c | 15 |
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+" } } */ |