From 8a37d46b814637479d5035f61999bf455087836e Mon Sep 17 00:00:00 2001 From: pinskia Date: Tue, 3 Jun 2014 22:44:39 +0000 Subject: [PATCH] 2014-06-03 Andrew Pinski * config/aarch64/aarch64.c (aarch64_if_then_else_costs): Allow non comparisons for OP0. 2014-06-03 Andrew Pinski * gcc.c-torture/compile/20140528-1.c: New testcase. Change-Id: Ic7d3edb107f5f1c98ba228addf98b58eda5421c7 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@211206 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 ++++ gcc/config/aarch64/aarch64.c | 34 +++++++++++++++--------- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gcc.c-torture/compile/20140528-1.c | 9 +++++++ 4 files changed, 40 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20140528-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 39f8967..a5d2e58 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2014-06-03 Andrew Pinski + * config/aarch64/aarch64.c (aarch64_if_then_else_costs): Allow non comparisons + for OP0. + +2014-06-03 Andrew Pinski + * config/aarch64/aarch64.c (aarch64_if_then_else_costs): New function. (aarch64_rtx_costs): Use aarch64_if_then_else_costs. diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 78259e2..98db00a 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -4818,19 +4818,32 @@ aarch64_rtx_arith_op_extract_p (rtx x, enum machine_mode mode) static bool aarch64_if_then_else_costs (rtx op0, rtx op1, rtx op2, int *cost, bool speed) { + rtx inner; + rtx comparator; + enum rtx_code cmpcode; + + if (COMPARISON_P (op0)) + { + inner = XEXP (op0, 0); + comparator = XEXP (op0, 1); + cmpcode = GET_CODE (op0); + } + else + { + inner = op0; + comparator = const0_rtx; + cmpcode = NE; + } + if (GET_CODE (op1) == PC || GET_CODE (op2) == PC) { /* Conditional branch. */ - if (GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC) + if (GET_MODE_CLASS (GET_MODE (inner)) == MODE_CC) return true; else { - if (GET_CODE (op0) == NE - || GET_CODE (op0) == EQ) + if (cmpcode == NE || cmpcode == EQ) { - rtx inner = XEXP (op0, 0); - rtx comparator = XEXP (op0, 1); - if (comparator == const0_rtx) { /* TBZ/TBNZ/CBZ/CBNZ. */ @@ -4840,23 +4853,20 @@ aarch64_if_then_else_costs (rtx op0, rtx op1, rtx op2, int *cost, bool speed) 0, speed); else /* CBZ/CBNZ. */ - *cost += rtx_cost (inner, GET_CODE (op0), 0, speed); + *cost += rtx_cost (inner, cmpcode, 0, speed); return true; } } - else if (GET_CODE (op0) == LT - || GET_CODE (op0) == GE) + else if (cmpcode == LT || cmpcode == GE) { - rtx comparator = XEXP (op0, 1); - /* TBZ/TBNZ. */ if (comparator == const0_rtx) return true; } } } - else if (GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC) + else if (GET_MODE_CLASS (GET_MODE (inner)) == MODE_CC) { /* It's a conditional operation based on the status flags, so it must be some flavor of CSEL. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fc7c562..78dad84 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-06-03 Andrew Pinski + + * gcc.c-torture/compile/20140528-1.c: New testcase. + 2014-06-23 James Greenhalgh * gcc.target/aarch64/scalar_shift_1.c: Fix expected assembler. diff --git a/gcc/testsuite/gcc.c-torture/compile/20140528-1.c b/gcc/testsuite/gcc.c-torture/compile/20140528-1.c new file mode 100644 index 0000000..d227802 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20140528-1.c @@ -0,0 +1,9 @@ +unsigned f(unsigned flags, unsigned capabilities) +{ + unsigned gfp_mask; + unsigned gfp_notmask = 0; + gfp_mask = flags & ((1 << 25) - 1); + if (!(capabilities & 0x00000001)) + gfp_mask |= 0x1000000u; + return (gfp_mask & ~gfp_notmask); +} -- 2.7.4