Skip to content

Commit ec41360

Browse files
Addressed the review comments1
1 parent e4a3b5e commit ec41360

File tree

2 files changed

+16
-52
lines changed

2 files changed

+16
-52
lines changed

llvm/lib/Target/X86/X86ISelDAGToDAG.cpp

Lines changed: 14 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -226,11 +226,8 @@ namespace {
226226
bool selectLEAAddr(SDValue N, SDValue &Base,
227227
SDValue &Scale, SDValue &Index, SDValue &Disp,
228228
SDValue &Segment);
229-
bool selectLEA64_16Addr(SDValue N, SDValue &Base, SDValue &Scale,
230-
SDValue &Index, SDValue &Disp, SDValue &Segment);
231-
bool selectLEA64_32Addr(SDValue N, SDValue &Base,
232-
SDValue &Scale, SDValue &Index, SDValue &Disp,
233-
SDValue &Segment);
229+
bool selectLEA64_Addr(SDValue N, SDValue &Base, SDValue &Scale,
230+
SDValue &Index, SDValue &Disp, SDValue &Segment);
234231
bool selectTLSADDRAddr(SDValue N, SDValue &Base,
235232
SDValue &Scale, SDValue &Index, SDValue &Disp,
236233
SDValue &Segment);
@@ -3056,71 +3053,38 @@ bool X86DAGToDAGISel::selectMOV64Imm32(SDValue N, SDValue &Imm) {
30563053
return !TM.isLargeGlobalValue(GV);
30573054
}
30583055

3059-
bool X86DAGToDAGISel::selectLEA64_16Addr(SDValue N, SDValue &Base,
3060-
SDValue &Scale, SDValue &Index,
3061-
SDValue &Disp, SDValue &Segment) {
3062-
// Save the debug loc before calling selectLEAAddr, in case it invalidates N.
3063-
SDLoc DL(N);
3064-
3065-
if (!selectLEAAddr(N, Base, Scale, Index, Disp, Segment))
3066-
return false;
3067-
3068-
auto *RN = dyn_cast<RegisterSDNode>(Base);
3069-
if (RN && RN->getReg() == 0)
3070-
Base = CurDAG->getRegister(0, MVT::i64);
3071-
else if (Base.getValueType() == MVT::i16 && !isa<FrameIndexSDNode>(Base)) {
3072-
// Base could already be %rip, particularly in the x32 ABI.
3073-
SDValue ImplDef =
3074-
SDValue(CurDAG->getMachineNode(X86::IMPLICIT_DEF, DL, MVT::i64), 0);
3075-
Base = CurDAG->getTargetInsertSubreg(X86::sub_16bit, DL, MVT::i64, ImplDef,
3076-
Base);
3077-
}
3078-
3079-
RN = dyn_cast<RegisterSDNode>(Index);
3080-
if (RN && RN->getReg() == 0)
3081-
Index = CurDAG->getRegister(0, MVT::i64);
3082-
else {
3083-
assert(Index.getValueType() == MVT::i16 &&
3084-
"Expect to be extending 16-bit registers for use in LEA");
3085-
SDValue ImplDef =
3086-
SDValue(CurDAG->getMachineNode(X86::IMPLICIT_DEF, DL, MVT::i64), 0);
3087-
Index = CurDAG->getTargetInsertSubreg(X86::sub_16bit, DL, MVT::i64, ImplDef,
3088-
Index);
3089-
}
3090-
3091-
return true;
3092-
}
3093-
3094-
bool X86DAGToDAGISel::selectLEA64_32Addr(SDValue N, SDValue &Base,
3095-
SDValue &Scale, SDValue &Index,
3096-
SDValue &Disp, SDValue &Segment) {
3056+
bool X86DAGToDAGISel::selectLEA64_Addr(SDValue N, SDValue &Base, SDValue &Scale,
3057+
SDValue &Index, SDValue &Disp,
3058+
SDValue &Segment) {
30973059
// Save the debug loc before calling selectLEAAddr, in case it invalidates N.
30983060
SDLoc DL(N);
30993061

31003062
if (!selectLEAAddr(N, Base, Scale, Index, Disp, Segment))
31013063
return false;
31023064

3065+
EVT BaseType = Base.getValueType();
3066+
unsigned SubReg = (BaseType == MVT::i16) ? X86::sub_16bit : X86::sub_32bit;
31033067
auto *RN = dyn_cast<RegisterSDNode>(Base);
31043068
if (RN && RN->getReg() == 0)
31053069
Base = CurDAG->getRegister(0, MVT::i64);
3106-
else if (Base.getValueType() == MVT::i32 && !isa<FrameIndexSDNode>(Base)) {
3070+
else if ((BaseType == MVT::i16 || BaseType == MVT::i32) &&
3071+
!isa<FrameIndexSDNode>(Base)) {
31073072
// Base could already be %rip, particularly in the x32 ABI.
31083073
SDValue ImplDef = SDValue(CurDAG->getMachineNode(X86::IMPLICIT_DEF, DL,
31093074
MVT::i64), 0);
3110-
Base = CurDAG->getTargetInsertSubreg(X86::sub_32bit, DL, MVT::i64, ImplDef,
3111-
Base);
3075+
Base = CurDAG->getTargetInsertSubreg(SubReg, DL, MVT::i64, ImplDef, Base);
31123076
}
31133077

3078+
EVT IndexType = Index.getValueType();
31143079
RN = dyn_cast<RegisterSDNode>(Index);
31153080
if (RN && RN->getReg() == 0)
31163081
Index = CurDAG->getRegister(0, MVT::i64);
31173082
else {
3118-
assert(Index.getValueType() == MVT::i32 &&
3119-
"Expect to be extending 32-bit registers for use in LEA");
3083+
assert((IndexType == BaseType) &&
3084+
"Expect to be extending 16/32-bit registers for use in LEA");
31203085
SDValue ImplDef = SDValue(CurDAG->getMachineNode(X86::IMPLICIT_DEF, DL,
31213086
MVT::i64), 0);
3122-
Index = CurDAG->getTargetInsertSubreg(X86::sub_32bit, DL, MVT::i64, ImplDef,
3123-
Index);
3087+
Index = CurDAG->getTargetInsertSubreg(SubReg, DL, MVT::i64, ImplDef, Index);
31243088
}
31253089

31263090
return true;

llvm/lib/Target/X86/X86InstrFragments.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,12 +358,12 @@ def lea32addr : ComplexPattern<i32, 5, "selectLEAAddr",
358358
[add, sub, mul, X86mul_imm, shl, or, xor, frameindex],
359359
[]>;
360360
// In 64-bit mode 16-bit LEAs can use RIP-relative addressing.
361-
def lea64_16addr : ComplexPattern<i16, 5, "selectLEA64_16Addr",
361+
def lea64_16addr : ComplexPattern<i16, 5, "selectLEA64_Addr",
362362
[add, sub, mul, X86mul_imm, shl, or, xor,
363363
frameindex, X86WrapperRIP],
364364
[]>;
365365
// In 64-bit mode 32-bit LEAs can use RIP-relative addressing.
366-
def lea64_32addr : ComplexPattern<i32, 5, "selectLEA64_32Addr",
366+
def lea64_32addr : ComplexPattern<i32, 5, "selectLEA64_Addr",
367367
[add, sub, mul, X86mul_imm, shl, or, xor,
368368
frameindex, X86WrapperRIP],
369369
[]>;

0 commit comments

Comments
 (0)