2014-06-03 Andrew Pinski <apinski@cavium.com> 51/41551/1 accepted/tizen_base accepted/tizen_common accepted/tizen_mobile accepted/tizen_tv accepted/tizen_wearable tizen_3.0.m1_mobile tizen_3.0.m1_tv tizen_base accepted/tizen/3.0.2015.q2/common/20150616.134035 accepted/tizen/base/20151223.052227 accepted/tizen/common/20150616.134549 accepted/tizen/mobile/20150618.112712 accepted/tizen/tv/20150618.103554 accepted/tizen/wearable/20150618.093536 submit/tizen/20150616.132010 submit/tizen_3.0.2015.q2_common/20150616.131924 submit/tizen_base/20151223.111111 submit/tizen_base/20151223.111112 submit/tizen_common/20150616.131936 submit/tizen_common/20151015.190624 submit/tizen_common/20151019.135620 submit/tizen_mobile/20150617.000002 submit/tizen_tv/20150617.000002 submit/tizen_wearable/20150617.000002 tizen_3.0.m1_mobile_release tizen_3.0.m1_tv_release tizen_3.0.m2.a1_mobile_release tizen_3.0.m2.a1_tv_release
authorpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Jun 2014 22:44:39 +0000 (22:44 +0000)
committerNikolai Bozhenov <n.bozhenov@samsung.com>
Tue, 16 Jun 2015 12:08:34 +0000 (15:08 +0300)
* config/aarch64/aarch64.c (aarch64_if_then_else_costs): Allow non comparisons
for OP0.

2014-06-03  Andrew Pinski  <apinski@cavium.com>

* 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
gcc/config/aarch64/aarch64.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20140528-1.c [new file with mode: 0644]

index 39f8967..a5d2e58 100644 (file)
@@ -1,5 +1,10 @@
 2014-06-03  Andrew Pinski  <apinski@cavium.com>
 
+       * config/aarch64/aarch64.c (aarch64_if_then_else_costs): Allow non comparisons
+       for OP0.
+
+2014-06-03  Andrew Pinski  <apinski@cavium.com>
+
        * config/aarch64/aarch64.c (aarch64_if_then_else_costs): New function.
        (aarch64_rtx_costs): Use aarch64_if_then_else_costs.
 
index 78259e2..98db00a 100644 (file)
@@ -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.  */
index fc7c562..78dad84 100644 (file)
@@ -1,3 +1,7 @@
+2014-06-03  Andrew Pinski  <apinski@cavium.com>
+
+       * gcc.c-torture/compile/20140528-1.c: New testcase.
+
 2014-06-23  James Greenhalgh  <james.greenhalgh@arm.com>
 
        * 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 (file)
index 0000000..d227802
--- /dev/null
@@ -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);
+}