1 //===- opt.cpp - The LLVM Modular Optimizer -------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // Optimizations may be specified an arbitrary number of times on the command
11 // line, They are run in the order specified.
13 //===----------------------------------------------------------------------===//
15 #include "BreakpointPrinter.h"
16 #include "NewPMDriver.h"
17 #include "PassPrinters.h"
18 #include "llvm/ADT/Triple.h"
19 #include "llvm/Analysis/CallGraph.h"
20 #include "llvm/Analysis/CallGraphSCCPass.h"
21 #include "llvm/Analysis/LoopPass.h"
22 #include "llvm/Analysis/RegionPass.h"
23 #include "llvm/Analysis/TargetLibraryInfo.h"
24 #include "llvm/Analysis/TargetTransformInfo.h"
25 #include "llvm/Bitcode/BitcodeWriterPass.h"
26 #include "llvm/CodeGen/CommandFlags.h"
27 #include "llvm/CodeGen/TargetPassConfig.h"
28 #include "llvm/IR/DataLayout.h"
29 #include "llvm/IR/DebugInfo.h"
30 #include "llvm/IR/IRPrintingPasses.h"
31 #include "llvm/IR/LLVMContext.h"
32 #include "llvm/IR/LegacyPassManager.h"
33 #include "llvm/IR/LegacyPassNameParser.h"
34 #include "llvm/IR/Module.h"
35 #include "llvm/IR/Verifier.h"
36 #include "llvm/IRReader/IRReader.h"
37 #include "llvm/InitializePasses.h"
38 #include "llvm/LinkAllIR.h"
39 #include "llvm/LinkAllPasses.h"
40 #include "llvm/MC/SubtargetFeature.h"
41 #include "llvm/Support/Debug.h"
42 #include "llvm/Support/FileSystem.h"
43 #include "llvm/Support/Host.h"
44 #include "llvm/Support/ManagedStatic.h"
45 #include "llvm/Support/PluginLoader.h"
46 #include "llvm/Support/PrettyStackTrace.h"
47 #include "llvm/Support/Signals.h"
48 #include "llvm/Support/SourceMgr.h"
49 #include "llvm/Support/SystemUtils.h"
50 #include "llvm/Support/TargetRegistry.h"
51 #include "llvm/Support/TargetSelect.h"
52 #include "llvm/Support/ToolOutputFile.h"
53 #include "llvm/Support/YAMLTraits.h"
54 #include "llvm/Target/TargetMachine.h"
55 #include "llvm/Transforms/Coroutines.h"
56 #include "llvm/Transforms/IPO/AlwaysInliner.h"
57 #include "llvm/Transforms/IPO/PassManagerBuilder.h"
58 #include "llvm/Transforms/Utils/Cloning.h"
62 using namespace opt_tool
;
64 // The OptimizationList is automatically populated with registered Passes by the
67 static cl::list
<const PassInfo
*, bool, PassNameParser
>
68 PassList(cl::desc("Optimizations available:"));
70 // This flag specifies a textual description of the optimization pass pipeline
71 // to run over the module. This flag switches opt to use the new pass manager
72 // infrastructure, completely disabling all of the flags specific to the old
74 static cl::opt
<std::string
> PassPipeline(
76 cl::desc("A textual description of the pass pipeline for optimizing"),
79 // Other command line options...
81 static cl::opt
<std::string
>
82 InputFilename(cl::Positional
, cl::desc("<input bitcode file>"),
83 cl::init("-"), cl::value_desc("filename"));
85 static cl::opt
<std::string
>
86 OutputFilename("o", cl::desc("Override output filename"),
87 cl::value_desc("filename"));
90 Force("f", cl::desc("Enable binary output on terminals"));
93 PrintEachXForm("p", cl::desc("Print module after each transformation"));
96 NoOutput("disable-output",
97 cl::desc("Do not write result bitcode file"), cl::Hidden
);
100 OutputAssembly("S", cl::desc("Write output as LLVM assembly"));
103 OutputThinLTOBC("thinlto-bc",
104 cl::desc("Write output as ThinLTO-ready bitcode"));
106 static cl::opt
<std::string
> ThinLinkBitcodeFile(
107 "thin-link-bitcode-file", cl::value_desc("filename"),
109 "A file in which to write minimized bitcode for the thin link only"));
112 NoVerify("disable-verify", cl::desc("Do not run the verifier"), cl::Hidden
);
115 VerifyEach("verify-each", cl::desc("Verify after each transform"));
118 DisableDITypeMap("disable-debug-info-type-map",
119 cl::desc("Don't use a uniquing type map for debug info"));
122 StripDebug("strip-debug",
123 cl::desc("Strip debugger symbol info from translation unit"));
126 DisableInline("disable-inlining", cl::desc("Do not run the inliner pass"));
129 DisableOptimizations("disable-opt",
130 cl::desc("Do not run any optimization passes"));
133 StandardLinkOpts("std-link-opts",
134 cl::desc("Include the standard link time optimizations"));
138 cl::desc("Optimization level 0. Similar to clang -O0"));
142 cl::desc("Optimization level 1. Similar to clang -O1"));
146 cl::desc("Optimization level 2. Similar to clang -O2"));
150 cl::desc("Like -O2 with extra optimizations for size. Similar to clang -Os"));
154 cl::desc("Like -Os but reduces code size further. Similar to clang -Oz"));
158 cl::desc("Optimization level 3. Similar to clang -O3"));
160 static cl::opt
<unsigned>
161 CodeGenOptLevel("codegen-opt-level",
162 cl::desc("Override optimization level for codegen hooks"));
164 static cl::opt
<std::string
>
165 TargetTriple("mtriple", cl::desc("Override target triple for module"));
168 UnitAtATime("funit-at-a-time",
169 cl::desc("Enable IPO. This corresponds to gcc's -funit-at-a-time"),
173 DisableLoopUnrolling("disable-loop-unrolling",
174 cl::desc("Disable loop unrolling in all relevant passes"),
177 DisableLoopVectorization("disable-loop-vectorization",
178 cl::desc("Disable the loop vectorization pass"),
182 DisableSLPVectorization("disable-slp-vectorization",
183 cl::desc("Disable the slp vectorization pass"),
186 static cl::opt
<bool> EmitSummaryIndex("module-summary",
187 cl::desc("Emit module summary index"),
190 static cl::opt
<bool> EmitModuleHash("module-hash", cl::desc("Emit module hash"),
194 DisableSimplifyLibCalls("disable-simplify-libcalls",
195 cl::desc("Disable simplify-libcalls"));
198 Quiet("q", cl::desc("Obsolete option"), cl::Hidden
);
201 QuietA("quiet", cl::desc("Alias for -q"), cl::aliasopt(Quiet
));
204 AnalyzeOnly("analyze", cl::desc("Only perform analysis, no optimization"));
207 PrintBreakpoints("print-breakpoints-for-testing",
208 cl::desc("Print select breakpoints location for testing"));
210 static cl::opt
<std::string
> ClDataLayout("data-layout",
211 cl::desc("data layout string to use"),
212 cl::value_desc("layout-string"),
215 static cl::opt
<bool> PreserveBitcodeUseListOrder(
216 "preserve-bc-uselistorder",
217 cl::desc("Preserve use-list order when writing LLVM bitcode."),
218 cl::init(true), cl::Hidden
);
220 static cl::opt
<bool> PreserveAssemblyUseListOrder(
221 "preserve-ll-uselistorder",
222 cl::desc("Preserve use-list order when writing LLVM assembly."),
223 cl::init(false), cl::Hidden
);
226 RunTwice("run-twice",
227 cl::desc("Run all passes twice, re-using the same pass manager."),
228 cl::init(false), cl::Hidden
);
230 static cl::opt
<bool> DiscardValueNames(
231 "discard-value-names",
232 cl::desc("Discard names from Value (other than GlobalValue)."),
233 cl::init(false), cl::Hidden
);
235 static cl::opt
<bool> Coroutines(
237 cl::desc("Enable coroutine passes."),
238 cl::init(false), cl::Hidden
);
240 static cl::opt
<bool> PassRemarksWithHotness(
241 "pass-remarks-with-hotness",
242 cl::desc("With PGO, include profile count in optimization remarks"),
245 static cl::opt
<unsigned> PassRemarksHotnessThreshold(
246 "pass-remarks-hotness-threshold",
247 cl::desc("Minimum profile count required for an optimization remark to be output"),
250 static cl::opt
<std::string
>
251 RemarksFilename("pass-remarks-output",
252 cl::desc("YAML output filename for pass remarks"),
253 cl::value_desc("filename"));
255 static inline void addPass(legacy::PassManagerBase
&PM
, Pass
*P
) {
256 // Add the pass to the pass manager...
259 // If we are verifying all of the intermediate steps, add the verifier...
261 PM
.add(createVerifierPass());
264 /// This routine adds optimization passes based on selected optimization level,
267 /// OptLevel - Optimization Level
268 static void AddOptimizationPasses(legacy::PassManagerBase
&MPM
,
269 legacy::FunctionPassManager
&FPM
,
270 TargetMachine
*TM
, unsigned OptLevel
,
271 unsigned SizeLevel
) {
272 if (!NoVerify
|| VerifyEach
)
273 FPM
.add(createVerifierPass()); // Verify that input is correct
275 PassManagerBuilder Builder
;
276 Builder
.OptLevel
= OptLevel
;
277 Builder
.SizeLevel
= SizeLevel
;
281 } else if (OptLevel
> 1) {
282 Builder
.Inliner
= createFunctionInliningPass(OptLevel
, SizeLevel
, false);
284 Builder
.Inliner
= createAlwaysInlinerLegacyPass();
286 Builder
.DisableUnitAtATime
= !UnitAtATime
;
287 Builder
.DisableUnrollLoops
= (DisableLoopUnrolling
.getNumOccurrences() > 0) ?
288 DisableLoopUnrolling
: OptLevel
== 0;
290 // This is final, unless there is a #pragma vectorize enable
291 if (DisableLoopVectorization
)
292 Builder
.LoopVectorize
= false;
293 // If option wasn't forced via cmd line (-vectorize-loops, -loop-vectorize)
294 else if (!Builder
.LoopVectorize
)
295 Builder
.LoopVectorize
= OptLevel
> 1 && SizeLevel
< 2;
297 // When #pragma vectorize is on for SLP, do the same as above
298 Builder
.SLPVectorize
=
299 DisableSLPVectorization
? false : OptLevel
> 1 && SizeLevel
< 2;
302 TM
->adjustPassManager(Builder
);
305 addCoroutinePassesToExtensionPoints(Builder
);
307 Builder
.populateFunctionPassManager(FPM
);
308 Builder
.populateModulePassManager(MPM
);
311 static void AddStandardLinkPasses(legacy::PassManagerBase
&PM
) {
312 PassManagerBuilder Builder
;
313 Builder
.VerifyInput
= true;
314 if (DisableOptimizations
)
315 Builder
.OptLevel
= 0;
318 Builder
.Inliner
= createFunctionInliningPass();
319 Builder
.populateLTOPassManager(PM
);
322 //===----------------------------------------------------------------------===//
323 // CodeGen-related helper functions.
326 static CodeGenOpt::Level
GetCodeGenOptLevel() {
327 if (CodeGenOptLevel
.getNumOccurrences())
328 return static_cast<CodeGenOpt::Level
>(unsigned(CodeGenOptLevel
));
330 return CodeGenOpt::Less
;
332 return CodeGenOpt::Default
;
334 return CodeGenOpt::Aggressive
;
335 return CodeGenOpt::None
;
338 // Returns the TargetMachine instance or zero if no triple is provided.
339 static TargetMachine
* GetTargetMachine(Triple TheTriple
, StringRef CPUStr
,
340 StringRef FeaturesStr
,
341 const TargetOptions
&Options
) {
343 const Target
*TheTarget
= TargetRegistry::lookupTarget(MArch
, TheTriple
,
345 // Some modules don't specify a triple, and this is okay.
350 return TheTarget
->createTargetMachine(TheTriple
.getTriple(), CPUStr
,
351 FeaturesStr
, Options
, getRelocModel(),
352 getCodeModel(), GetCodeGenOptLevel());
355 #ifdef LINK_POLLY_INTO_TOOLS
357 void initializePollyPasses(llvm::PassRegistry
&Registry
);
361 //===----------------------------------------------------------------------===//
364 int main(int argc
, char **argv
) {
365 sys::PrintStackTraceOnErrorSignal(argv
[0]);
366 llvm::PrettyStackTraceProgram
X(argc
, argv
);
368 // Enable debug stream buffering.
369 EnableDebugBuffering
= true;
371 llvm_shutdown_obj Y
; // Call llvm_shutdown() on exit.
374 InitializeAllTargets();
375 InitializeAllTargetMCs();
376 InitializeAllAsmPrinters();
377 InitializeAllAsmParsers();
380 PassRegistry
&Registry
= *PassRegistry::getPassRegistry();
381 initializeCore(Registry
);
382 initializeCoroutines(Registry
);
383 initializeScalarOpts(Registry
);
384 initializeObjCARCOpts(Registry
);
385 initializeVectorization(Registry
);
386 initializeIPO(Registry
);
387 initializeAnalysis(Registry
);
388 initializeTransformUtils(Registry
);
389 initializeInstCombine(Registry
);
390 initializeInstrumentation(Registry
);
391 initializeTarget(Registry
);
392 // For codegen passes, only passes that do IR to IR transformation are
394 initializeScalarizeMaskedMemIntrinPass(Registry
);
395 initializeCodeGenPreparePass(Registry
);
396 initializeAtomicExpandPass(Registry
);
397 initializeRewriteSymbolsLegacyPassPass(Registry
);
398 initializeWinEHPreparePass(Registry
);
399 initializeDwarfEHPreparePass(Registry
);
400 initializeSafeStackLegacyPassPass(Registry
);
401 initializeSjLjEHPreparePass(Registry
);
402 initializePreISelIntrinsicLoweringLegacyPassPass(Registry
);
403 initializeGlobalMergePass(Registry
);
404 initializeInterleavedAccessPass(Registry
);
405 initializeCountingFunctionInserterPass(Registry
);
406 initializeUnreachableBlockElimLegacyPassPass(Registry
);
407 initializeExpandReductionsPass(Registry
);
409 #ifdef LINK_POLLY_INTO_TOOLS
410 polly::initializePollyPasses(Registry
);
413 cl::ParseCommandLineOptions(argc
, argv
,
414 "llvm .bc -> .bc modular optimizer and analysis printer\n");
416 if (AnalyzeOnly
&& NoOutput
) {
417 errs() << argv
[0] << ": analyze mode conflicts with no-output mode.\n";
423 Context
.setDiscardValueNames(DiscardValueNames
);
424 if (!DisableDITypeMap
)
425 Context
.enableDebugTypeODRUniquing();
427 if (PassRemarksWithHotness
)
428 Context
.setDiagnosticsHotnessRequested(true);
430 if (PassRemarksHotnessThreshold
)
431 Context
.setDiagnosticsHotnessThreshold(PassRemarksHotnessThreshold
);
433 std::unique_ptr
<tool_output_file
> OptRemarkFile
;
434 if (RemarksFilename
!= "") {
436 OptRemarkFile
= llvm::make_unique
<tool_output_file
>(RemarksFilename
, EC
,
439 errs() << EC
.message() << '\n';
442 Context
.setDiagnosticsOutputFile(
443 llvm::make_unique
<yaml::Output
>(OptRemarkFile
->os()));
446 // Load the input module...
447 std::unique_ptr
<Module
> M
= parseIRFile(InputFilename
, Err
, Context
);
450 Err
.print(argv
[0], errs());
454 // Strip debug info before running the verifier.
458 // Immediately run the verifier to catch any problems before starting up the
459 // pass pipelines. Otherwise we can crash on broken code during
460 // doInitialization().
461 if (!NoVerify
&& verifyModule(*M
, &errs())) {
462 errs() << argv
[0] << ": " << InputFilename
463 << ": error: input module is broken!\n";
467 // If we are supposed to override the target triple or data layout, do so now.
468 if (!TargetTriple
.empty())
469 M
->setTargetTriple(Triple::normalize(TargetTriple
));
470 if (!ClDataLayout
.empty())
471 M
->setDataLayout(ClDataLayout
);
473 // Figure out what stream we are supposed to write to...
474 std::unique_ptr
<tool_output_file
> Out
;
475 std::unique_ptr
<tool_output_file
> ThinLinkOut
;
477 if (!OutputFilename
.empty())
478 errs() << "WARNING: The -o (output filename) option is ignored when\n"
479 "the --disable-output option is used.\n";
481 // Default to standard output.
482 if (OutputFilename
.empty())
483 OutputFilename
= "-";
486 Out
.reset(new tool_output_file(OutputFilename
, EC
, sys::fs::F_None
));
488 errs() << EC
.message() << '\n';
492 if (!ThinLinkBitcodeFile
.empty()) {
494 new tool_output_file(ThinLinkBitcodeFile
, EC
, sys::fs::F_None
));
496 errs() << EC
.message() << '\n';
502 Triple
ModuleTriple(M
->getTargetTriple());
503 std::string CPUStr
, FeaturesStr
;
504 TargetMachine
*Machine
= nullptr;
505 const TargetOptions Options
= InitTargetOptionsFromCodeGenFlags();
507 if (ModuleTriple
.getArch()) {
508 CPUStr
= getCPUStr();
509 FeaturesStr
= getFeaturesStr();
510 Machine
= GetTargetMachine(ModuleTriple
, CPUStr
, FeaturesStr
, Options
);
513 std::unique_ptr
<TargetMachine
> TM(Machine
);
515 // Override function attributes based on CPUStr, FeaturesStr, and command line
517 setFunctionAttributes(CPUStr
, FeaturesStr
, *M
);
519 // If the output is set to be emitted to standard out, and standard out is a
520 // console, print out a warning message and refuse to do it. We don't
521 // impress anyone by spewing tons of binary goo to a terminal.
522 if (!Force
&& !NoOutput
&& !AnalyzeOnly
&& !OutputAssembly
)
523 if (CheckBitcodeOutputToConsole(Out
->os(), !Quiet
))
526 if (PassPipeline
.getNumOccurrences() > 0) {
527 OutputKind OK
= OK_NoOutput
;
531 : (OutputThinLTOBC
? OK_OutputThinLTOBitcode
: OK_OutputBitcode
);
533 VerifierKind VK
= VK_VerifyInAndOut
;
537 VK
= VK_VerifyEachPass
;
539 // The user has asked to use the new pass manager and provided a pipeline
540 // string. Hand off the rest of the functionality to the new code for that
542 return runPassPipeline(argv
[0], *M
, TM
.get(), Out
.get(), ThinLinkOut
.get(),
543 OptRemarkFile
.get(), PassPipeline
, OK
, VK
,
544 PreserveAssemblyUseListOrder
,
545 PreserveBitcodeUseListOrder
, EmitSummaryIndex
,
551 // Create a PassManager to hold and optimize the collection of passes we are
554 legacy::PassManager Passes
;
556 // Add an appropriate TargetLibraryInfo pass for the module's triple.
557 TargetLibraryInfoImpl
TLII(ModuleTriple
);
559 // The -disable-simplify-libcalls flag actually disables all builtin optzns.
560 if (DisableSimplifyLibCalls
)
561 TLII
.disableAllFunctions();
562 Passes
.add(new TargetLibraryInfoWrapperPass(TLII
));
564 // Add internal analysis passes from the target machine.
565 Passes
.add(createTargetTransformInfoWrapperPass(TM
? TM
->getTargetIRAnalysis()
566 : TargetIRAnalysis()));
568 std::unique_ptr
<legacy::FunctionPassManager
> FPasses
;
569 if (OptLevelO0
|| OptLevelO1
|| OptLevelO2
|| OptLevelOs
|| OptLevelOz
||
571 FPasses
.reset(new legacy::FunctionPassManager(M
.get()));
572 FPasses
->add(createTargetTransformInfoWrapperPass(
573 TM
? TM
->getTargetIRAnalysis() : TargetIRAnalysis()));
576 if (PrintBreakpoints
) {
577 // Default to standard output.
579 if (OutputFilename
.empty())
580 OutputFilename
= "-";
583 Out
= llvm::make_unique
<tool_output_file
>(OutputFilename
, EC
,
586 errs() << EC
.message() << '\n';
590 Passes
.add(createBreakpointPrinter(Out
->os()));
595 // FIXME: We should dyn_cast this when supported.
596 auto <M
= static_cast<LLVMTargetMachine
&>(*TM
);
597 Pass
*TPC
= LTM
.createPassConfig(Passes
);
601 // Create a new optimization pass for each one specified on the command line
602 for (unsigned i
= 0; i
< PassList
.size(); ++i
) {
603 if (StandardLinkOpts
&&
604 StandardLinkOpts
.getPosition() < PassList
.getPosition(i
)) {
605 AddStandardLinkPasses(Passes
);
606 StandardLinkOpts
= false;
609 if (OptLevelO0
&& OptLevelO0
.getPosition() < PassList
.getPosition(i
)) {
610 AddOptimizationPasses(Passes
, *FPasses
, TM
.get(), 0, 0);
614 if (OptLevelO1
&& OptLevelO1
.getPosition() < PassList
.getPosition(i
)) {
615 AddOptimizationPasses(Passes
, *FPasses
, TM
.get(), 1, 0);
619 if (OptLevelO2
&& OptLevelO2
.getPosition() < PassList
.getPosition(i
)) {
620 AddOptimizationPasses(Passes
, *FPasses
, TM
.get(), 2, 0);
624 if (OptLevelOs
&& OptLevelOs
.getPosition() < PassList
.getPosition(i
)) {
625 AddOptimizationPasses(Passes
, *FPasses
, TM
.get(), 2, 1);
629 if (OptLevelOz
&& OptLevelOz
.getPosition() < PassList
.getPosition(i
)) {
630 AddOptimizationPasses(Passes
, *FPasses
, TM
.get(), 2, 2);
634 if (OptLevelO3
&& OptLevelO3
.getPosition() < PassList
.getPosition(i
)) {
635 AddOptimizationPasses(Passes
, *FPasses
, TM
.get(), 3, 0);
639 const PassInfo
*PassInf
= PassList
[i
];
641 if (PassInf
->getNormalCtor())
642 P
= PassInf
->getNormalCtor()();
644 errs() << argv
[0] << ": cannot create pass: "
645 << PassInf
->getPassName() << "\n";
647 PassKind Kind
= P
->getPassKind();
653 Passes
.add(createBasicBlockPassPrinter(PassInf
, Out
->os(), Quiet
));
656 Passes
.add(createRegionPassPrinter(PassInf
, Out
->os(), Quiet
));
659 Passes
.add(createLoopPassPrinter(PassInf
, Out
->os(), Quiet
));
662 Passes
.add(createFunctionPassPrinter(PassInf
, Out
->os(), Quiet
));
664 case PT_CallGraphSCC
:
665 Passes
.add(createCallGraphPassPrinter(PassInf
, Out
->os(), Quiet
));
668 Passes
.add(createModulePassPrinter(PassInf
, Out
->os(), Quiet
));
676 createPrintModulePass(errs(), "", PreserveAssemblyUseListOrder
));
679 if (StandardLinkOpts
) {
680 AddStandardLinkPasses(Passes
);
681 StandardLinkOpts
= false;
685 AddOptimizationPasses(Passes
, *FPasses
, TM
.get(), 0, 0);
688 AddOptimizationPasses(Passes
, *FPasses
, TM
.get(), 1, 0);
691 AddOptimizationPasses(Passes
, *FPasses
, TM
.get(), 2, 0);
694 AddOptimizationPasses(Passes
, *FPasses
, TM
.get(), 2, 1);
697 AddOptimizationPasses(Passes
, *FPasses
, TM
.get(), 2, 2);
700 AddOptimizationPasses(Passes
, *FPasses
, TM
.get(), 3, 0);
703 FPasses
->doInitialization();
704 for (Function
&F
: *M
)
706 FPasses
->doFinalization();
709 // Check that the module is well formed on completion of optimization
710 if (!NoVerify
&& !VerifyEach
)
711 Passes
.add(createVerifierPass());
713 // In run twice mode, we want to make sure the output is bit-by-bit
714 // equivalent if we run the pass manager again, so setup two buffers and
715 // a stream to write to them. Note that llc does something similar and it
716 // may be worth to abstract this out in the future.
717 SmallVector
<char, 0> Buffer
;
718 SmallVector
<char, 0> CompileTwiceBuffer
;
719 std::unique_ptr
<raw_svector_ostream
> BOS
;
720 raw_ostream
*OS
= nullptr;
722 // Write bitcode or assembly to the output as the last step...
723 if (!NoOutput
&& !AnalyzeOnly
) {
727 BOS
= make_unique
<raw_svector_ostream
>(Buffer
);
730 if (OutputAssembly
) {
731 if (EmitSummaryIndex
)
732 report_fatal_error("Text output is incompatible with -module-summary");
734 report_fatal_error("Text output is incompatible with -module-hash");
735 Passes
.add(createPrintModulePass(*OS
, "", PreserveAssemblyUseListOrder
));
736 } else if (OutputThinLTOBC
)
737 Passes
.add(createWriteThinLTOBitcodePass(
738 *OS
, ThinLinkOut
? &ThinLinkOut
->os() : nullptr));
740 Passes
.add(createBitcodeWriterPass(*OS
, PreserveBitcodeUseListOrder
,
741 EmitSummaryIndex
, EmitModuleHash
));
744 // Before executing passes, print the final values of the LLVM options.
745 cl::PrintOptionValues();
747 // If requested, run all passes again with the same pass manager to catch
748 // bugs caused by persistent state in the passes
750 std::unique_ptr
<Module
> M2(CloneModule(M
.get()));
752 CompileTwiceBuffer
= Buffer
;
756 // Now that we have all of the passes ready, run them.
759 // Compare the two outputs and make sure they're the same
762 if (Buffer
.size() != CompileTwiceBuffer
.size() ||
763 (memcmp(Buffer
.data(), CompileTwiceBuffer
.data(), Buffer
.size()) !=
765 errs() << "Running the pass manager twice changed the output.\n"
766 "Writing the result of the second run to the specified output.\n"
767 "To generate the one-run comparison binary, just run without\n"
768 "the compile-twice option\n";
769 Out
->os() << BOS
->str();
772 OptRemarkFile
->keep();
775 Out
->os() << BOS
->str();
779 if (!NoOutput
|| PrintBreakpoints
)
783 OptRemarkFile
->keep();