Internal compiler error and multilib fixes
Reported upstream:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57295

Fix c6x mulitibs build for uclinux
Reported by:  Dan Tejada <dan.tejada@cantada.com>

---
 gcc/config/c6x/c6x.md        |    2 +-
 gcc/config/c6x/predicates.md |   13 +++++++++++++
 gcc/config/c6x/t-c6x-uclinux |    4 +++-
 3 files changed, 17 insertions(+), 2 deletions(-)

--- a/gcc/config/c6x/c6x.md
+++ b/gcc/config/c6x/c6x.md
@@ -775,7 +775,7 @@
 		       UNSPEC_MISALIGNED_ACCESS))]
   "TARGET_INSNS_64"
 {
-  if (memory_operand (operands[0], <MODE>mode))
+  if (memory_operand (operands[0], <MODE>mode) || volatile_mem_operand (operands[0], <MODE>mode))
     {
       emit_insn (gen_movmisalign<mode>_store (operands[0], operands[1]));
       DONE;
--- a/gcc/config/c6x/predicates.md
+++ b/gcc/config/c6x/predicates.md
@@ -224,3 +224,16 @@
       gcc_unreachable ();
     }
 })
+
+;; Return 1 if the operand is in volatile memory.  Note that during the
+;; RTL generation phase, memory_operand does not return TRUE for volatile
+;; memory references.  So this function allows us to recognize volatile
+;; references where it's safe.
+(define_predicate "volatile_mem_operand"
+  (and (and (match_code "mem")
+            (match_test "MEM_VOLATILE_P (op)"))
+       (if_then_else (match_test "reload_completed")
+         (match_operand 0 "memory_operand")
+         (if_then_else (match_test "reload_in_progress")
+           (match_test "strict_memory_address_p (mode, XEXP (op, 0))")
+           (match_test "memory_address_p (mode, XEXP (op, 0))")))))
--- a/gcc/config/c6x/t-c6x-uclinux
+++ b/gcc/config/c6x/t-c6x-uclinux
@@ -1,3 +1,5 @@
+MULTILIB_OPTIONS = march=c674x mbig-endian
+
 MULTILIB_OSDIRNAMES    = march.c674x=!c674x
 MULTILIB_OSDIRNAMES   += mbig-endian=!be
-MULTILIB_OSDIRNAMES   += mbig-endian/march.c674x=!be/c674x
+MULTILIB_OSDIRNAMES   += march.c674x/mbig-endian=!be/c674x
