[NDS32] Look into LO_SUM's operand to determine whether it is a valid address.
authorChung-Ju Wu <jasonwucj@gmail.com>
Fri, 21 Nov 2014 05:51:12 +0000 (05:51 +0000)
committerChung-Ju Wu <jasonwucj@gcc.gnu.org>
Fri, 21 Nov 2014 05:51:12 +0000 (05:51 +0000)
gcc/
* config/nds32/nds32.c (nds32_legitimate_address_p): For LO_SUM,
we need to look into its operand to determine whether it is a valid
address.

From-SVN: r217904

gcc/ChangeLog
gcc/config/nds32/nds32.c

index 09d1a264ccf3d264c027347c4e424d52bbd398f3..8cfdd62ff884c8fde22e3e407c1f37c026cf943e 100644 (file)
@@ -1,3 +1,9 @@
+2014-11-21  Chung-Ju Wu  <jasonwucj@gmail.com>
+
+       * config/nds32/nds32.c (nds32_legitimate_address_p): For LO_SUM,
+       we need to look into its operand to determine if it is a valid
+       address.
+
 2014-11-21  Chung-Ju Wu  <jasonwucj@gmail.com>
 
        * config/nds32/nds32.c (nds32_emit_stack_push_multiple): Add new
index 74ea4e6563f8d882ed17c00cce1526e7e9953150..5a8e24fc17515cd897da97f14838e3c1f596a7a4 100644 (file)
@@ -2041,8 +2041,14 @@ nds32_legitimate_address_p (machine_mode mode, rtx x, bool strict)
        return false;
 
     case LO_SUM:
-      if (!TARGET_GP_DIRECT)
-       return true;
+      /* (mem (lo_sum (reg) (symbol_ref))) */
+      /* (mem (lo_sum (reg) (const))) */
+      gcc_assert (REG_P (XEXP (x, 0)));
+      if (GET_CODE (XEXP (x, 1)) == SYMBOL_REF
+         || GET_CODE (XEXP (x, 1)) == CONST)
+       return nds32_legitimate_address_p (mode, XEXP (x, 1), strict);
+      else
+       return false;
 
     default:
       return false;