This is an archive of the discontinued LLVM Phabricator instance.

[X86] Remove SETB_C8r/SETB_C16r pseudo instructions. Use SETB_C32r and EXTRACT_SUBREG instead.
ClosedPublic

Authored by craig.topper on Feb 5 2020, 12:45 AM.

Details

Summary

Only 32 and 64 bit SBB are dependency breaking instructons on some
CPUs. The 8 and 16 bit forms have to preserve upper bits of the GPR.

This patch removes the smaller forms and selects the wider form
instead. I had to do this with custom code as the tblgen generated
code glued the eflags copytoreg to the extract_subreg instead of
to the SETB pseudo.

Longer term I think we can remove X86ISD::SETCC_CARRY and use
(X86ISD::SBB zero, zero). We'll want to keep the pseudo and select
(X86ISD::SBB zero, zero) to either a MOV32r0+SBB for targets where
there is no dependency break and SETB_C32/SETB_C64 for targets
that have a dependency break. May want some way to avoid the MOV32r0
if the instruction that produced the carry flag happened to def a
register that we can use for the dependency.

I think the flag copy lowering should be using NEG instead of SUB to
handle SETB. That would avoid the MOV32r0 there. Or maybe it should
use a ADC with -1 to recreate the carry flag and keep the SETB?
That would avoid a MOVZX on the input of the SUB.

Diff Detail

Event Timeline

craig.topper created this revision.Feb 5 2020, 12:45 AM
Herald added a project: Restricted Project. · View Herald TranscriptFeb 5 2020, 12:45 AM
Herald added a subscriber: hiraditya. · View Herald Transcript
RKSimon accepted this revision.Feb 6 2020, 9:01 AM

LGTM

This revision is now accepted and ready to land.Feb 6 2020, 9:01 AM
This revision was automatically updated to reflect the committed changes.