Skip to content

Commit def8b7b

Browse files
kumarakwizardengineer
authored andcommitted
[CT] switch to using class for CTSELECT_I386* and fix formatting
1 parent dc9b327 commit def8b7b

File tree

3 files changed

+40
-37
lines changed

3 files changed

+40
-37
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37999,8 +37999,10 @@ X86TargetLowering::emitPatchableEventCall(MachineInstr &MI,
3799937999
/// This approach ensures that when i64 is type-legalized into two i32
3800038000
/// operations, both operations share the same condition byte rather than
3800138001
/// each independently reading (and destroying) EFLAGS.
38002-
static MachineBasicBlock *emitCTSelectI386WithConditionMaterialization(
38003-
MachineInstr &MI, MachineBasicBlock *BB, unsigned InternalPseudoOpcode) {
38002+
static MachineBasicBlock *
38003+
emitCTSelectI386WithConditionMaterialization(MachineInstr &MI,
38004+
MachineBasicBlock *BB,
38005+
unsigned InternalPseudoOpcode) {
3800438006
const TargetInstrInfo *TII = BB->getParent()->getSubtarget().getInstrInfo();
3800538007
const MIMetadata MIMD(MI);
3800638008
MachineFunction *MF = BB->getParent();
@@ -38033,23 +38035,23 @@ static MachineBasicBlock *emitCTSelectI386WithConditionMaterialization(
3803338035
Register TmpMaskReg;
3803438036

3803538037
// Determine the register class for tmp_mask based on the data type
38036-
if (InternalPseudoOpcode == X86::CTSELECT_I386_INT_GR8rr)
38038+
if (InternalPseudoOpcode == X86::CTSELECT_I386_INT_GR8rr) {
3803738039
TmpMaskReg = MRI.createVirtualRegister(&X86::GR8RegClass);
38038-
else if (InternalPseudoOpcode == X86::CTSELECT_I386_INT_GR16rr)
38040+
} else if (InternalPseudoOpcode == X86::CTSELECT_I386_INT_GR16rr) {
3803938041
TmpMaskReg = MRI.createVirtualRegister(&X86::GR16RegClass);
38040-
else if (InternalPseudoOpcode == X86::CTSELECT_I386_INT_GR32rr)
38042+
} else if (InternalPseudoOpcode == X86::CTSELECT_I386_INT_GR32rr) {
3804138043
TmpMaskReg = MRI.createVirtualRegister(&X86::GR32RegClass);
38042-
else {
38044+
} else {
3804338045
llvm_unreachable("Unknown internal pseudo opcode");
3804438046
}
3804538047

3804638048
BuildMI(*BB, MI, MIMD, TII->get(InternalPseudoOpcode))
38047-
.addDef(DstReg) // dst (output)
38048-
.addDef(TmpByteReg) // tmp_byte (output)
38049-
.addDef(TmpMaskReg) // tmp_mask (output)
38050-
.addReg(Src1Reg) // src1 (input)
38051-
.addReg(Src2Reg) // src2 (input)
38052-
.addReg(CondByteReg); // pre-materialized condition byte (input)
38049+
.addDef(DstReg) // dst (output)
38050+
.addDef(TmpByteReg) // tmp_byte (output)
38051+
.addDef(TmpMaskReg) // tmp_mask (output)
38052+
.addReg(Src1Reg) // src1 (input)
38053+
.addReg(Src2Reg) // src2 (input)
38054+
.addReg(CondByteReg); // pre-materialized condition byte (input)
3805338055

3805438056
MI.eraseFromParent();
3805538057
return BB;

llvm/lib/Target/X86/X86InstrCompiler.td

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -702,43 +702,45 @@ def : Pat<(v8f64 (X86cmov VR512:$t, VR512:$f, timm:$cond, EFLAGS)),
702702
let isPseudo = 1, isNotDuplicable = 1 in {
703703
// Phase 1: Initial pseudos that consume EFLAGS (via custom inserter)
704704
// These are matched by patterns and convert EFLAGS to condition byte
705-
multiclass CTSELECT_I386_INITIAL<RegisterClass RC, ValueType VT> {
706-
let Uses = [EFLAGS], Defs = [EFLAGS], usesCustomInserter = 1, hasNoSchedulingInfo = 1 in {
707-
def rr : PseudoI<(outs RC:$dst),
708-
(ins RC:$src1, RC:$src2, i8imm:$cond),
709-
[(set RC:$dst, (VT(X86ctselect RC:$src1, RC:$src2, timm:$cond, EFLAGS)))]>;
710-
}
705+
class CTSELECT_I386_INITIAL<RegisterClass RC, ValueType VT>
706+
: PseudoI<(outs RC:$dst),
707+
(ins RC:$src1, RC:$src2, i8imm:$cond),
708+
[(set RC:$dst, (VT(X86ctselect RC:$src1, RC:$src2, timm:$cond,
709+
EFLAGS)))]> {
710+
let Uses = [EFLAGS];
711+
let Defs = [EFLAGS];
712+
let usesCustomInserter = 1;
713+
let hasNoSchedulingInfo = 1;
711714
}
712715

713716
// Phase 2: Internal pseudos with pre-materialized condition byte (post-RA expansion)
714717
// These generate the actual constant-time instruction bundles
715-
multiclass CTSELECT_I386_INTERNAL<RegisterClass RC, RegisterClass ByteRC> {
716-
let hasNoSchedulingInfo = 1 in {
717-
def rr : PseudoI<(outs RC:$dst, ByteRC:$tmp_byte, RC:$tmp_mask),
718-
(ins RC:$src1, RC:$src2, ByteRC:$cond_byte), []> {
719-
let Constraints =
720-
"@earlyclobber $dst,@earlyclobber $tmp_byte,@earlyclobber "
721-
"$tmp_mask";
722-
}
723-
}
718+
class CTSELECT_I386_INTERNAL<RegisterClass RC, RegisterClass ByteRC>
719+
: PseudoI<(outs RC:$dst, ByteRC:$tmp_byte, RC:$tmp_mask),
720+
(ins RC:$src1, RC:$src2, ByteRC:$cond_byte), []> {
721+
let hasNoSchedulingInfo = 1;
722+
let Constraints = "@earlyclobber $dst,@earlyclobber $tmp_byte,@earlyclobber $tmp_mask";
724723
}
725724
}
726725

727726
// Phase 1 pseudos for non-CMOV targets (custom inserter materializes condition)
728727
let isCodeGenOnly = 1, hasSideEffects = 1, ForceDisassemble = 1 in {
729728
let Predicates = [NoNativeCMOV] in {
730-
defm CTSELECT_I386_GR8 : CTSELECT_I386_INITIAL<GR8, i8>;
731-
defm CTSELECT_I386_GR16 : CTSELECT_I386_INITIAL<GR16, i16>;
732-
defm CTSELECT_I386_GR32 : CTSELECT_I386_INITIAL<GR32, i32>;
729+
def CTSELECT_I386_GR8rr : CTSELECT_I386_INITIAL<GR8, i8>;
730+
def CTSELECT_I386_GR16rr : CTSELECT_I386_INITIAL<GR16, i16>;
731+
def CTSELECT_I386_GR32rr : CTSELECT_I386_INITIAL<GR32, i32>;
733732
}
734733
}
735734

736735
// Phase 2 pseudos (post-RA expansion with pre-materialized condition byte)
737736
let isCodeGenOnly = 1, hasSideEffects = 1, ForceDisassemble = 1 in {
738737
let Predicates = [NoNativeCMOV] in {
739-
defm CTSELECT_I386_INT_GR8 : CTSELECT_I386_INTERNAL<GR8, GR8>;
740-
defm CTSELECT_I386_INT_GR16 : CTSELECT_I386_INTERNAL<GR16, GR8>;
741-
defm CTSELECT_I386_INT_GR32 : CTSELECT_I386_INTERNAL<GR32, GR8>;
738+
def CTSELECT_I386_INT_GR8rr :
739+
CTSELECT_I386_INTERNAL<GR8, GR8>;
740+
def CTSELECT_I386_INT_GR16rr :
741+
CTSELECT_I386_INTERNAL<GR16, GR8>;
742+
def CTSELECT_I386_INT_GR32rr :
743+
CTSELECT_I386_INTERNAL<GR32, GR8>;
742744
}
743745
}
744746

@@ -747,12 +749,12 @@ let hasSideEffects = 1,
747749
Constraints = "$dst = $src1" in {
748750

749751
let Predicates = [FPStackf32] in
750-
defm CTSELECT_I386_FP32 : CTSELECT_I386_INITIAL<RFP32, f32>;
752+
def CTSELECT_I386_FP32rr : CTSELECT_I386_INITIAL<RFP32, f32>;
751753

752754
let Predicates = [FPStackf64] in
753-
defm CTSELECT_I386_FP64 : CTSELECT_I386_INITIAL<RFP64, f64>;
755+
def CTSELECT_I386_FP64rr : CTSELECT_I386_INITIAL<RFP64, f64>;
754756

755-
defm CTSELECT_I386_FP80 : CTSELECT_I386_INITIAL<RFP80, f80>;
757+
def CTSELECT_I386_FP80rr : CTSELECT_I386_INITIAL<RFP80, f80>;
756758
}
757759

758760
// Pattern matching for non-native-CMOV CTSELECT (routes to custom inserter for condition materialization)

llvm/lib/Target/X86/X86InstrInfo.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1022,7 +1022,6 @@ bool X86InstrInfo::expandCtSelectIntWithoutCMOV(MachineInstr &MI) const {
10221022

10231023
// Remove the original pseudo instruction
10241024
MI.eraseFromParent();
1025-
10261025
return true;
10271026
}
10281027

0 commit comments

Comments
 (0)