diff options
4 files changed, 62 insertions, 1 deletions
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h index 9823f4ab62f..75b36e8dea0 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h @@ -489,6 +489,11 @@ public:      return buildInstr(TargetOpcode::G_PTRTOINT, {Dst}, {Src});    } +  /// Build and insert a G_INTTOPTR instruction. +  MachineInstrBuilder buildIntToPtr(const DstOp &Dst, const SrcOp &Src) { +    return buildInstr(TargetOpcode::G_INTTOPTR, {Dst}, {Src}); +  } +    /// Build and insert \p Dst = G_BITCAST \p Src    MachineInstrBuilder buildBitcast(const DstOp &Dst, const SrcOp &Src) {      return buildInstr(TargetOpcode::G_BITCAST, {Dst}, {Src}); diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index 73d461f6905..78bc5f49d0a 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -961,7 +961,7 @@ LegalizerHelper::widenScalarMergeValues(MachineInstr &MI, unsigned TypeIdx,        auto ZextInput = MIRBuilder.buildZExt(WideTy, SrcReg); -      Register NextResult = I + 1 == NumOps && WideSize == DstSize ? DstReg : +      Register NextResult = I + 1 == NumOps && WideTy == DstTy ? DstReg :          MRI.createGenericVirtualRegister(WideTy);        auto ShiftAmt = MIRBuilder.buildConstant(WideTy, Offset); @@ -972,6 +972,8 @@ LegalizerHelper::widenScalarMergeValues(MachineInstr &MI, unsigned TypeIdx,      if (WideSize > DstSize)        MIRBuilder.buildTrunc(DstReg, ResultReg); +    else if (DstTy.isPointer()) +      MIRBuilder.buildIntToPtr(DstReg, ResultReg);      MI.eraseFromParent();      return Legalized; diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-merge-values.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-merge-values.mir index 7c5f9e7566c..9afec978f7c 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-merge-values.mir +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-merge-values.mir @@ -785,3 +785,19 @@ body: |      %4:_(s68) = G_MERGE_VALUES %0, %1, %2, %3      S_NOP 0, implicit %4  ... +--- +name: test_merge_p3_s16_s16 +body: | +  bb.0: +    ; CHECK-LABEL: name: test_merge_p3_s16_s16 +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 +    ; CHECK: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[C]](s32) +    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 +    ; CHECK: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[C1]](s32) +    ; CHECK: [[MV:%[0-9]+]]:_(p3) = G_MERGE_VALUES [[TRUNC]](s16), [[TRUNC1]](s16) +    ; CHECK: $vgpr0 = COPY [[MV]](p3) +    %0:_(s16) = G_CONSTANT i16 0 +    %1:_(s16) = G_CONSTANT i16 1 +    %2:_(p3) = G_MERGE_VALUES %0, %1 +    $vgpr0 = COPY %2 +... diff --git a/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp b/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp index d0f025b398b..f3bee640b13 100644 --- a/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp @@ -1004,4 +1004,42 @@ TEST_F(GISelMITest, LowerMergeValues) {    EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF;  } + +TEST_F(GISelMITest, WidenScalarMergeValuesPointer) { +  if (!TM) +    return; + +  DefineLegalizerInfo(A, {}); + +  AInfo Info(MF->getSubtarget()); +  DummyGISelObserver Observer; +  LegalizerHelper Helper(*MF, Info, Observer, B); +  B.setInsertPt(*EntryMBB, EntryMBB->end()); + +  const LLT S32 = LLT::scalar(32); +  const LLT S64 = LLT::scalar(64); +  const LLT P0 = LLT::pointer(0, 64); + +  auto Lo = B.buildTrunc(S32, Copies[0]); +  auto Hi = B.buildTrunc(S32, Copies[1]); + +  auto Merge = B.buildMerge(P0, {Lo.getReg(0), Hi.getReg(0)}); + +  EXPECT_EQ(LegalizerHelper::LegalizeResult::Legalized, +            Helper.widenScalar(*Merge, 1, S64)); + +  auto CheckStr = R"( +   CHECK: [[TRUNC0:%[0-9]+]]:_(s32) = G_TRUNC +   CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC +   CHECK: [[ZEXT_TRUNC0:%[0-9]+]]:_(s64) = G_ZEXT [[TRUNC0]] +   CHECK: [[ZEXT_TRUNC1:%[0-9]+]]:_(s64) = G_ZEXT [[TRUNC1]] +   CHECK: [[SHIFT_AMT:%[0-9]+]]:_(s64) = G_CONSTANT i64 32 +   CHECK: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[ZEXT_TRUNC1]]:_, [[SHIFT_AMT]] +   CHECK: [[OR:%[0-9]+]]:_(s64) = G_OR [[ZEXT_TRUNC0]]:_, [[SHL]] +   CHECK: [[INTTOPTR:%[0-9]+]]:_(p0) = G_INTTOPTR [[OR]]:_(s64) +  )"; + +  EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; +} +  } // namespace  | 

