summaryrefslogtreecommitdiffstats
path: root/llvm/unittests
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2019-07-17 20:22:44 +0000
committerMatt Arsenault <Matthew.Arsenault@amd.com>2019-07-17 20:22:44 +0000
commit0966dd0d69cf66bcba55a4b5d28b1059b5c9b6a6 (patch)
tree25ddf531da399645f72b5cd5812d5de582de2671 /llvm/unittests
parent914a59cad825f322ef10273327e708fe5eb78283 (diff)
downloadbcm5719-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.cpp83
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
OpenPOWER on IntegriCloud