summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp')
-rw-r--r--llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp b/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp
index 72a85db9461..f39c28dc648 100644
--- a/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp
@@ -314,3 +314,42 @@ TEST_F(GISelMITest, BuildAtomicRMW) {
EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF;
}
+
+TEST_F(GISelMITest, BuildMerge) {
+ setUp();
+ if (!TM)
+ return;
+
+ LLT S32 = LLT::scalar(32);
+ Register RegC0 = B.buildConstant(S32, 0)->getOperand(0).getReg();
+ Register RegC1 = B.buildConstant(S32, 1)->getOperand(0).getReg();
+ Register RegC2 = B.buildConstant(S32, 2)->getOperand(0).getReg();
+ Register RegC3 = B.buildConstant(S32, 3)->getOperand(0).getReg();
+
+ // Merging plain constants as one big blob of bit should produce a
+ // G_MERGE_VALUES.
+ B.buildMerge(LLT::scalar(128), {RegC0, RegC1, RegC2, RegC3});
+ // Merging plain constants to a vector should produce a G_BUILD_VECTOR.
+ LLT V2x32 = LLT::vector(2, 32);
+ Register RegC0C1 =
+ B.buildMerge(V2x32, {RegC0, RegC1})->getOperand(0).getReg();
+ Register RegC2C3 =
+ B.buildMerge(V2x32, {RegC2, RegC3})->getOperand(0).getReg();
+ // Merging vector constants to a vector should produce a G_CONCAT_VECTORS.
+ B.buildMerge(LLT::vector(4, 32), {RegC0C1, RegC2C3});
+ // Merging vector constants to a plain type is not allowed.
+ // Nothing else to test.
+
+ auto CheckStr = R"(
+ ; CHECK: [[C0:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
+ ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
+ ; CHECK: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 2
+ ; CHECK: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 3
+ ; CHECK: {{%[0-9]+}}:_(s128) = G_MERGE_VALUES [[C0]]:_(s32), [[C1]]:_(s32), [[C2]]:_(s32), [[C3]]:_(s32)
+ ; CHECK: [[LOW2x32:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C0]]:_(s32), [[C1]]:_(s32)
+ ; CHECK: [[HIGH2x32:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C2]]:_(s32), [[C3]]:_(s32)
+ ; CHECK: {{%[0-9]+}}:_(<4 x s32>) = G_CONCAT_VECTORS [[LOW2x32]]:_(<2 x s32>), [[HIGH2x32]]:_(<2 x s32>)
+ )";
+
+ EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF;
+}
OpenPOWER on IntegriCloud