aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/CodeGen/MachineInstrTest.cpp
diff options
context:
space:
mode:
authorAmy Huang <akhuang@google.com>2019-10-16 16:50:18 -0700
committerAmy Huang <akhuang@google.com>2019-10-25 09:21:10 -0700
commitb85b4e5a6f8579c137fecb59a4d75d7bfb111f79 (patch)
tree58ddaa01b58d03dc9b4e6698af8d3433d262fbe1 /llvm/unittests/CodeGen/MachineInstrTest.cpp
parentabd89c243a42da490dfd32368e25c896a7111a40 (diff)
downloadllvm-b85b4e5a6f8579c137fecb59a4d75d7bfb111f79.zip
llvm-b85b4e5a6f8579c137fecb59a4d75d7bfb111f79.tar.gz
llvm-b85b4e5a6f8579c137fecb59a4d75d7bfb111f79.tar.bz2
Add an instruction marker field to the ExtraInfo in MachineInstrs.
Summary: Add instruction marker to MachineInstr ExtraInfo. This does almost the same thing as Pre/PostInstrSymbols, except that it doesn't create a label until printing instructions. This allows for labels to be put around instructions that are deleted/duplicated somewhere. Also undo the workaround in r375137. Reviewers: rnk Subscribers: MatzeB, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D69136
Diffstat (limited to 'llvm/unittests/CodeGen/MachineInstrTest.cpp')
-rw-r--r--llvm/unittests/CodeGen/MachineInstrTest.cpp144
1 files changed, 144 insertions, 0 deletions
diff --git a/llvm/unittests/CodeGen/MachineInstrTest.cpp b/llvm/unittests/CodeGen/MachineInstrTest.cpp
index d482977..4913c4f 100644
--- a/llvm/unittests/CodeGen/MachineInstrTest.cpp
+++ b/llvm/unittests/CodeGen/MachineInstrTest.cpp
@@ -9,6 +9,7 @@
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineFunction.h"
+#include "llvm/CodeGen/MachineMemOperand.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/TargetFrameLowering.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
@@ -16,6 +17,8 @@
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/ModuleSlotTracker.h"
+#include "llvm/MC/MCAsmInfo.h"
+#include "llvm/MC/MCSymbol.h"
#include "llvm/Support/TargetRegistry.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Target/TargetMachine.h"
@@ -125,6 +128,7 @@ public:
: LLVMTargetMachine(Target(), "", Triple(""), "", "", TargetOptions(),
Reloc::Static, CodeModel::Small, CodeGenOpt::Default),
ST(*this) {}
+
~BogusTargetMachine() override {}
const TargetSubtargetInfo *getSubtargetImpl(const Function &) const override {
@@ -135,6 +139,17 @@ private:
BogusSubtarget ST;
};
+class BogusMCContext : public MCContext {
+public:
+ BogusMCContext(MCAsmInfo *mai)
+ : MCContext(mai, nullptr, nullptr, nullptr, nullptr, false) {}
+};
+
+std::unique_ptr<BogusMCContext> createMCContext() {
+ MCAsmInfo mai = MCAsmInfo();
+ return std::make_unique<BogusMCContext>(&mai);
+}
+
std::unique_ptr<BogusTargetMachine> createTargetMachine() {
return std::make_unique<BogusTargetMachine>();
}
@@ -361,6 +376,135 @@ TEST(MachineInstrSpan, DistanceEnd) {
ASSERT_TRUE(std::distance(MIS.begin(), MII) == 1);
}
+TEST(MachineInstrExtraInfo, AddExtraInfo) {
+ auto MF = createMachineFunction();
+ MCInstrDesc MCID = {0, 0, 0, 0, 0, 0,
+ 0, nullptr, nullptr, nullptr, 0, nullptr};
+
+ auto MI = MF->CreateMachineInstr(MCID, DebugLoc());
+ auto MC = createMCContext();
+ auto MMO = MF->getMachineMemOperand(MachinePointerInfo(),
+ MachineMemOperand::MOLoad, 8, 8);
+ SmallVector<MachineMemOperand *, 2> MMOs;
+ MMOs.push_back(MMO);
+ MCSymbol *Sym1 = MC->createTempSymbol("pre_label", false);
+ MCSymbol *Sym2 = MC->createTempSymbol("post_label", false);
+ LLVMContext Ctx;
+ MDNode *MDN = MDNode::getDistinct(Ctx, None);
+
+ ASSERT_TRUE(MI->memoperands_empty());
+ ASSERT_FALSE(MI->getPreInstrSymbol());
+ ASSERT_FALSE(MI->getPostInstrSymbol());
+ ASSERT_FALSE(MI->getHeapAllocMarker());
+
+ MI->setMemRefs(*MF, MMOs);
+ ASSERT_TRUE(MI->memoperands().size() == 1);
+ ASSERT_FALSE(MI->getPreInstrSymbol());
+ ASSERT_FALSE(MI->getPostInstrSymbol());
+ ASSERT_FALSE(MI->getHeapAllocMarker());
+
+ MI->setPreInstrSymbol(*MF, Sym1);
+ ASSERT_TRUE(MI->memoperands().size() == 1);
+ ASSERT_TRUE(MI->getPreInstrSymbol() == Sym1);
+ ASSERT_FALSE(MI->getPostInstrSymbol());
+ ASSERT_FALSE(MI->getHeapAllocMarker());
+
+ MI->setPostInstrSymbol(*MF, Sym2);
+ ASSERT_TRUE(MI->memoperands().size() == 1);
+ ASSERT_TRUE(MI->getPreInstrSymbol() == Sym1);
+ ASSERT_TRUE(MI->getPostInstrSymbol() == Sym2);
+ ASSERT_FALSE(MI->getHeapAllocMarker());
+
+ MI->setHeapAllocMarker(*MF, MDN);
+ ASSERT_TRUE(MI->memoperands().size() == 1);
+ ASSERT_TRUE(MI->getPreInstrSymbol() == Sym1);
+ ASSERT_TRUE(MI->getPostInstrSymbol() == Sym2);
+ ASSERT_TRUE(MI->getHeapAllocMarker() == MDN);
+}
+
+TEST(MachineInstrExtraInfo, ChangeExtraInfo) {
+ auto MF = createMachineFunction();
+ MCInstrDesc MCID = {0, 0, 0, 0, 0, 0,
+ 0, nullptr, nullptr, nullptr, 0, nullptr};
+
+ auto MI = MF->CreateMachineInstr(MCID, DebugLoc());
+ auto MC = createMCContext();
+ auto MMO = MF->getMachineMemOperand(MachinePointerInfo(),
+ MachineMemOperand::MOLoad, 8, 8);
+ SmallVector<MachineMemOperand *, 2> MMOs;
+ MMOs.push_back(MMO);
+ MCSymbol *Sym1 = MC->createTempSymbol("pre_label", false);
+ MCSymbol *Sym2 = MC->createTempSymbol("post_label", false);
+ LLVMContext Ctx;
+ MDNode *MDN = MDNode::getDistinct(Ctx, None);
+
+ MI->setMemRefs(*MF, MMOs);
+ MI->setPreInstrSymbol(*MF, Sym1);
+ MI->setPostInstrSymbol(*MF, Sym2);
+ MI->setHeapAllocMarker(*MF, MDN);
+
+ MMOs.push_back(MMO);
+
+ MI->setMemRefs(*MF, MMOs);
+ ASSERT_TRUE(MI->memoperands().size() == 2);
+ ASSERT_TRUE(MI->getPreInstrSymbol() == Sym1);
+ ASSERT_TRUE(MI->getPostInstrSymbol() == Sym2);
+ ASSERT_TRUE(MI->getHeapAllocMarker() == MDN);
+
+ MI->setPostInstrSymbol(*MF, Sym1);
+ ASSERT_TRUE(MI->memoperands().size() == 2);
+ ASSERT_TRUE(MI->getPreInstrSymbol() == Sym1);
+ ASSERT_TRUE(MI->getPostInstrSymbol() == Sym1);
+ ASSERT_TRUE(MI->getHeapAllocMarker() == MDN);
+}
+
+TEST(MachineInstrExtraInfo, RemoveExtraInfo) {
+ auto MF = createMachineFunction();
+ MCInstrDesc MCID = {0, 0, 0, 0, 0, 0,
+ 0, nullptr, nullptr, nullptr, 0, nullptr};
+
+ auto MI = MF->CreateMachineInstr(MCID, DebugLoc());
+ auto MC = createMCContext();
+ auto MMO = MF->getMachineMemOperand(MachinePointerInfo(),
+ MachineMemOperand::MOLoad, 8, 8);
+ SmallVector<MachineMemOperand *, 2> MMOs;
+ MMOs.push_back(MMO);
+ MMOs.push_back(MMO);
+ MCSymbol *Sym1 = MC->createTempSymbol("pre_label", false);
+ MCSymbol *Sym2 = MC->createTempSymbol("post_label", false);
+ LLVMContext Ctx;
+ MDNode *MDN = MDNode::getDistinct(Ctx, None);
+
+ MI->setMemRefs(*MF, MMOs);
+ MI->setPreInstrSymbol(*MF, Sym1);
+ MI->setPostInstrSymbol(*MF, Sym2);
+ MI->setHeapAllocMarker(*MF, MDN);
+
+ MI->setPostInstrSymbol(*MF, nullptr);
+ ASSERT_TRUE(MI->memoperands().size() == 2);
+ ASSERT_TRUE(MI->getPreInstrSymbol() == Sym1);
+ ASSERT_FALSE(MI->getPostInstrSymbol());
+ ASSERT_TRUE(MI->getHeapAllocMarker() == MDN);
+
+ MI->setHeapAllocMarker(*MF, nullptr);
+ ASSERT_TRUE(MI->memoperands().size() == 2);
+ ASSERT_TRUE(MI->getPreInstrSymbol() == Sym1);
+ ASSERT_FALSE(MI->getPostInstrSymbol());
+ ASSERT_FALSE(MI->getHeapAllocMarker());
+
+ MI->setPreInstrSymbol(*MF, nullptr);
+ ASSERT_TRUE(MI->memoperands().size() == 2);
+ ASSERT_FALSE(MI->getPreInstrSymbol());
+ ASSERT_FALSE(MI->getPostInstrSymbol());
+ ASSERT_FALSE(MI->getHeapAllocMarker());
+
+ MI->setMemRefs(*MF, {});
+ ASSERT_TRUE(MI->memoperands_empty());
+ ASSERT_FALSE(MI->getPreInstrSymbol());
+ ASSERT_FALSE(MI->getPostInstrSymbol());
+ ASSERT_FALSE(MI->getHeapAllocMarker());
+}
+
static_assert(is_trivially_copyable<MCOperand>::value, "trivially copyable");
} // end namespace