--- gcc/config/rs6000/mma.md | 42 ++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/gcc/config/rs6000/mma.md b/gcc/config/rs6000/mma.md index 907c9d6d516..f76a87b4a21 100644 --- a/gcc/config/rs6000/mma.md +++ b/gcc/config/rs6000/mma.md @@ -268,10 +268,25 @@ (define_int_attr avvi4i4i4 [(UNSPEC_MMA_PMXVI8GER4PP "pmxvi8ger4pp") (define_expand "movoo" [(set (match_operand:OO 0 "nonimmediate_operand") (match_operand:OO 1 "input_operand"))] - "TARGET_MMA" + "" { - rs6000_emit_move (operands[0], operands[1], OOmode); - DONE; + if (TARGET_MMA) { + rs6000_emit_move (operands[0], operands[1], OOmode); + DONE; + } + /* Opaque modes are only expected to be available when MMA is supported, + but PR103353 shows we may want to continue to expand a MMA built-in + function like a normal function, even if we have already emitted + error messages about some missing required conditions. + As shown in that PR, without one explicit mov optab on OOmode provided, + it would call emit_move_insn recursively. So we allow this pattern to + be generated when we are expanding to RTL and have seen errors, even + though there is no MMA support. It would not cause further ICEs as + the compilation would stop soon after expanding. */ + else if (currently_expanding_to_rtl && seen_error ()) + ; + else + gcc_unreachable (); }) (define_insn_and_split "*movoo" @@ -300,10 +315,25 @@ (define_insn_and_split "*movoo" (define_expand "movxo" [(set (match_operand:XO 0 "nonimmediate_operand") (match_operand:XO 1 "input_operand"))] - "TARGET_MMA" + "" { - rs6000_emit_move (operands[0], operands[1], XOmode); - DONE; + if (TARGET_MMA) { + rs6000_emit_move (operands[0], operands[1], XOmode); + DONE; + } + /* Opaque modes are only expected to be available when MMA is supported, + but PR103353 shows we may want to continue to expand a MMA built-in + function like a normal function, even if we have already emitted + error messages about some missing required conditions. + As shown in that PR, without one explicit mov optab on OOmode provided, + it would call emit_move_insn recursively. So we allow this pattern to + be generated when we are expanding to RTL and have seen errors, even + though there is no MMA support. It would not cause further ICEs as + the compilation would stop soon after expanding. */ + else if (currently_expanding_to_rtl && seen_error ()) + ; + else + gcc_unreachable (); }) (define_insn_and_split "*movxo" -- 2.25.1