From 51bf9f9b59e17a033c2b008b8ef0e6c816e19b5b Mon Sep 17 00:00:00 2001 From: ktkachov Date: Wed, 17 Feb 2016 13:42:35 +0000 Subject: [PATCH] [AArch64] PR target/69161: Don't use special predicate for CCmode comparisons in expressions that require matching modes PR target/69161 * config/aarch64/predicates.md (aarch64_comparison_operator_mode): New predicate. (aarch64_comparison_operator): Break overly long line into two. (aarch64_comparison_operation): Likewise. * config/aarch64/aarch64.md (cstorecc4): Use aarch64_comparison_operator_mode instead of aarch64_comparison_operator. (cstore4): Likewise. (aarch64_cstore): Likewise. (*cstoresi_insn_uxtw): Likewise. (cstore_neg): Likewise. (*cstoresi_neg_uxtw): Likewise. * gcc.c-torture/compile/pr69161.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233496 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 16 ++++++++++++++++ gcc/config/aarch64/aarch64.md | 12 ++++++------ gcc/config/aarch64/predicates.md | 13 +++++++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr69161.c | 19 +++++++++++++++++++ 5 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr69161.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5f4bd782595..6d2a4bd255b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,22 @@ 2016-02-17 Kyrylo Tkachov PR target/69161 + * config/aarch64/predicates.md (aarch64_comparison_operator_mode): + New predicate. + (aarch64_comparison_operator): Break overly long line into two. + (aarch64_comparison_operation): Likewise. + * config/aarch64/aarch64.md (cstorecc4): Use + aarch64_comparison_operator_mode instead of + aarch64_comparison_operator. + (cstore4): Likewise. + (aarch64_cstore): Likewise. + (*cstoresi_insn_uxtw): Likewise. + (cstore_neg): Likewise. + (*cstoresi_neg_uxtw): Likewise. + +2016-02-17 Kyrylo Tkachov + + PR target/69161 * config/arm/predicates.md (arm_comparison_operator_mode): New predicate. * config/arm/arm.md (*mov_scc): Use arm_comparison_operator_mode diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index 77bd191856a..68676c9bd55 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -3039,7 +3039,7 @@ (define_expand "cstorecc4" [(set (match_operand:SI 0 "register_operand") - (match_operator 1 "aarch64_comparison_operator" + (match_operator 1 "aarch64_comparison_operator_mode" [(match_operand 2 "cc_register") (match_operand 3 "const0_operand")]))] "" @@ -3051,7 +3051,7 @@ (define_expand "cstore4" [(set (match_operand:SI 0 "register_operand" "") - (match_operator:SI 1 "aarch64_comparison_operator" + (match_operator:SI 1 "aarch64_comparison_operator_mode" [(match_operand:GPF 2 "register_operand" "") (match_operand:GPF 3 "aarch64_fp_compare_operand" "")]))] "" @@ -3064,7 +3064,7 @@ (define_insn "aarch64_cstore" [(set (match_operand:ALLI 0 "register_operand" "=r") - (match_operator:ALLI 1 "aarch64_comparison_operator" + (match_operator:ALLI 1 "aarch64_comparison_operator_mode" [(match_operand 2 "cc_register" "") (const_int 0)]))] "" "cset\\t%0, %m1" @@ -3109,7 +3109,7 @@ (define_insn "*cstoresi_insn_uxtw" [(set (match_operand:DI 0 "register_operand" "=r") (zero_extend:DI - (match_operator:SI 1 "aarch64_comparison_operator" + (match_operator:SI 1 "aarch64_comparison_operator_mode" [(match_operand 2 "cc_register" "") (const_int 0)])))] "" "cset\\t%w0, %m1" @@ -3118,7 +3118,7 @@ (define_insn "cstore_neg" [(set (match_operand:ALLI 0 "register_operand" "=r") - (neg:ALLI (match_operator:ALLI 1 "aarch64_comparison_operator" + (neg:ALLI (match_operator:ALLI 1 "aarch64_comparison_operator_mode" [(match_operand 2 "cc_register" "") (const_int 0)])))] "" "csetm\\t%0, %m1" @@ -3129,7 +3129,7 @@ (define_insn "*cstoresi_neg_uxtw" [(set (match_operand:DI 0 "register_operand" "=r") (zero_extend:DI - (neg:SI (match_operator:SI 1 "aarch64_comparison_operator" + (neg:SI (match_operator:SI 1 "aarch64_comparison_operator_mode" [(match_operand 2 "cc_register" "") (const_int 0)]))))] "" "csetm\\t%w0, %m1" diff --git a/gcc/config/aarch64/predicates.md b/gcc/config/aarch64/predicates.md index e80e40683ca..11868278c3d 100644 --- a/gcc/config/aarch64/predicates.md +++ b/gcc/config/aarch64/predicates.md @@ -229,10 +229,19 @@ ;; True for integer comparisons and for FP comparisons other than LTGT or UNEQ. (define_special_predicate "aarch64_comparison_operator" - (match_code "eq,ne,le,lt,ge,gt,geu,gtu,leu,ltu,unordered,ordered,unlt,unle,unge,ungt")) + (match_code "eq,ne,le,lt,ge,gt,geu,gtu,leu,ltu,unordered, + ordered,unlt,unle,unge,ungt")) + +;; Same as aarch64_comparison_operator but don't ignore the mode. +;; RTL SET operations require their operands source and destination have +;; the same modes, so we can't ignore the modes there. See PR target/69161. +(define_predicate "aarch64_comparison_operator_mode" + (match_code "eq,ne,le,lt,ge,gt,geu,gtu,leu,ltu,unordered, + ordered,unlt,unle,unge,ungt")) (define_special_predicate "aarch64_comparison_operation" - (match_code "eq,ne,le,lt,ge,gt,geu,gtu,leu,ltu,unordered,ordered,unlt,unle,unge,ungt") + (match_code "eq,ne,le,lt,ge,gt,geu,gtu,leu,ltu,unordered, + ordered,unlt,unle,unge,ungt") { if (XEXP (op, 1) != const0_rtx) return false; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ffe84ee2331..660d4712b69 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-02-17 Kyrylo Tkachov + + PR target/69161 + * gcc.c-torture/compile/pr69161.c: New test. + 2016-02-17 David Sherwood PR target/69532 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr69161.c b/gcc/testsuite/gcc.c-torture/compile/pr69161.c new file mode 100644 index 00000000000..fdbb63f3335 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr69161.c @@ -0,0 +1,19 @@ +/* PR target/69161. */ + +char a; +int b, c, d, e; + +void +foo (void) +{ + int f; + for (f = 0; f <= 4; f++) + { + for (d = 0; d < 20; d++) + { + __INTPTR_TYPE__ g = (__INTPTR_TYPE__) & c; + b &= (0 != g) > e; + } + e &= a; + } +} -- 2.11.4.GIT