Matt Arsenault | 5213381 | 2019-01-22 21:31:02 +0000 | [diff] [blame] | 1 | //===- MachineIRBuilderTest.cpp -------------------------------------------===// |
| 2 | // |
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
| 9 | #include "GISelMITest.h" |
| 10 | #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" |
| 11 | |
| 12 | TEST_F(GISelMITest, TestBuildConstantFConstant) { |
| 13 | if (!TM) |
| 14 | return; |
| 15 | |
Matt Arsenault | 5213381 | 2019-01-22 21:31:02 +0000 | [diff] [blame] | 16 | B.buildConstant(LLT::scalar(32), 42); |
| 17 | B.buildFConstant(LLT::scalar(32), 1.0); |
| 18 | |
| 19 | B.buildConstant(LLT::vector(2, 32), 99); |
| 20 | B.buildFConstant(LLT::vector(2, 32), 2.0); |
| 21 | |
| 22 | auto CheckStr = R"( |
| 23 | CHECK: [[CONST0:%[0-9]+]]:_(s32) = G_CONSTANT i32 42 |
| 24 | CHECK: [[FCONST0:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.000000e+00 |
| 25 | CHECK: [[CONST1:%[0-9]+]]:_(s32) = G_CONSTANT i32 99 |
| 26 | CHECK: [[VEC0:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[CONST1]]:_(s32), [[CONST1]]:_(s32) |
Matt Arsenault | 8121ec2 | 2019-02-04 19:15:50 +0000 | [diff] [blame] | 27 | CHECK: [[FCONST1:%[0-9]+]]:_(s32) = G_FCONSTANT float 2.000000e+00 |
Matt Arsenault | 5213381 | 2019-01-22 21:31:02 +0000 | [diff] [blame] | 28 | CHECK: [[VEC1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[FCONST1]]:_(s32), [[FCONST1]]:_(s32) |
Matt Arsenault | 5213381 | 2019-01-22 21:31:02 +0000 | [diff] [blame] | 29 | )"; |
| 30 | |
Matt Arsenault | b3e8670 | 2019-02-04 18:58:27 +0000 | [diff] [blame] | 31 | EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; |
Matt Arsenault | 5213381 | 2019-01-22 21:31:02 +0000 | [diff] [blame] | 32 | } |
Matt Arsenault | 8121ec2 | 2019-02-04 19:15:50 +0000 | [diff] [blame] | 33 | |
| 34 | |
| 35 | #ifdef GTEST_HAS_DEATH_TEST |
| 36 | #ifndef NDEBUG |
| 37 | |
| 38 | TEST_F(GISelMITest, TestBuildConstantFConstantDeath) { |
| 39 | if (!TM) |
| 40 | return; |
| 41 | |
| 42 | LLVMContext &Ctx = MF->getFunction().getContext(); |
| 43 | APInt APV32(32, 12345); |
| 44 | |
| 45 | // Test APInt version breaks |
| 46 | EXPECT_DEATH(B.buildConstant(LLT::scalar(16), APV32), |
| 47 | "creating constant with the wrong size"); |
| 48 | EXPECT_DEATH(B.buildConstant(LLT::vector(2, 16), APV32), |
| 49 | "creating constant with the wrong size"); |
| 50 | |
| 51 | // Test ConstantInt version breaks |
| 52 | ConstantInt *CI = ConstantInt::get(Ctx, APV32); |
| 53 | EXPECT_DEATH(B.buildConstant(LLT::scalar(16), *CI), |
| 54 | "creating constant with the wrong size"); |
| 55 | EXPECT_DEATH(B.buildConstant(LLT::vector(2, 16), *CI), |
| 56 | "creating constant with the wrong size"); |
| 57 | |
| 58 | APFloat DoubleVal(APFloat::IEEEdouble()); |
| 59 | ConstantFP *CF = ConstantFP::get(Ctx, DoubleVal); |
| 60 | EXPECT_DEATH(B.buildFConstant(LLT::scalar(16), *CF), |
| 61 | "creating fconstant with the wrong size"); |
| 62 | EXPECT_DEATH(B.buildFConstant(LLT::vector(2, 16), *CF), |
| 63 | "creating fconstant with the wrong size"); |
| 64 | } |
| 65 | |
| 66 | #endif |
| 67 | #endif |
Matt Arsenault | f3a46d0 | 2019-02-04 19:53:19 +0000 | [diff] [blame] | 68 | |
| 69 | TEST_F(GISelMITest, DstOpSrcOp) { |
| 70 | if (!TM) |
| 71 | return; |
| 72 | |
| 73 | SmallVector<unsigned, 4> Copies; |
| 74 | collectCopies(Copies, MF); |
| 75 | |
| 76 | LLT s64 = LLT::scalar(64); |
| 77 | auto MIBAdd = B.buildAdd(s64, Copies[0], Copies[1]); |
| 78 | |
| 79 | // Test SrcOp and DstOp can be constructed directly from MachineOperand by |
| 80 | // copying the instruction |
| 81 | B.buildAdd(MIBAdd->getOperand(0), MIBAdd->getOperand(1), MIBAdd->getOperand(2)); |
| 82 | |
| 83 | |
| 84 | auto CheckStr = R"( |
| 85 | ; CHECK: [[COPY0:%[0-9]+]]:_(s64) = COPY $x0 |
| 86 | ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1 |
| 87 | ; CHECK: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[COPY0]]:_, [[COPY1]]:_ |
| 88 | ; CHECK: [[ADD]]:_(s64) = G_ADD [[COPY0]]:_, [[COPY1]]:_ |
| 89 | )"; |
| 90 | |
| 91 | EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; |
| 92 | } |