diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-07-17 20:22:44 +0000 |
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-07-17 20:22:44 +0000 |
| commit | 0966dd0d69cf66bcba55a4b5d28b1059b5c9b6a6 (patch) | |
| tree | 25ddf531da399645f72b5cd5812d5de582de2671 /llvm/unittests | |
| parent | 914a59cad825f322ef10273327e708fe5eb78283 (diff) | |
| download | bcm5719-llvm-0966dd0d69cf66bcba55a4b5d28b1059b5c9b6a6.tar.gz bcm5719-llvm-0966dd0d69cf66bcba55a4b5d28b1059b5c9b6a6.zip | |
GlobalISel: Handle widenScalar of arbitrary G_MERGE_VALUES sources
Extract the sources to the GCD of the original size and target size,
padding with implicit_def as necessary.
Also fix the case where the requested source type is wider than the
original result type. This was ignoring the type, and just using the
destination. Do the operation in the requested type and truncate back.
llvm-svn: 366367
Diffstat (limited to 'llvm/unittests')
| -rw-r--r-- | llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp | 83 |
1 files changed, 77 insertions, 6 deletions
diff --git a/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp b/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp index 608c0ddf084..2776f75fe1a 100644 --- a/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp @@ -908,8 +908,12 @@ TEST_F(GISelMITest, LowerMergeValues) { if (!TM) return; + const LLT S32 = LLT::scalar(32); const LLT S24 = LLT::scalar(24); + const LLT S21 = LLT::scalar(21); + const LLT S16 = LLT::scalar(16); const LLT S9 = LLT::scalar(9); + const LLT S8 = LLT::scalar(8); const LLT S3 = LLT::scalar(3); DefineLegalizerInfo(A, { @@ -925,13 +929,80 @@ TEST_F(GISelMITest, LowerMergeValues) { // 24 = 3 3 3 3 3 3 3 3 // => 9 // - // This can do 2 merges for the first parts, but has 2 leftover operands. - SmallVector<Register, 7> MergeOps; + // This can do 3 merges, but need an extra implicit_def. + SmallVector<Register, 8> Merge0Ops; for (int I = 0; I != 8; ++I) - MergeOps.push_back(B.buildConstant(S3, I).getReg(0)); + Merge0Ops.push_back(B.buildConstant(S3, I).getReg(0)); - auto Merge = B.buildMerge(S24, MergeOps); - EXPECT_EQ(LegalizerHelper::LegalizeResult::UnableToLegalize, - Helper.lower(*Merge, 1, S9)); + auto Merge0 = B.buildMerge(S24, Merge0Ops); + + // 21 = 3 3 3 3 3 3 3 + // => 9, 2 extra implicit_def needed + // + SmallVector<Register, 8> Merge1Ops; + for (int I = 0; I != 7; ++I) + Merge1Ops.push_back(B.buildConstant(S3, I).getReg(0)); + + auto Merge1 = B.buildMerge(S21, Merge1Ops); + + SmallVector<Register, 8> Merge2Ops; + for (int I = 0; I != 2; ++I) + Merge2Ops.push_back(B.buildConstant(S8, I).getReg(0)); + + auto Merge2 = B.buildMerge(S16, Merge2Ops); + + + EXPECT_EQ(LegalizerHelper::LegalizeResult::Legalized, + Helper.widenScalar(*Merge0, 1, S9)); + EXPECT_EQ(LegalizerHelper::LegalizeResult::Legalized, + Helper.widenScalar(*Merge1, 1, S9)); + + // Request a source size greater than the original destination size. + EXPECT_EQ(LegalizerHelper::LegalizeResult::Legalized, + Helper.widenScalar(*Merge2, 1, S32)); + + auto CheckStr = R"( + CHECK: [[K0:%[0-9]+]]:_(s3) = G_CONSTANT i3 0 + CHECK-NEXT: [[K1:%[0-9]+]]:_(s3) = G_CONSTANT i3 1 + CHECK-NEXT: [[K2:%[0-9]+]]:_(s3) = G_CONSTANT i3 2 + CHECK-NEXT: [[K3:%[0-9]+]]:_(s3) = G_CONSTANT i3 3 + CHECK-NEXT: [[K4:%[0-9]+]]:_(s3) = G_CONSTANT i3 -4 + CHECK-NEXT: [[K5:%[0-9]+]]:_(s3) = G_CONSTANT i3 -3 + CHECK-NEXT: [[K6:%[0-9]+]]:_(s3) = G_CONSTANT i3 -2 + CHECK-NEXT: [[K7:%[0-9]+]]:_(s3) = G_CONSTANT i3 -1 + CHECK-NEXT: [[IMPDEF0:%[0-9]+]]:_(s3) = G_IMPLICIT_DEF + CHECK-NEXT: [[MERGE0:%[0-9]+]]:_(s9) = G_MERGE_VALUES [[K0]]:_(s3), [[K1]]:_(s3), [[K2]]:_(s3) + CHECK-NEXT: [[MERGE1:%[0-9]+]]:_(s9) = G_MERGE_VALUES [[K3]]:_(s3), [[K4]]:_(s3), [[K5]]:_(s3) + CHECK-NEXT: [[MERGE2:%[0-9]+]]:_(s9) = G_MERGE_VALUES [[K6]]:_(s3), [[K7]]:_(s3), [[IMPDEF0]]:_(s3) + CHECK-NEXT: [[MERGE3:%[0-9]+]]:_(s27) = G_MERGE_VALUES [[MERGE0]]:_(s9), [[MERGE1]]:_(s9), [[MERGE2]]:_(s9) + CHECK-NEXT: (s24) = G_TRUNC [[MERGE3]]:_(s27) + + + CHECK: [[K8:%[0-9]+]]:_(s3) = G_CONSTANT i3 0 + CHECK-NEXT: [[K9:%[0-9]+]]:_(s3) = G_CONSTANT i3 1 + CHECK-NEXT: [[K10:%[0-9]+]]:_(s3) = G_CONSTANT i3 2 + CHECK-NEXT: [[K11:%[0-9]+]]:_(s3) = G_CONSTANT i3 3 + CHECK-NEXT: [[K12:%[0-9]+]]:_(s3) = G_CONSTANT i3 -4 + CHECK-NEXT: [[K13:%[0-9]+]]:_(s3) = G_CONSTANT i3 -3 + CHECK-NEXT: [[K14:%[0-9]+]]:_(s3) = G_CONSTANT i3 -2 + CHECK-NEXT: [[IMPDEF1:%[0-9]+]]:_(s3) = G_IMPLICIT_DEF + CHECK-NEXT: [[MERGE4:%[0-9]+]]:_(s9) = G_MERGE_VALUES [[K8]]:_(s3), [[K9]]:_(s3), [[K10]]:_(s3) + CHECK-NEXT: [[MERGE5:%[0-9]+]]:_(s9) = G_MERGE_VALUES [[K11]]:_(s3), [[K12]]:_(s3), [[K13]]:_(s3) + CHECK-NEXT: [[MERGE6:%[0-9]+]]:_(s9) = G_MERGE_VALUES [[K14]]:_(s3), [[IMPDEF1]]:_(s3), [[IMPDEF1]]:_(s3) + CHECK-NEXT: [[MERGE7:%[0-9]+]]:_(s27) = G_MERGE_VALUES [[MERGE4]]:_(s9), [[MERGE5]]:_(s9), [[MERGE6]]:_(s9) + CHECK-NEXT: (s21) = G_TRUNC [[MERGE7]]:_(s27) + + + CHECK: [[K15:%[0-9]+]]:_(s8) = G_CONSTANT i8 0 + CHECK-NEXT: [[K16:%[0-9]+]]:_(s8) = G_CONSTANT i8 1 + CHECK-NEXT: [[ZEXT_K15:[0-9]+]]:_(s32) = G_ZEXT [[K15]]:_(s8) + CHECK-NEXT: [[ZEXT_K16:[0-9]+]]:_(s32) = G_ZEXT [[K16]]:_(s8) + [[K16:%[0-9]+]]:_(s32) = G_CONSTANT i32 8 + [[SHL:%[0-9]+]]:_(s32) = G_SHL [[ZEXT_K16]]:_, [[K16]]:_(s32) + [[OR:%[0-9]+]]:_(s32) = G_OR [[ZEXT_K16]]:_, [[SHL]]:_ + (s16) = G_TRUNC [[OR]]:_(s32) + )"; + + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } } // namespace |

