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 --- 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)) + if (memory_operand (operands[0], mode) || volatile_mem_operand (operands[0], mode)) { emit_insn (gen_movmisalign_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