[NDS32] Consider -mcmodel=X in nds32_legitimate_address_p implementation.
authorChung-Ju Wu <jasonwucj@gmail.com>
Tue, 13 Jan 2015 06:06:34 +0000 (06:06 +0000)
committerChung-Ju Wu <jasonwucj@gcc.gnu.org>
Tue, 13 Jan 2015 06:06:34 +0000 (06:06 +0000)
gcc/
* config/nds32/nds32.c (nds32_legitimate_address_p): Consider
TARGET_CMODEL_LARGE and TARGET_CMODEL_MEDIUM cases.

From-SVN: r219515

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

index 6166c08c43d2f7079d8fe53b6649824a806bbb6e..d358973a59eb594df4c7c6aa2f87fd007f014d79 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-13  Chung-Ju Wu  <jasonwucj@gmail.com>
+
+       * config/nds32/nds32.c (nds32_legitimate_address_p): Consider
+       TARGET_CMODEL_LARGE and TARGET_CMODEL_MEDIUM cases.
+
 2015-01-13  Chung-Ju Wu  <jasonwucj@gmail.com>
 
        * config/nds32/nds32.h (NDS32_SYMBOL_FLAG_RODATA): Define our own
index 5128bfadb1a3203951a868cae4c9040431aa1867..192816f9f29592093c3993ff878b41d6ff4eea39 100644 (file)
@@ -1961,24 +1961,27 @@ nds32_legitimate_address_p (machine_mode mode, rtx x, bool strict)
       return nds32_address_register_rtx_p (x, strict);
 
     case SYMBOL_REF:
-
-      if (!TARGET_GP_DIRECT
+      /* (mem (symbol_ref A)) => [symbol_ref] */
+      /* If -mcmodel=large, the 'symbol_ref' is not a valid address
+         during or after LRA/reload phase.  */
+      if (TARGET_CMODEL_LARGE
          && (reload_completed
              || reload_in_progress
              || lra_in_progress))
        return false;
-
-      /* (mem (symbol_ref A)) => [symbol_ref] */
-      return !currently_expanding_to_rtl;
-
-    case CONST:
-
-      if (!TARGET_GP_DIRECT
+      /* If -mcmodel=medium and the symbol references to rodata section,
+         the 'symbol_ref' is not a valid address during or after
+         LRA/reload phase.  */
+      if (TARGET_CMODEL_MEDIUM
+         && NDS32_SYMBOL_REF_RODATA_P (x)
          && (reload_completed
              || reload_in_progress
              || lra_in_progress))
        return false;
 
+      return true;
+
+    case CONST:
       /* (mem (const (...)))
          => [ + const_addr ], where const_addr = symbol_ref + const_int */
       if (GET_CODE (XEXP (x, 0)) == PLUS)
@@ -1989,9 +1992,30 @@ nds32_legitimate_address_p (machine_mode mode, rtx x, bool strict)
          rtx op1 = XEXP (plus_op, 1);
 
          if (GET_CODE (op0) == SYMBOL_REF && CONST_INT_P (op1))
-           return true;
-         else
-           return false;
+           {
+             /* Now we see the [ + const_addr ] pattern, but we need
+                some further checking.  */
+             /* If -mcmodel=large, the 'const_addr' is not a valid address
+                during or after LRA/reload phase.  */
+             if (TARGET_CMODEL_LARGE
+                 && (reload_completed
+                     || reload_in_progress
+                     || lra_in_progress))
+               return false;
+             /* If -mcmodel=medium and the symbol references to rodata section,
+                the 'const_addr' is not a valid address during or after
+                LRA/reload phase.  */
+             if (TARGET_CMODEL_MEDIUM
+                 && NDS32_SYMBOL_REF_RODATA_P (op0)
+                 && (reload_completed
+                     || reload_in_progress
+                     || lra_in_progress))
+               return false;
+
+             /* At this point we can make sure 'const_addr' is a
+                valid address.  */
+             return true;
+           }
        }
 
        return false;