161f48ca3SMarcello Maggioni //===- MachineOperandTest.cpp ---------------------------------===// 261f48ca3SMarcello Maggioni // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 661f48ca3SMarcello Maggioni // 761f48ca3SMarcello Maggioni //===----------------------------------------------------------------------===// 861f48ca3SMarcello Maggioni 961f48ca3SMarcello Maggioni #include "llvm/CodeGen/MachineOperand.h" 105df3bbf3SFrancis Visoiu Mistrih #include "llvm/ADT/ilist_node.h" 116c4ca713SFrancis Visoiu Mistrih #include "llvm/IR/Constants.h" 12cb2683d4SFrancis Visoiu Mistrih #include "llvm/IR/InstrTypes.h" 136c4ca713SFrancis Visoiu Mistrih #include "llvm/IR/LLVMContext.h" 145df3bbf3SFrancis Visoiu Mistrih #include "llvm/IR/Module.h" 15440f69c9SFrancis Visoiu Mistrih #include "llvm/IR/ModuleSlotTracker.h" 163c99371cSFrancis Visoiu Mistrih #include "llvm/MC/MCContext.h" 173c99371cSFrancis Visoiu Mistrih #include "llvm/MC/MCAsmInfo.h" 18a8a83d15SFrancis Visoiu Mistrih #include "llvm/Support/raw_ostream.h" 1961f48ca3SMarcello Maggioni #include "gtest/gtest.h" 2061f48ca3SMarcello Maggioni 2161f48ca3SMarcello Maggioni using namespace llvm; 2261f48ca3SMarcello Maggioni 2361f48ca3SMarcello Maggioni namespace { 2461f48ca3SMarcello Maggioni 2561f48ca3SMarcello Maggioni TEST(MachineOperandTest, ChangeToTargetIndexTest) { 2661f48ca3SMarcello Maggioni // Creating a MachineOperand to change it to TargetIndex 2761f48ca3SMarcello Maggioni MachineOperand MO = MachineOperand::CreateImm(50); 2861f48ca3SMarcello Maggioni 2961f48ca3SMarcello Maggioni // Checking some precondition on the newly created 3061f48ca3SMarcello Maggioni // MachineOperand. 3161f48ca3SMarcello Maggioni ASSERT_TRUE(MO.isImm()); 3261f48ca3SMarcello Maggioni ASSERT_TRUE(MO.getImm() == 50); 3361f48ca3SMarcello Maggioni ASSERT_FALSE(MO.isTargetIndex()); 3461f48ca3SMarcello Maggioni 3561f48ca3SMarcello Maggioni // Changing to TargetIndex with some arbitrary values 3661f48ca3SMarcello Maggioni // for index, offset and flags. 3761f48ca3SMarcello Maggioni MO.ChangeToTargetIndex(74, 57, 12); 3861f48ca3SMarcello Maggioni 3961f48ca3SMarcello Maggioni // Checking that the mutation to TargetIndex happened 4061f48ca3SMarcello Maggioni // correctly. 4161f48ca3SMarcello Maggioni ASSERT_TRUE(MO.isTargetIndex()); 4261f48ca3SMarcello Maggioni ASSERT_TRUE(MO.getIndex() == 74); 4361f48ca3SMarcello Maggioni ASSERT_TRUE(MO.getOffset() == 57); 4461f48ca3SMarcello Maggioni ASSERT_TRUE(MO.getTargetFlags() == 12); 4561f48ca3SMarcello Maggioni } 4661f48ca3SMarcello Maggioni 47a8a83d15SFrancis Visoiu Mistrih TEST(MachineOperandTest, PrintRegisterMask) { 48a8a83d15SFrancis Visoiu Mistrih uint32_t Dummy; 49a8a83d15SFrancis Visoiu Mistrih MachineOperand MO = MachineOperand::CreateRegMask(&Dummy); 50a8a83d15SFrancis Visoiu Mistrih 51a8a83d15SFrancis Visoiu Mistrih // Checking some preconditions on the newly created 52a8a83d15SFrancis Visoiu Mistrih // MachineOperand. 53a8a83d15SFrancis Visoiu Mistrih ASSERT_TRUE(MO.isRegMask()); 54a8a83d15SFrancis Visoiu Mistrih ASSERT_TRUE(MO.getRegMask() == &Dummy); 55a8a83d15SFrancis Visoiu Mistrih 56a8a83d15SFrancis Visoiu Mistrih // Print a MachineOperand containing a RegMask. Here we check that without a 57a8a83d15SFrancis Visoiu Mistrih // TRI and IntrinsicInfo we still print a less detailed regmask. 58a8a83d15SFrancis Visoiu Mistrih std::string str; 59a8a83d15SFrancis Visoiu Mistrih raw_string_ostream OS(str); 60a8a83d15SFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 61a8a83d15SFrancis Visoiu Mistrih ASSERT_TRUE(OS.str() == "<regmask ...>"); 62a8a83d15SFrancis Visoiu Mistrih } 63a8a83d15SFrancis Visoiu Mistrih 64a8a83d15SFrancis Visoiu Mistrih TEST(MachineOperandTest, PrintSubReg) { 65a8a83d15SFrancis Visoiu Mistrih // Create a MachineOperand with RegNum=1 and SubReg=5. 66a8a83d15SFrancis Visoiu Mistrih MachineOperand MO = MachineOperand::CreateReg( 67a8a83d15SFrancis Visoiu Mistrih /*Reg=*/1, /*isDef=*/false, /*isImp=*/false, /*isKill=*/false, 68a8a83d15SFrancis Visoiu Mistrih /*isDead=*/false, /*isUndef=*/false, /*isEarlyClobber=*/false, 69a8a83d15SFrancis Visoiu Mistrih /*SubReg=*/5, /*isDebug=*/false, /*isInternalRead=*/false); 70a8a83d15SFrancis Visoiu Mistrih 71a8a83d15SFrancis Visoiu Mistrih // Checking some preconditions on the newly created 72a8a83d15SFrancis Visoiu Mistrih // MachineOperand. 73a8a83d15SFrancis Visoiu Mistrih ASSERT_TRUE(MO.isReg()); 74a8a83d15SFrancis Visoiu Mistrih ASSERT_TRUE(MO.getReg() == 1); 75a8a83d15SFrancis Visoiu Mistrih ASSERT_TRUE(MO.getSubReg() == 5); 76a8a83d15SFrancis Visoiu Mistrih 77a8a83d15SFrancis Visoiu Mistrih // Print a MachineOperand containing a SubReg. Here we check that without a 78a8a83d15SFrancis Visoiu Mistrih // TRI and IntrinsicInfo we can still print the subreg index. 79a8a83d15SFrancis Visoiu Mistrih std::string str; 80a8a83d15SFrancis Visoiu Mistrih raw_string_ostream OS(str); 81a8a83d15SFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 8243e94b15SPuyan Lotfi ASSERT_TRUE(OS.str() == "$physreg1.subreg5"); 83a8a83d15SFrancis Visoiu Mistrih } 84a8a83d15SFrancis Visoiu Mistrih 856c4ca713SFrancis Visoiu Mistrih TEST(MachineOperandTest, PrintCImm) { 866c4ca713SFrancis Visoiu Mistrih LLVMContext Context; 876c4ca713SFrancis Visoiu Mistrih APInt Int(128, UINT64_MAX); 886c4ca713SFrancis Visoiu Mistrih ++Int; 896c4ca713SFrancis Visoiu Mistrih ConstantInt *CImm = ConstantInt::get(Context, Int); 906c4ca713SFrancis Visoiu Mistrih // Create a MachineOperand with an Imm=(UINT64_MAX + 1) 916c4ca713SFrancis Visoiu Mistrih MachineOperand MO = MachineOperand::CreateCImm(CImm); 926c4ca713SFrancis Visoiu Mistrih 936c4ca713SFrancis Visoiu Mistrih // Checking some preconditions on the newly created 946c4ca713SFrancis Visoiu Mistrih // MachineOperand. 956c4ca713SFrancis Visoiu Mistrih ASSERT_TRUE(MO.isCImm()); 966c4ca713SFrancis Visoiu Mistrih ASSERT_TRUE(MO.getCImm() == CImm); 976c4ca713SFrancis Visoiu Mistrih ASSERT_TRUE(MO.getCImm()->getValue() == Int); 986c4ca713SFrancis Visoiu Mistrih 996c4ca713SFrancis Visoiu Mistrih // Print a MachineOperand containing a SubReg. Here we check that without a 1006c4ca713SFrancis Visoiu Mistrih // TRI and IntrinsicInfo we can still print the subreg index. 1016c4ca713SFrancis Visoiu Mistrih std::string str; 1026c4ca713SFrancis Visoiu Mistrih raw_string_ostream OS(str); 1036c4ca713SFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 1046c4ca713SFrancis Visoiu Mistrih ASSERT_TRUE(OS.str() == "i128 18446744073709551616"); 1056c4ca713SFrancis Visoiu Mistrih } 1066c4ca713SFrancis Visoiu Mistrih 107440f69c9SFrancis Visoiu Mistrih TEST(MachineOperandTest, PrintSubRegIndex) { 108440f69c9SFrancis Visoiu Mistrih // Create a MachineOperand with an immediate and print it as a subreg index. 109440f69c9SFrancis Visoiu Mistrih MachineOperand MO = MachineOperand::CreateImm(3); 110440f69c9SFrancis Visoiu Mistrih 111440f69c9SFrancis Visoiu Mistrih // Checking some preconditions on the newly created 112440f69c9SFrancis Visoiu Mistrih // MachineOperand. 113440f69c9SFrancis Visoiu Mistrih ASSERT_TRUE(MO.isImm()); 114440f69c9SFrancis Visoiu Mistrih ASSERT_TRUE(MO.getImm() == 3); 115440f69c9SFrancis Visoiu Mistrih 116440f69c9SFrancis Visoiu Mistrih // Print a MachineOperand containing a SubRegIdx. Here we check that without a 117440f69c9SFrancis Visoiu Mistrih // TRI and IntrinsicInfo we can print the operand as a subreg index. 118440f69c9SFrancis Visoiu Mistrih std::string str; 119440f69c9SFrancis Visoiu Mistrih raw_string_ostream OS(str); 120ecd0b833SFrancis Visoiu Mistrih MachineOperand::printSubRegIdx(OS, MO.getImm(), nullptr); 121440f69c9SFrancis Visoiu Mistrih ASSERT_TRUE(OS.str() == "%subreg.3"); 122440f69c9SFrancis Visoiu Mistrih } 123440f69c9SFrancis Visoiu Mistrih 12426ae8a65SFrancis Visoiu Mistrih TEST(MachineOperandTest, PrintCPI) { 12526ae8a65SFrancis Visoiu Mistrih // Create a MachineOperand with a constant pool index and print it. 12626ae8a65SFrancis Visoiu Mistrih MachineOperand MO = MachineOperand::CreateCPI(0, 8); 12726ae8a65SFrancis Visoiu Mistrih 12826ae8a65SFrancis Visoiu Mistrih // Checking some preconditions on the newly created 12926ae8a65SFrancis Visoiu Mistrih // MachineOperand. 13026ae8a65SFrancis Visoiu Mistrih ASSERT_TRUE(MO.isCPI()); 13126ae8a65SFrancis Visoiu Mistrih ASSERT_TRUE(MO.getIndex() == 0); 13226ae8a65SFrancis Visoiu Mistrih ASSERT_TRUE(MO.getOffset() == 8); 13326ae8a65SFrancis Visoiu Mistrih 13426ae8a65SFrancis Visoiu Mistrih // Print a MachineOperand containing a constant pool index and a positive 13526ae8a65SFrancis Visoiu Mistrih // offset. 13626ae8a65SFrancis Visoiu Mistrih std::string str; 13726ae8a65SFrancis Visoiu Mistrih { 13826ae8a65SFrancis Visoiu Mistrih raw_string_ostream OS(str); 13926ae8a65SFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 14026ae8a65SFrancis Visoiu Mistrih ASSERT_TRUE(OS.str() == "%const.0 + 8"); 14126ae8a65SFrancis Visoiu Mistrih } 14226ae8a65SFrancis Visoiu Mistrih 14326ae8a65SFrancis Visoiu Mistrih str.clear(); 14426ae8a65SFrancis Visoiu Mistrih 14526ae8a65SFrancis Visoiu Mistrih MO.setOffset(-12); 14626ae8a65SFrancis Visoiu Mistrih 14726ae8a65SFrancis Visoiu Mistrih // Print a MachineOperand containing a constant pool index and a negative 14826ae8a65SFrancis Visoiu Mistrih // offset. 14926ae8a65SFrancis Visoiu Mistrih { 15026ae8a65SFrancis Visoiu Mistrih raw_string_ostream OS(str); 15126ae8a65SFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 15226ae8a65SFrancis Visoiu Mistrih ASSERT_TRUE(OS.str() == "%const.0 - 12"); 15326ae8a65SFrancis Visoiu Mistrih } 15426ae8a65SFrancis Visoiu Mistrih } 15526ae8a65SFrancis Visoiu Mistrih 156b3a0d513SFrancis Visoiu Mistrih TEST(MachineOperandTest, PrintTargetIndexName) { 157b3a0d513SFrancis Visoiu Mistrih // Create a MachineOperand with a target index and print it. 158b3a0d513SFrancis Visoiu Mistrih MachineOperand MO = MachineOperand::CreateTargetIndex(0, 8); 159b3a0d513SFrancis Visoiu Mistrih 160b3a0d513SFrancis Visoiu Mistrih // Checking some preconditions on the newly created 161b3a0d513SFrancis Visoiu Mistrih // MachineOperand. 162b3a0d513SFrancis Visoiu Mistrih ASSERT_TRUE(MO.isTargetIndex()); 163b3a0d513SFrancis Visoiu Mistrih ASSERT_TRUE(MO.getIndex() == 0); 164b3a0d513SFrancis Visoiu Mistrih ASSERT_TRUE(MO.getOffset() == 8); 165b3a0d513SFrancis Visoiu Mistrih 166b3a0d513SFrancis Visoiu Mistrih // Print a MachineOperand containing a target index and a positive offset. 167b3a0d513SFrancis Visoiu Mistrih std::string str; 168b3a0d513SFrancis Visoiu Mistrih { 169b3a0d513SFrancis Visoiu Mistrih raw_string_ostream OS(str); 170b3a0d513SFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 171b3a0d513SFrancis Visoiu Mistrih ASSERT_TRUE(OS.str() == "target-index(<unknown>) + 8"); 172b3a0d513SFrancis Visoiu Mistrih } 173b3a0d513SFrancis Visoiu Mistrih 174b3a0d513SFrancis Visoiu Mistrih str.clear(); 175b3a0d513SFrancis Visoiu Mistrih 176b3a0d513SFrancis Visoiu Mistrih MO.setOffset(-12); 177b3a0d513SFrancis Visoiu Mistrih 178b3a0d513SFrancis Visoiu Mistrih // Print a MachineOperand containing a target index and a negative offset. 179b3a0d513SFrancis Visoiu Mistrih { 180b3a0d513SFrancis Visoiu Mistrih raw_string_ostream OS(str); 181b3a0d513SFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 182b3a0d513SFrancis Visoiu Mistrih ASSERT_TRUE(OS.str() == "target-index(<unknown>) - 12"); 183b3a0d513SFrancis Visoiu Mistrih } 184b3a0d513SFrancis Visoiu Mistrih } 185b3a0d513SFrancis Visoiu Mistrih 186b41dbbe3SFrancis Visoiu Mistrih TEST(MachineOperandTest, PrintJumpTableIndex) { 187b41dbbe3SFrancis Visoiu Mistrih // Create a MachineOperand with a jump-table index and print it. 188b41dbbe3SFrancis Visoiu Mistrih MachineOperand MO = MachineOperand::CreateJTI(3); 189b41dbbe3SFrancis Visoiu Mistrih 190b41dbbe3SFrancis Visoiu Mistrih // Checking some preconditions on the newly created 191b41dbbe3SFrancis Visoiu Mistrih // MachineOperand. 192b41dbbe3SFrancis Visoiu Mistrih ASSERT_TRUE(MO.isJTI()); 193b41dbbe3SFrancis Visoiu Mistrih ASSERT_TRUE(MO.getIndex() == 3); 194b41dbbe3SFrancis Visoiu Mistrih 195b41dbbe3SFrancis Visoiu Mistrih // Print a MachineOperand containing a jump-table index. 196b41dbbe3SFrancis Visoiu Mistrih std::string str; 197b41dbbe3SFrancis Visoiu Mistrih raw_string_ostream OS(str); 198b41dbbe3SFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 199b41dbbe3SFrancis Visoiu Mistrih ASSERT_TRUE(OS.str() == "%jump-table.3"); 200b41dbbe3SFrancis Visoiu Mistrih } 201b41dbbe3SFrancis Visoiu Mistrih 202e76c5fcdSFrancis Visoiu Mistrih TEST(MachineOperandTest, PrintExternalSymbol) { 203e76c5fcdSFrancis Visoiu Mistrih // Create a MachineOperand with an external symbol and print it. 204e76c5fcdSFrancis Visoiu Mistrih MachineOperand MO = MachineOperand::CreateES("foo"); 205e76c5fcdSFrancis Visoiu Mistrih 206e76c5fcdSFrancis Visoiu Mistrih // Checking some preconditions on the newly created 207e76c5fcdSFrancis Visoiu Mistrih // MachineOperand. 208e76c5fcdSFrancis Visoiu Mistrih ASSERT_TRUE(MO.isSymbol()); 209e76c5fcdSFrancis Visoiu Mistrih ASSERT_TRUE(MO.getSymbolName() == StringRef("foo")); 210e76c5fcdSFrancis Visoiu Mistrih 211e76c5fcdSFrancis Visoiu Mistrih // Print a MachineOperand containing an external symbol and no offset. 212e76c5fcdSFrancis Visoiu Mistrih std::string str; 213e76c5fcdSFrancis Visoiu Mistrih { 214e76c5fcdSFrancis Visoiu Mistrih raw_string_ostream OS(str); 215e76c5fcdSFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 216fe6c9cbbSPuyan Lotfi ASSERT_TRUE(OS.str() == "&foo"); 217e76c5fcdSFrancis Visoiu Mistrih } 218e76c5fcdSFrancis Visoiu Mistrih 219e76c5fcdSFrancis Visoiu Mistrih str.clear(); 220e76c5fcdSFrancis Visoiu Mistrih MO.setOffset(12); 221e76c5fcdSFrancis Visoiu Mistrih 222e76c5fcdSFrancis Visoiu Mistrih // Print a MachineOperand containing an external symbol and a positive offset. 223e76c5fcdSFrancis Visoiu Mistrih { 224e76c5fcdSFrancis Visoiu Mistrih raw_string_ostream OS(str); 225e76c5fcdSFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 226fe6c9cbbSPuyan Lotfi ASSERT_TRUE(OS.str() == "&foo + 12"); 227e76c5fcdSFrancis Visoiu Mistrih } 228e76c5fcdSFrancis Visoiu Mistrih 229e76c5fcdSFrancis Visoiu Mistrih str.clear(); 230e76c5fcdSFrancis Visoiu Mistrih MO.setOffset(-12); 231e76c5fcdSFrancis Visoiu Mistrih 232e76c5fcdSFrancis Visoiu Mistrih // Print a MachineOperand containing an external symbol and a negative offset. 233e76c5fcdSFrancis Visoiu Mistrih { 234e76c5fcdSFrancis Visoiu Mistrih raw_string_ostream OS(str); 235e76c5fcdSFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 236fe6c9cbbSPuyan Lotfi ASSERT_TRUE(OS.str() == "&foo - 12"); 237e76c5fcdSFrancis Visoiu Mistrih } 238e76c5fcdSFrancis Visoiu Mistrih } 239e76c5fcdSFrancis Visoiu Mistrih 2405df3bbf3SFrancis Visoiu Mistrih TEST(MachineOperandTest, PrintGlobalAddress) { 2415df3bbf3SFrancis Visoiu Mistrih LLVMContext Ctx; 2425df3bbf3SFrancis Visoiu Mistrih Module M("MachineOperandGVTest", Ctx); 2435df3bbf3SFrancis Visoiu Mistrih M.getOrInsertGlobal("foo", Type::getInt32Ty(Ctx)); 2445df3bbf3SFrancis Visoiu Mistrih 2455df3bbf3SFrancis Visoiu Mistrih GlobalValue *GV = M.getNamedValue("foo"); 2465df3bbf3SFrancis Visoiu Mistrih 2475df3bbf3SFrancis Visoiu Mistrih // Create a MachineOperand with a global address and a positive offset and 2485df3bbf3SFrancis Visoiu Mistrih // print it. 2495df3bbf3SFrancis Visoiu Mistrih MachineOperand MO = MachineOperand::CreateGA(GV, 12); 2505df3bbf3SFrancis Visoiu Mistrih 2515df3bbf3SFrancis Visoiu Mistrih // Checking some preconditions on the newly created 2525df3bbf3SFrancis Visoiu Mistrih // MachineOperand. 2535df3bbf3SFrancis Visoiu Mistrih ASSERT_TRUE(MO.isGlobal()); 2545df3bbf3SFrancis Visoiu Mistrih ASSERT_TRUE(MO.getGlobal() == GV); 2555df3bbf3SFrancis Visoiu Mistrih ASSERT_TRUE(MO.getOffset() == 12); 2565df3bbf3SFrancis Visoiu Mistrih 2575df3bbf3SFrancis Visoiu Mistrih std::string str; 2585df3bbf3SFrancis Visoiu Mistrih // Print a MachineOperand containing a global address and a positive offset. 2595df3bbf3SFrancis Visoiu Mistrih { 2605df3bbf3SFrancis Visoiu Mistrih raw_string_ostream OS(str); 2615df3bbf3SFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 2625df3bbf3SFrancis Visoiu Mistrih ASSERT_TRUE(OS.str() == "@foo + 12"); 2635df3bbf3SFrancis Visoiu Mistrih } 2645df3bbf3SFrancis Visoiu Mistrih 2655df3bbf3SFrancis Visoiu Mistrih str.clear(); 2665df3bbf3SFrancis Visoiu Mistrih MO.setOffset(-12); 2675df3bbf3SFrancis Visoiu Mistrih 2685df3bbf3SFrancis Visoiu Mistrih // Print a MachineOperand containing a global address and a negative offset. 2695df3bbf3SFrancis Visoiu Mistrih { 2705df3bbf3SFrancis Visoiu Mistrih raw_string_ostream OS(str); 2715df3bbf3SFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 2725df3bbf3SFrancis Visoiu Mistrih ASSERT_TRUE(OS.str() == "@foo - 12"); 2735df3bbf3SFrancis Visoiu Mistrih } 2745df3bbf3SFrancis Visoiu Mistrih } 2755df3bbf3SFrancis Visoiu Mistrih 276bdaf8bfaSFrancis Visoiu Mistrih TEST(MachineOperandTest, PrintRegisterLiveOut) { 277bdaf8bfaSFrancis Visoiu Mistrih // Create a MachineOperand with a register live out list and print it. 278bdaf8bfaSFrancis Visoiu Mistrih uint32_t Mask = 0; 279bdaf8bfaSFrancis Visoiu Mistrih MachineOperand MO = MachineOperand::CreateRegLiveOut(&Mask); 280bdaf8bfaSFrancis Visoiu Mistrih 281bdaf8bfaSFrancis Visoiu Mistrih // Checking some preconditions on the newly created 282bdaf8bfaSFrancis Visoiu Mistrih // MachineOperand. 283bdaf8bfaSFrancis Visoiu Mistrih ASSERT_TRUE(MO.isRegLiveOut()); 284bdaf8bfaSFrancis Visoiu Mistrih ASSERT_TRUE(MO.getRegLiveOut() == &Mask); 285bdaf8bfaSFrancis Visoiu Mistrih 286bdaf8bfaSFrancis Visoiu Mistrih std::string str; 287bdaf8bfaSFrancis Visoiu Mistrih // Print a MachineOperand containing a register live out list without a TRI. 288bdaf8bfaSFrancis Visoiu Mistrih raw_string_ostream OS(str); 289bdaf8bfaSFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 290bdaf8bfaSFrancis Visoiu Mistrih ASSERT_TRUE(OS.str() == "liveout(<unknown>)"); 291bdaf8bfaSFrancis Visoiu Mistrih } 292bdaf8bfaSFrancis Visoiu Mistrih 2932db59382SFrancis Visoiu Mistrih TEST(MachineOperandTest, PrintMetadata) { 2942db59382SFrancis Visoiu Mistrih LLVMContext Ctx; 2952db59382SFrancis Visoiu Mistrih Module M("MachineOperandMDNodeTest", Ctx); 2962db59382SFrancis Visoiu Mistrih NamedMDNode *MD = M.getOrInsertNamedMetadata("namedmd"); 297378b5f3dSFrancis Visoiu Mistrih ModuleSlotTracker MST(&M); 2982db59382SFrancis Visoiu Mistrih Metadata *MDS = MDString::get(Ctx, "foo"); 2992db59382SFrancis Visoiu Mistrih MDNode *Node = MDNode::get(Ctx, MDS); 3002db59382SFrancis Visoiu Mistrih MD->addOperand(Node); 3012db59382SFrancis Visoiu Mistrih 3022db59382SFrancis Visoiu Mistrih // Create a MachineOperand with a metadata and print it. 3032db59382SFrancis Visoiu Mistrih MachineOperand MO = MachineOperand::CreateMetadata(Node); 3042db59382SFrancis Visoiu Mistrih 3052db59382SFrancis Visoiu Mistrih // Checking some preconditions on the newly created 3062db59382SFrancis Visoiu Mistrih // MachineOperand. 3072db59382SFrancis Visoiu Mistrih ASSERT_TRUE(MO.isMetadata()); 3082db59382SFrancis Visoiu Mistrih ASSERT_TRUE(MO.getMetadata() == Node); 3092db59382SFrancis Visoiu Mistrih 3102db59382SFrancis Visoiu Mistrih std::string str; 3112db59382SFrancis Visoiu Mistrih // Print a MachineOperand containing a metadata node. 3122db59382SFrancis Visoiu Mistrih raw_string_ostream OS(str); 313eb3f76fcSFrancis Visoiu Mistrih MO.print(OS, MST, LLT{}, /*PrintDef=*/false, /*IsStandalone=*/false, 314378b5f3dSFrancis Visoiu Mistrih /*ShouldPrintRegisterTies=*/false, 0, /*TRI=*/nullptr, 3152db59382SFrancis Visoiu Mistrih /*IntrinsicInfo=*/nullptr); 3162db59382SFrancis Visoiu Mistrih ASSERT_TRUE(OS.str() == "!0"); 3172db59382SFrancis Visoiu Mistrih } 3182db59382SFrancis Visoiu Mistrih 3193c99371cSFrancis Visoiu Mistrih TEST(MachineOperandTest, PrintMCSymbol) { 3203c99371cSFrancis Visoiu Mistrih MCAsmInfo MAI; 3213c99371cSFrancis Visoiu Mistrih MCContext Ctx(&MAI, /*MRI=*/nullptr, /*MOFI=*/nullptr); 3223c99371cSFrancis Visoiu Mistrih MCSymbol *Sym = Ctx.getOrCreateSymbol("foo"); 3233c99371cSFrancis Visoiu Mistrih 3243c99371cSFrancis Visoiu Mistrih // Create a MachineOperand with a metadata and print it. 3253c99371cSFrancis Visoiu Mistrih MachineOperand MO = MachineOperand::CreateMCSymbol(Sym); 3263c99371cSFrancis Visoiu Mistrih 3273c99371cSFrancis Visoiu Mistrih // Checking some preconditions on the newly created 3283c99371cSFrancis Visoiu Mistrih // MachineOperand. 3293c99371cSFrancis Visoiu Mistrih ASSERT_TRUE(MO.isMCSymbol()); 3303c99371cSFrancis Visoiu Mistrih ASSERT_TRUE(MO.getMCSymbol() == Sym); 3313c99371cSFrancis Visoiu Mistrih 3323c99371cSFrancis Visoiu Mistrih std::string str; 3333c99371cSFrancis Visoiu Mistrih // Print a MachineOperand containing a metadata node. 3343c99371cSFrancis Visoiu Mistrih raw_string_ostream OS(str); 3353c99371cSFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 3363c99371cSFrancis Visoiu Mistrih ASSERT_TRUE(OS.str() == "<mcsymbol foo>"); 3373c99371cSFrancis Visoiu Mistrih } 3383c99371cSFrancis Visoiu Mistrih 339874ae6faSFrancis Visoiu Mistrih TEST(MachineOperandTest, PrintCFI) { 340874ae6faSFrancis Visoiu Mistrih // Create a MachineOperand with a CFI index but no function and print it. 341874ae6faSFrancis Visoiu Mistrih MachineOperand MO = MachineOperand::CreateCFIIndex(8); 342874ae6faSFrancis Visoiu Mistrih 343874ae6faSFrancis Visoiu Mistrih // Checking some preconditions on the newly created 344874ae6faSFrancis Visoiu Mistrih // MachineOperand. 345874ae6faSFrancis Visoiu Mistrih ASSERT_TRUE(MO.isCFIIndex()); 346874ae6faSFrancis Visoiu Mistrih ASSERT_TRUE(MO.getCFIIndex() == 8); 347874ae6faSFrancis Visoiu Mistrih 348874ae6faSFrancis Visoiu Mistrih std::string str; 349874ae6faSFrancis Visoiu Mistrih // Print a MachineOperand containing a CFI Index node but no machine function 350874ae6faSFrancis Visoiu Mistrih // attached to it. 351874ae6faSFrancis Visoiu Mistrih raw_string_ostream OS(str); 352874ae6faSFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 353874ae6faSFrancis Visoiu Mistrih ASSERT_TRUE(OS.str() == "<cfi directive>"); 354874ae6faSFrancis Visoiu Mistrih } 355874ae6faSFrancis Visoiu Mistrih 356bbd610aeSFrancis Visoiu Mistrih TEST(MachineOperandTest, PrintIntrinsicID) { 357bbd610aeSFrancis Visoiu Mistrih // Create a MachineOperand with a generic intrinsic ID. 358bbd610aeSFrancis Visoiu Mistrih MachineOperand MO = MachineOperand::CreateIntrinsicID(Intrinsic::bswap); 359bbd610aeSFrancis Visoiu Mistrih 360bbd610aeSFrancis Visoiu Mistrih // Checking some preconditions on the newly created 361bbd610aeSFrancis Visoiu Mistrih // MachineOperand. 362bbd610aeSFrancis Visoiu Mistrih ASSERT_TRUE(MO.isIntrinsicID()); 363bbd610aeSFrancis Visoiu Mistrih ASSERT_TRUE(MO.getIntrinsicID() == Intrinsic::bswap); 364bbd610aeSFrancis Visoiu Mistrih 365bbd610aeSFrancis Visoiu Mistrih std::string str; 366bbd610aeSFrancis Visoiu Mistrih { 367bbd610aeSFrancis Visoiu Mistrih // Print a MachineOperand containing a generic intrinsic ID. 368bbd610aeSFrancis Visoiu Mistrih raw_string_ostream OS(str); 369bbd610aeSFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 370bbd610aeSFrancis Visoiu Mistrih ASSERT_TRUE(OS.str() == "intrinsic(@llvm.bswap)"); 371bbd610aeSFrancis Visoiu Mistrih } 372bbd610aeSFrancis Visoiu Mistrih 373bbd610aeSFrancis Visoiu Mistrih str.clear(); 374bbd610aeSFrancis Visoiu Mistrih // Set a target-specific intrinsic. 375bbd610aeSFrancis Visoiu Mistrih MO = MachineOperand::CreateIntrinsicID((Intrinsic::ID)-1); 376bbd610aeSFrancis Visoiu Mistrih { 377bbd610aeSFrancis Visoiu Mistrih // Print a MachineOperand containing a target-specific intrinsic ID but not 378bbd610aeSFrancis Visoiu Mistrih // IntrinsicInfo. 379bbd610aeSFrancis Visoiu Mistrih raw_string_ostream OS(str); 380bbd610aeSFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 381bbd610aeSFrancis Visoiu Mistrih ASSERT_TRUE(OS.str() == "intrinsic(4294967295)"); 382bbd610aeSFrancis Visoiu Mistrih } 383bbd610aeSFrancis Visoiu Mistrih } 384bbd610aeSFrancis Visoiu Mistrih 385cb2683d4SFrancis Visoiu Mistrih TEST(MachineOperandTest, PrintPredicate) { 386cb2683d4SFrancis Visoiu Mistrih // Create a MachineOperand with a generic intrinsic ID. 387cb2683d4SFrancis Visoiu Mistrih MachineOperand MO = MachineOperand::CreatePredicate(CmpInst::ICMP_EQ); 388cb2683d4SFrancis Visoiu Mistrih 389cb2683d4SFrancis Visoiu Mistrih // Checking some preconditions on the newly created 390cb2683d4SFrancis Visoiu Mistrih // MachineOperand. 391cb2683d4SFrancis Visoiu Mistrih ASSERT_TRUE(MO.isPredicate()); 392cb2683d4SFrancis Visoiu Mistrih ASSERT_TRUE(MO.getPredicate() == CmpInst::ICMP_EQ); 393cb2683d4SFrancis Visoiu Mistrih 394cb2683d4SFrancis Visoiu Mistrih std::string str; 395cb2683d4SFrancis Visoiu Mistrih // Print a MachineOperand containing a int predicate ICMP_EQ. 396cb2683d4SFrancis Visoiu Mistrih raw_string_ostream OS(str); 397cb2683d4SFrancis Visoiu Mistrih MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr); 398cb2683d4SFrancis Visoiu Mistrih ASSERT_TRUE(OS.str() == "intpred(eq)"); 399cb2683d4SFrancis Visoiu Mistrih } 400cb2683d4SFrancis Visoiu Mistrih 40161f48ca3SMarcello Maggioni } // end namespace 402