Greg McGary wrote:
That will do fine for ports that have conditional move, but without
movsicc, you'll have this case:
    cmpsi ...
    bcc 1f
    movsi target, ...
  1:
    cmpsi ...
    bcc 2f
    movsi target, ...
  2:
    <cc-clobbering insns...>

Thanks for the additional details. I had to remind myself what emit_no_conflict_block does.


Looking at emit_no_conflict_block, I see that it already tests for !NONJUMP_INSN_P, and returns without emitting a no conflict block in that case, which looks like the right solution to me. So this case with branches is not a problem.

That just leaves the case with multiple compares and conditional moves.

I think there are possible register allocation problems here, as a REG_NO_CONFLICT block note is really only supposed to be attached to insns that set a word of the output using a word of the input. If we attach them to other instructions, that might confuse the register allocator into failing. Also, REG_NO_CONFLICT is supposed to be attached to every instruction inside a no conflict block, and some passes look for that, so fixing the code to emit REG_NO_CONFLICT on only some of the instructions doesn't seem safe either.

I think this has to be fixed by not emitting the no conflict block, just as we already handle the branching case. So this means adding a check where we also check !NONJUMP_INSN_P to handle this case. You didn't get a sample sequence for this case, so it isn't clear what the exact criteria should be. I suggested earlier checking for a hard reg CCmode dest. Alternatively, maybe checking for a conditional move insn would make sense, i.e. an insn with if_then_else in the source.
--
Jim Wilson, GNU Tools Support, http://www.SpecifixInc.com

Reply via email to