Skip to content

Commit

Permalink
[X86][GlobalISel] Add instruction selection for G_SELECT (#70753)
Browse files Browse the repository at this point in the history
  • Loading branch information
e-kud committed Dec 12, 2023
1 parent 220e095 commit ef35da8
Show file tree
Hide file tree
Showing 5 changed files with 835 additions and 89 deletions.
48 changes: 48 additions & 0 deletions llvm/lib/Target/X86/GISel/X86InstructionSelector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "X86Subtarget.h"
#include "X86TargetMachine.h"
#include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h"
#include "llvm/CodeGen/GlobalISel/GenericMachineInstrs.h"
#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
#include "llvm/CodeGen/GlobalISel/Utils.h"
#include "llvm/CodeGen/LowLevelType.h"
Expand Down Expand Up @@ -116,6 +117,8 @@ class X86InstructionSelector : public InstructionSelector {
bool selectImplicitDefOrPHI(MachineInstr &I, MachineRegisterInfo &MRI) const;
bool selectMulDivRem(MachineInstr &I, MachineRegisterInfo &MRI,
MachineFunction &MF) const;
bool selectSelect(MachineInstr &I, MachineRegisterInfo &MRI,
MachineFunction &MF) const;
bool selectIntrinsicWSideEffects(MachineInstr &I, MachineRegisterInfo &MRI,
MachineFunction &MF) const;

Expand Down Expand Up @@ -429,6 +432,8 @@ bool X86InstructionSelector::select(MachineInstr &I) {
case TargetOpcode::G_SREM:
case TargetOpcode::G_UREM:
return selectMulDivRem(I, MRI, MF);
case TargetOpcode::G_SELECT:
return selectSelect(I, MRI, MF);
case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
return selectIntrinsicWSideEffects(I, MRI, MF);
}
Expand Down Expand Up @@ -1789,6 +1794,49 @@ bool X86InstructionSelector::selectMulDivRem(MachineInstr &I,
return true;
}

bool X86InstructionSelector::selectSelect(MachineInstr &I,
MachineRegisterInfo &MRI,
MachineFunction &MF) const {
GSelect &Sel = cast<GSelect>(I);
unsigned DstReg = Sel.getReg(0);
BuildMI(*Sel.getParent(), Sel, Sel.getDebugLoc(), TII.get(X86::TEST32rr))
.addReg(Sel.getCondReg())
.addReg(Sel.getCondReg());

unsigned OpCmp;
LLT Ty = MRI.getType(DstReg);
switch (Ty.getSizeInBits()) {
default:
return false;
case 8:
OpCmp = X86::CMOV_GR8;
break;
case 16:
OpCmp = STI.canUseCMOV() ? X86::CMOV16rr : X86::CMOV_GR16;
break;
case 32:
OpCmp = STI.canUseCMOV() ? X86::CMOV32rr : X86::CMOV_GR32;
break;
case 64:
assert(STI.is64Bit() && STI.canUseCMOV());
OpCmp = X86::CMOV64rr;
break;
}
BuildMI(*Sel.getParent(), Sel, Sel.getDebugLoc(), TII.get(OpCmp), DstReg)
.addReg(Sel.getTrueReg())
.addReg(Sel.getFalseReg())
.addImm(X86::COND_E);

const TargetRegisterClass *DstRC = getRegClass(Ty, DstReg, MRI);
if (!RBI.constrainGenericRegister(DstReg, *DstRC, MRI)) {
LLVM_DEBUG(dbgs() << "Failed to constrain CMOV\n");
return false;
}

Sel.eraseFromParent();
return true;
}

bool X86InstructionSelector::selectIntrinsicWSideEffects(
MachineInstr &I, MachineRegisterInfo &MRI, MachineFunction &MF) const {

Expand Down
10 changes: 5 additions & 5 deletions llvm/lib/Target/X86/GISel/X86LegalizerInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
: Subtarget(STI) {

bool Is64Bit = Subtarget.is64Bit();
bool HasCMOV = Subtarget.canUseCMOV();
bool HasSSE1 = Subtarget.hasSSE1();
bool HasSSE2 = Subtarget.hasSSE2();
bool HasSSE41 = Subtarget.hasSSE41();
Expand Down Expand Up @@ -521,11 +522,10 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,

// todo: vectors and address spaces
getActionDefinitionsBuilder(G_SELECT)
.legalFor({{s8, s32}, {s16, s32}, {s32, s32}, {s64, s32},
{p0, s32}})
.widenScalarToNextPow2(0, /*Min=*/8)
.clampScalar(0, s8, sMaxScalar)
.clampScalar(1, s32, s32);
.legalFor({{s8, s32}, {s16, s32}, {s32, s32}, {s64, s32}, {p0, s32}})
.widenScalarToNextPow2(0, /*Min=*/8)
.clampScalar(0, HasCMOV ? s16 : s8, sMaxScalar)
.clampScalar(1, s32, s32);

// memory intrinsics
getActionDefinitionsBuilder({G_MEMCPY, G_MEMMOVE, G_MEMSET}).libcall();
Expand Down
29 changes: 21 additions & 8 deletions llvm/test/CodeGen/X86/GlobalISel/legalize-select.mir
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ body: |
; X86-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[SELECT]](s32), [[SELECT1]](s32)
; X86-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY [[MV]](s64)
; X86-NEXT: RET 0, implicit [[COPY]](s64)
;
; X64-LABEL: name: test_select64
; X64: [[DEF:%[0-9]+]]:_(s64) = IMPLICIT_DEF
; X64-NEXT: [[DEF1:%[0-9]+]]:_(s64) = IMPLICIT_DEF
Expand Down Expand Up @@ -101,14 +102,26 @@ body: |
name: test_select8
body: |
bb.1:
; CHECK-LABEL: name: test_select8
; CHECK: [[DEF:%[0-9]+]]:_(s8) = IMPLICIT_DEF
; CHECK-NEXT: [[DEF1:%[0-9]+]]:_(s8) = IMPLICIT_DEF
; CHECK-NEXT: [[DEF2:%[0-9]+]]:_(s1) = IMPLICIT_DEF
; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[DEF2]](s1)
; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s8) = G_SELECT [[ZEXT]](s32), [[DEF1]], [[DEF]]
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s8) = COPY [[SELECT]](s8)
; CHECK-NEXT: RET 0, implicit [[COPY]](s8)
; X86-LABEL: name: test_select8
; X86: [[DEF:%[0-9]+]]:_(s8) = IMPLICIT_DEF
; X86-NEXT: [[DEF1:%[0-9]+]]:_(s8) = IMPLICIT_DEF
; X86-NEXT: [[DEF2:%[0-9]+]]:_(s1) = IMPLICIT_DEF
; X86-NEXT: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[DEF2]](s1)
; X86-NEXT: [[SELECT:%[0-9]+]]:_(s8) = G_SELECT [[ZEXT]](s32), [[DEF1]], [[DEF]]
; X86-NEXT: [[COPY:%[0-9]+]]:_(s8) = COPY [[SELECT]](s8)
; X86-NEXT: RET 0, implicit [[COPY]](s8)
;
; X64-LABEL: name: test_select8
; X64: [[DEF:%[0-9]+]]:_(s8) = IMPLICIT_DEF
; X64-NEXT: [[DEF1:%[0-9]+]]:_(s8) = IMPLICIT_DEF
; X64-NEXT: [[DEF2:%[0-9]+]]:_(s1) = IMPLICIT_DEF
; X64-NEXT: [[ANYEXT:%[0-9]+]]:_(s16) = G_ANYEXT [[DEF1]](s8)
; X64-NEXT: [[ANYEXT1:%[0-9]+]]:_(s16) = G_ANYEXT [[DEF]](s8)
; X64-NEXT: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[DEF2]](s1)
; X64-NEXT: [[SELECT:%[0-9]+]]:_(s16) = G_SELECT [[ZEXT]](s32), [[ANYEXT]], [[ANYEXT1]]
; X64-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[SELECT]](s16)
; X64-NEXT: [[COPY:%[0-9]+]]:_(s8) = COPY [[TRUNC]](s8)
; X64-NEXT: RET 0, implicit [[COPY]](s8)
%0:_(s8) = IMPLICIT_DEF
%1:_(s8) = IMPLICIT_DEF
%2:_(s1) = IMPLICIT_DEF
Expand Down
76 changes: 0 additions & 76 deletions llvm/test/CodeGen/X86/fast-isel-select-cmov.ll

This file was deleted.

0 comments on commit ef35da8

Please sign in to comment.