[committed] arc: Refurbish add.f combiner patterns
Checks
Commit Message
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>
---
gcc/config/arc/arc.cc | 2 +-
gcc/config/arc/arc.md | 25 ++++++++++----------
gcc/testsuite/gcc.target/arc/add_f-combine.c | 15 ++++++++++++
3 files changed, 28 insertions(+), 14 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/arc/add_f-combine.c
@@ -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;
@@ -1102,34 +1102,33 @@ (define_insn "*commutative_binary_cmp0"
; 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")])
new file mode 100644
@@ -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+" } } */