xref: /llvm-project/llvm/unittests/CodeGen/TargetOptionsTest.cpp (revision bb3f5e1fed7c6ba733b7f273e93f5d3930976185)
107cda257SDaniel Sanders #include "llvm/Target/TargetOptions.h"
26ac16e91SDaniel Sanders #include "llvm/CodeGen/TargetPassConfig.h"
307cda257SDaniel Sanders #include "llvm/IR/LLVMContext.h"
407cda257SDaniel Sanders #include "llvm/IR/LegacyPassManager.h"
53306fe10SHeejin Ahn #include "llvm/InitializePasses.h"
689b57061SReid Kleckner #include "llvm/MC/TargetRegistry.h"
707cda257SDaniel Sanders #include "llvm/Support/TargetSelect.h"
807cda257SDaniel Sanders #include "llvm/Target/TargetMachine.h"
907cda257SDaniel Sanders #include "gtest/gtest.h"
1007cda257SDaniel Sanders 
1107cda257SDaniel Sanders using namespace llvm;
1207cda257SDaniel Sanders 
1307cda257SDaniel Sanders namespace llvm {
1407cda257SDaniel Sanders   void initializeTestPassPass(PassRegistry &);
1507cda257SDaniel Sanders }
1607cda257SDaniel Sanders 
1707cda257SDaniel Sanders namespace {
1807cda257SDaniel Sanders 
1907cda257SDaniel Sanders void initLLVM() {
2007cda257SDaniel Sanders   InitializeAllTargets();
2107cda257SDaniel Sanders   InitializeAllTargetMCs();
2207cda257SDaniel Sanders   InitializeAllAsmPrinters();
2307cda257SDaniel Sanders   InitializeAllAsmParsers();
2407cda257SDaniel Sanders 
2507cda257SDaniel Sanders   PassRegistry *Registry = PassRegistry::getPassRegistry();
2607cda257SDaniel Sanders   initializeCore(*Registry);
2707cda257SDaniel Sanders   initializeCodeGen(*Registry);
2807cda257SDaniel Sanders }
2907cda257SDaniel Sanders 
3007cda257SDaniel Sanders /// Create a TargetMachine. We need a target that doesn't have IPRA enabled by
3107cda257SDaniel Sanders /// default. That turns out to be all targets at the moment, so just use X86.
3207cda257SDaniel Sanders std::unique_ptr<TargetMachine> createTargetMachine(bool EnableIPRA) {
3307cda257SDaniel Sanders   Triple TargetTriple("x86_64--");
3407cda257SDaniel Sanders   std::string Error;
3507cda257SDaniel Sanders   const Target *T = TargetRegistry::lookupTarget("", TargetTriple, Error);
3607cda257SDaniel Sanders   if (!T)
3707cda257SDaniel Sanders     return nullptr;
3807cda257SDaniel Sanders 
3907cda257SDaniel Sanders   TargetOptions Options;
4007cda257SDaniel Sanders   Options.EnableIPRA = EnableIPRA;
41b6a01caaSKazu Hirata   return std::unique_ptr<TargetMachine>(
42b6a01caaSKazu Hirata       T->createTargetMachine("X86", "", "", Options, std::nullopt, std::nullopt,
430a1aa6cdSArthur Eubanks                              CodeGenOptLevel::Aggressive));
4407cda257SDaniel Sanders }
4507cda257SDaniel Sanders 
4607cda257SDaniel Sanders typedef std::function<void(bool)> TargetOptionsTest;
4707cda257SDaniel Sanders 
4807cda257SDaniel Sanders static void targetOptionsTest(bool EnableIPRA) {
4907cda257SDaniel Sanders   std::unique_ptr<TargetMachine> TM = createTargetMachine(EnableIPRA);
5007cda257SDaniel Sanders   // This test is designed for the X86 backend; stop if it is not available.
5107cda257SDaniel Sanders   if (!TM)
525bbf1feaSIgor Kudrin     GTEST_SKIP();
5307cda257SDaniel Sanders   legacy::PassManager PM;
5407cda257SDaniel Sanders 
55*bb3f5e1fSMatin Raayai   TargetPassConfig *TPC = TM->createPassConfig(PM);
5607cda257SDaniel Sanders   (void)TPC;
5707cda257SDaniel Sanders 
5807cda257SDaniel Sanders   ASSERT_TRUE(TM->Options.EnableIPRA == EnableIPRA);
596ac16e91SDaniel Sanders 
606ac16e91SDaniel Sanders   delete TPC;
6107cda257SDaniel Sanders }
6207cda257SDaniel Sanders 
6307cda257SDaniel Sanders } // End of anonymous namespace.
6407cda257SDaniel Sanders 
6507cda257SDaniel Sanders TEST(TargetOptionsTest, IPRASetToOff) {
6607cda257SDaniel Sanders   targetOptionsTest(false);
6707cda257SDaniel Sanders }
6807cda257SDaniel Sanders 
6907cda257SDaniel Sanders TEST(TargetOptionsTest, IPRASetToOn) {
7007cda257SDaniel Sanders   targetOptionsTest(true);
7107cda257SDaniel Sanders }
7207cda257SDaniel Sanders 
7307cda257SDaniel Sanders int main(int argc, char **argv) {
7407cda257SDaniel Sanders   ::testing::InitGoogleTest(&argc, argv);
7507cda257SDaniel Sanders   initLLVM();
7607cda257SDaniel Sanders   return RUN_ALL_TESTS();
7707cda257SDaniel Sanders }
78