Durring compilation process, (subreg (mem ...) ...) can occur. Hence, we need to check if the address of mem is a valid one. This patch is fixing this check by directly calling the address_operand, instead of calling move_double_src_operand, as the latter is always checking against the original mode, thus, returning false when the inner and outer modes are different.
gcc/ 2016-10-07 Claudiu Zissulescu <claz...@synopsys.com> * config/arc/predicates.md (move_double_src_operand): Replace the call to move_double_src_operand with a call to address_operand. --- gcc/config/arc/predicates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcc/config/arc/predicates.md b/gcc/config/arc/predicates.md index 8dd8d55..9e60cb7 100644 --- a/gcc/config/arc/predicates.md +++ b/gcc/config/arc/predicates.md @@ -318,7 +318,7 @@ /* (subreg (mem ...) ...) can occur here if the inner part was once a pseudo-reg and is now a stack slot. */ if (GET_CODE (SUBREG_REG (op)) == MEM) - return move_double_src_operand (SUBREG_REG (op), mode); + return address_operand (XEXP (SUBREG_REG (op), 0), mode); else return register_operand (op, mode); case MEM : -- 1.9.1