forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Passes.html
2066 lines (1857 loc) · 77.5 KB
/
Passes.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>LLVM's Analysis and Transform Passes</title>
<link rel="stylesheet" href="_static/llvm.css" type="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<!--
If Passes.html is up to date, the following "one-liner" should print
an empty diff.
egrep -e '^<tr><td><a href="#.*">-.*</a></td><td>.*</td></tr>$' \
-e '^ <a name=".*">.*</a>$' < Passes.html >html; \
perl >help <<'EOT' && diff -u help html; rm -f help html
open HTML, "<Passes.html" or die "open: Passes.html: $!\n";
while (<HTML>) {
m:^<tr><td><a href="#(.*)">-.*</a></td><td>.*</td></tr>$: or next;
$order{$1} = sprintf("%03d", 1 + int %order);
}
open HELP, "../Release/bin/opt -help|" or die "open: opt -help: $!\n";
while (<HELP>) {
m:^ -([^ ]+) +- (.*)$: or next;
my $o = $order{$1};
$o = "000" unless defined $o;
push @x, "$o<tr><td><a href=\"#$1\">-$1</a></td><td>$2</td></tr>\n";
push @y, "$o <a name=\"$1\">-$1: $2</a>\n";
}
@x = map { s/^\d\d\d//; $_ } sort @x;
@y = map { s/^\d\d\d//; $_ } sort @y;
print @x, @y;
EOT
This (real) one-liner can also be helpful when converting comments to HTML:
perl -e '$/ = undef; for (split(/\n/, <>)) { s:^ *///? ?::; print " <p>\n" if !$on && $_ =~ /\S/; print " </p>\n" if $on && $_ =~ /^\s*$/; print " $_\n"; $on = ($_ =~ /\S/); } print " </p>\n" if $on'
-->
<h1>LLVM's Analysis and Transform Passes</h1>
<ol>
<li><a href="#intro">Introduction</a></li>
<li><a href="#analyses">Analysis Passes</a>
<li><a href="#transforms">Transform Passes</a></li>
<li><a href="#utilities">Utility Passes</a></li>
</ol>
<div class="doc_author">
<p>Written by <a href="mailto:[email protected]">Reid Spencer</a>
and Gordon Henriksen</p>
</div>
<!-- ======================================================================= -->
<h2><a name="intro">Introduction</a></h2>
<div>
<p>This document serves as a high level summary of the optimization features
that LLVM provides. Optimizations are implemented as Passes that traverse some
portion of a program to either collect information or transform the program.
The table below divides the passes that LLVM provides into three categories.
Analysis passes compute information that other passes can use or for debugging
or program visualization purposes. Transform passes can use (or invalidate)
the analysis passes. Transform passes all mutate the program in some way.
Utility passes provides some utility but don't otherwise fit categorization.
For example passes to extract functions to bitcode or write a module to
bitcode are neither analysis nor transform passes.
<p>The table below provides a quick summary of each pass and links to the more
complete pass description later in the document.</p>
<table>
<tr><th colspan="2"><b>ANALYSIS PASSES</b></th></tr>
<tr><th>Option</th><th>Name</th></tr>
<tr><td><a href="#aa-eval">-aa-eval</a></td><td>Exhaustive Alias Analysis Precision Evaluator</td></tr>
<tr><td><a href="#basicaa">-basicaa</a></td><td>Basic Alias Analysis (stateless AA impl)</td></tr>
<tr><td><a href="#basiccg">-basiccg</a></td><td>Basic CallGraph Construction</td></tr>
<tr><td><a href="#count-aa">-count-aa</a></td><td>Count Alias Analysis Query Responses</td></tr>
<tr><td><a href="#debug-aa">-debug-aa</a></td><td>AA use debugger</td></tr>
<tr><td><a href="#domfrontier">-domfrontier</a></td><td>Dominance Frontier Construction</td></tr>
<tr><td><a href="#domtree">-domtree</a></td><td>Dominator Tree Construction</td></tr>
<tr><td><a href="#dot-callgraph">-dot-callgraph</a></td><td>Print Call Graph to 'dot' file</td></tr>
<tr><td><a href="#dot-cfg">-dot-cfg</a></td><td>Print CFG of function to 'dot' file</td></tr>
<tr><td><a href="#dot-cfg-only">-dot-cfg-only</a></td><td>Print CFG of function to 'dot' file (with no function bodies)</td></tr>
<tr><td><a href="#dot-dom">-dot-dom</a></td><td>Print dominance tree of function to 'dot' file</td></tr>
<tr><td><a href="#dot-dom-only">-dot-dom-only</a></td><td>Print dominance tree of function to 'dot' file (with no function bodies)</td></tr>
<tr><td><a href="#dot-postdom">-dot-postdom</a></td><td>Print postdominance tree of function to 'dot' file</td></tr>
<tr><td><a href="#dot-postdom-only">-dot-postdom-only</a></td><td>Print postdominance tree of function to 'dot' file (with no function bodies)</td></tr>
<tr><td><a href="#globalsmodref-aa">-globalsmodref-aa</a></td><td>Simple mod/ref analysis for globals</td></tr>
<tr><td><a href="#instcount">-instcount</a></td><td>Counts the various types of Instructions</td></tr>
<tr><td><a href="#intervals">-intervals</a></td><td>Interval Partition Construction</td></tr>
<tr><td><a href="#iv-users">-iv-users</a></td><td>Induction Variable Users</td></tr>
<tr><td><a href="#lazy-value-info">-lazy-value-info</a></td><td>Lazy Value Information Analysis</td></tr>
<tr><td><a href="#lda">-lda</a></td><td>Loop Dependence Analysis</td></tr>
<tr><td><a href="#libcall-aa">-libcall-aa</a></td><td>LibCall Alias Analysis</td></tr>
<tr><td><a href="#lint">-lint</a></td><td>Statically lint-checks LLVM IR</td></tr>
<tr><td><a href="#loops">-loops</a></td><td>Natural Loop Information</td></tr>
<tr><td><a href="#memdep">-memdep</a></td><td>Memory Dependence Analysis</td></tr>
<tr><td><a href="#module-debuginfo">-module-debuginfo</a></td><td>Decodes module-level debug info</td></tr>
<tr><td><a href="#no-aa">-no-aa</a></td><td>No Alias Analysis (always returns 'may' alias)</td></tr>
<tr><td><a href="#no-profile">-no-profile</a></td><td>No Profile Information</td></tr>
<tr><td><a href="#postdomtree">-postdomtree</a></td><td>Post-Dominator Tree Construction</td></tr>
<tr><td><a href="#print-alias-sets">-print-alias-sets</a></td><td>Alias Set Printer</td></tr>
<tr><td><a href="#print-callgraph">-print-callgraph</a></td><td>Print a call graph</td></tr>
<tr><td><a href="#print-callgraph-sccs">-print-callgraph-sccs</a></td><td>Print SCCs of the Call Graph</td></tr>
<tr><td><a href="#print-cfg-sccs">-print-cfg-sccs</a></td><td>Print SCCs of each function CFG</td></tr>
<tr><td><a href="#print-dbginfo">-print-dbginfo</a></td><td>Print debug info in human readable form</td></tr>
<tr><td><a href="#print-dom-info">-print-dom-info</a></td><td>Dominator Info Printer</td></tr>
<tr><td><a href="#print-externalfnconstants">-print-externalfnconstants</a></td><td>Print external fn callsites passed constants</td></tr>
<tr><td><a href="#print-function">-print-function</a></td><td>Print function to stderr</td></tr>
<tr><td><a href="#print-module">-print-module</a></td><td>Print module to stderr</td></tr>
<tr><td><a href="#print-used-types">-print-used-types</a></td><td>Find Used Types</td></tr>
<tr><td><a href="#profile-estimator">-profile-estimator</a></td><td>Estimate profiling information</td></tr>
<tr><td><a href="#profile-loader">-profile-loader</a></td><td>Load profile information from llvmprof.out</td></tr>
<tr><td><a href="#profile-verifier">-profile-verifier</a></td><td>Verify profiling information</td></tr>
<tr><td><a href="#regions">-regions</a></td><td>Detect single entry single exit regions</td></tr>
<tr><td><a href="#scalar-evolution">-scalar-evolution</a></td><td>Scalar Evolution Analysis</td></tr>
<tr><td><a href="#scev-aa">-scev-aa</a></td><td>ScalarEvolution-based Alias Analysis</td></tr>
<tr><td><a href="#targetdata">-targetdata</a></td><td>Target Data Layout</td></tr>
<tr><th colspan="2"><b>TRANSFORM PASSES</b></th></tr>
<tr><th>Option</th><th>Name</th></tr>
<tr><td><a href="#adce">-adce</a></td><td>Aggressive Dead Code Elimination</td></tr>
<tr><td><a href="#always-inline">-always-inline</a></td><td>Inliner for always_inline functions</td></tr>
<tr><td><a href="#argpromotion">-argpromotion</a></td><td>Promote 'by reference' arguments to scalars</td></tr>
<tr><td><a href="#bb-vectorize">-bb-vectorize</a></td><td>Combine instructions to form vector instructions within basic blocks</td></tr>
<tr><td><a href="#block-placement">-block-placement</a></td><td>Profile Guided Basic Block Placement</td></tr>
<tr><td><a href="#break-crit-edges">-break-crit-edges</a></td><td>Break critical edges in CFG</td></tr>
<tr><td><a href="#codegenprepare">-codegenprepare</a></td><td>Optimize for code generation</td></tr>
<tr><td><a href="#constmerge">-constmerge</a></td><td>Merge Duplicate Global Constants</td></tr>
<tr><td><a href="#constprop">-constprop</a></td><td>Simple constant propagation</td></tr>
<tr><td><a href="#dce">-dce</a></td><td>Dead Code Elimination</td></tr>
<tr><td><a href="#deadargelim">-deadargelim</a></td><td>Dead Argument Elimination</td></tr>
<tr><td><a href="#deadtypeelim">-deadtypeelim</a></td><td>Dead Type Elimination</td></tr>
<tr><td><a href="#die">-die</a></td><td>Dead Instruction Elimination</td></tr>
<tr><td><a href="#dse">-dse</a></td><td>Dead Store Elimination</td></tr>
<tr><td><a href="#functionattrs">-functionattrs</a></td><td>Deduce function attributes</td></tr>
<tr><td><a href="#globaldce">-globaldce</a></td><td>Dead Global Elimination</td></tr>
<tr><td><a href="#globalopt">-globalopt</a></td><td>Global Variable Optimizer</td></tr>
<tr><td><a href="#gvn">-gvn</a></td><td>Global Value Numbering</td></tr>
<tr><td><a href="#indvars">-indvars</a></td><td>Canonicalize Induction Variables</td></tr>
<tr><td><a href="#inline">-inline</a></td><td>Function Integration/Inlining</td></tr>
<tr><td><a href="#insert-edge-profiling">-insert-edge-profiling</a></td><td>Insert instrumentation for edge profiling</td></tr>
<tr><td><a href="#insert-optimal-edge-profiling">-insert-optimal-edge-profiling</a></td><td>Insert optimal instrumentation for edge profiling</td></tr>
<tr><td><a href="#instcombine">-instcombine</a></td><td>Combine redundant instructions</td></tr>
<tr><td><a href="#internalize">-internalize</a></td><td>Internalize Global Symbols</td></tr>
<tr><td><a href="#ipconstprop">-ipconstprop</a></td><td>Interprocedural constant propagation</td></tr>
<tr><td><a href="#ipsccp">-ipsccp</a></td><td>Interprocedural Sparse Conditional Constant Propagation</td></tr>
<tr><td><a href="#jump-threading">-jump-threading</a></td><td>Jump Threading</td></tr>
<tr><td><a href="#lcssa">-lcssa</a></td><td>Loop-Closed SSA Form Pass</td></tr>
<tr><td><a href="#licm">-licm</a></td><td>Loop Invariant Code Motion</td></tr>
<tr><td><a href="#loop-deletion">-loop-deletion</a></td><td>Delete dead loops</td></tr>
<tr><td><a href="#loop-extract">-loop-extract</a></td><td>Extract loops into new functions</td></tr>
<tr><td><a href="#loop-extract-single">-loop-extract-single</a></td><td>Extract at most one loop into a new function</td></tr>
<tr><td><a href="#loop-reduce">-loop-reduce</a></td><td>Loop Strength Reduction</td></tr>
<tr><td><a href="#loop-rotate">-loop-rotate</a></td><td>Rotate Loops</td></tr>
<tr><td><a href="#loop-simplify">-loop-simplify</a></td><td>Canonicalize natural loops</td></tr>
<tr><td><a href="#loop-unroll">-loop-unroll</a></td><td>Unroll loops</td></tr>
<tr><td><a href="#loop-unswitch">-loop-unswitch</a></td><td>Unswitch loops</td></tr>
<tr><td><a href="#loweratomic">-loweratomic</a></td><td>Lower atomic intrinsics to non-atomic form</td></tr>
<tr><td><a href="#lowerinvoke">-lowerinvoke</a></td><td>Lower invoke and unwind, for unwindless code generators</td></tr>
<tr><td><a href="#lowerswitch">-lowerswitch</a></td><td>Lower SwitchInst's to branches</td></tr>
<tr><td><a href="#mem2reg">-mem2reg</a></td><td>Promote Memory to Register</td></tr>
<tr><td><a href="#memcpyopt">-memcpyopt</a></td><td>MemCpy Optimization</td></tr>
<tr><td><a href="#mergefunc">-mergefunc</a></td><td>Merge Functions</td></tr>
<tr><td><a href="#mergereturn">-mergereturn</a></td><td>Unify function exit nodes</td></tr>
<tr><td><a href="#partial-inliner">-partial-inliner</a></td><td>Partial Inliner</td></tr>
<tr><td><a href="#prune-eh">-prune-eh</a></td><td>Remove unused exception handling info</td></tr>
<tr><td><a href="#reassociate">-reassociate</a></td><td>Reassociate expressions</td></tr>
<tr><td><a href="#reg2mem">-reg2mem</a></td><td>Demote all values to stack slots</td></tr>
<tr><td><a href="#scalarrepl">-scalarrepl</a></td><td>Scalar Replacement of Aggregates (DT)</td></tr>
<tr><td><a href="#sccp">-sccp</a></td><td>Sparse Conditional Constant Propagation</td></tr>
<tr><td><a href="#simplify-libcalls">-simplify-libcalls</a></td><td>Simplify well-known library calls</td></tr>
<tr><td><a href="#simplifycfg">-simplifycfg</a></td><td>Simplify the CFG</td></tr>
<tr><td><a href="#sink">-sink</a></td><td>Code sinking</td></tr>
<tr><td><a href="#sretpromotion">-sretpromotion</a></td><td>Promote sret arguments to multiple ret values</td></tr>
<tr><td><a href="#strip">-strip</a></td><td>Strip all symbols from a module</td></tr>
<tr><td><a href="#strip-dead-debug-info">-strip-dead-debug-info</a></td><td>Strip debug info for unused symbols</td></tr>
<tr><td><a href="#strip-dead-prototypes">-strip-dead-prototypes</a></td><td>Strip Unused Function Prototypes</td></tr>
<tr><td><a href="#strip-debug-declare">-strip-debug-declare</a></td><td>Strip all llvm.dbg.declare intrinsics</td></tr>
<tr><td><a href="#strip-nondebug">-strip-nondebug</a></td><td>Strip all symbols, except dbg symbols, from a module</td></tr>
<tr><td><a href="#tailcallelim">-tailcallelim</a></td><td>Tail Call Elimination</td></tr>
<tr><td><a href="#tailduplicate">-tailduplicate</a></td><td>Tail Duplication</td></tr>
<tr><th colspan="2"><b>UTILITY PASSES</b></th></tr>
<tr><th>Option</th><th>Name</th></tr>
<tr><td><a href="#deadarghaX0r">-deadarghaX0r</a></td><td>Dead Argument Hacking (BUGPOINT USE ONLY; DO NOT USE)</td></tr>
<tr><td><a href="#extract-blocks">-extract-blocks</a></td><td>Extract Basic Blocks From Module (for bugpoint use)</td></tr>
<tr><td><a href="#instnamer">-instnamer</a></td><td>Assign names to anonymous instructions</td></tr>
<tr><td><a href="#preverify">-preverify</a></td><td>Preliminary module verification</td></tr>
<tr><td><a href="#verify">-verify</a></td><td>Module Verifier</td></tr>
<tr><td><a href="#view-cfg">-view-cfg</a></td><td>View CFG of function</td></tr>
<tr><td><a href="#view-cfg-only">-view-cfg-only</a></td><td>View CFG of function (with no function bodies)</td></tr>
<tr><td><a href="#view-dom">-view-dom</a></td><td>View dominance tree of function</td></tr>
<tr><td><a href="#view-dom-only">-view-dom-only</a></td><td>View dominance tree of function (with no function bodies)</td></tr>
<tr><td><a href="#view-postdom">-view-postdom</a></td><td>View postdominance tree of function</td></tr>
<tr><td><a href="#view-postdom-only">-view-postdom-only</a></td><td>View postdominance tree of function (with no function bodies)</td></tr>
</table>
</div>
<!-- ======================================================================= -->
<h2><a name="analyses">Analysis Passes</a></h2>
<div>
<p>This section describes the LLVM Analysis Passes.</p>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="aa-eval">-aa-eval: Exhaustive Alias Analysis Precision Evaluator</a>
</h3>
<div>
<p>This is a simple N^2 alias analysis accuracy evaluator.
Basically, for each function in the program, it simply queries to see how the
alias analysis implementation answers alias queries between each pair of
pointers in the function.</p>
<p>This is inspired and adapted from code by: Naveen Neelakantam, Francesco
Spadini, and Wojciech Stryjewski.</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="basicaa">-basicaa: Basic Alias Analysis (stateless AA impl)</a>
</h3>
<div>
<p>A basic alias analysis pass that implements identities (two different
globals cannot alias, etc), but does no stateful analysis.</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="basiccg">-basiccg: Basic CallGraph Construction</a>
</h3>
<div>
<p>Yet to be written.</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="count-aa">-count-aa: Count Alias Analysis Query Responses</a>
</h3>
<div>
<p>
A pass which can be used to count how many alias queries
are being made and how the alias analysis implementation being used responds.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="debug-aa">-debug-aa: AA use debugger</a>
</h3>
<div>
<p>
This simple pass checks alias analysis users to ensure that if they
create a new value, they do not query AA without informing it of the value.
It acts as a shim over any other AA pass you want.
</p>
<p>
Yes keeping track of every value in the program is expensive, but this is
a debugging pass.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="domfrontier">-domfrontier: Dominance Frontier Construction</a>
</h3>
<div>
<p>
This pass is a simple dominator construction algorithm for finding forward
dominator frontiers.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="domtree">-domtree: Dominator Tree Construction</a>
</h3>
<div>
<p>
This pass is a simple dominator construction algorithm for finding forward
dominators.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="dot-callgraph">-dot-callgraph: Print Call Graph to 'dot' file</a>
</h3>
<div>
<p>
This pass, only available in <code>opt</code>, prints the call graph into a
<code>.dot</code> graph. This graph can then be processed with the "dot" tool
to convert it to postscript or some other suitable format.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="dot-cfg">-dot-cfg: Print CFG of function to 'dot' file</a>
</h3>
<div>
<p>
This pass, only available in <code>opt</code>, prints the control flow graph
into a <code>.dot</code> graph. This graph can then be processed with the
"dot" tool to convert it to postscript or some other suitable format.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="dot-cfg-only">-dot-cfg-only: Print CFG of function to 'dot' file (with no function bodies)</a>
</h3>
<div>
<p>
This pass, only available in <code>opt</code>, prints the control flow graph
into a <code>.dot</code> graph, omitting the function bodies. This graph can
then be processed with the "dot" tool to convert it to postscript or some
other suitable format.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="dot-dom">-dot-dom: Print dominance tree of function to 'dot' file</a>
</h3>
<div>
<p>
This pass, only available in <code>opt</code>, prints the dominator tree
into a <code>.dot</code> graph. This graph can then be processed with the
"dot" tool to convert it to postscript or some other suitable format.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="dot-dom-only">-dot-dom-only: Print dominance tree of function to 'dot' file (with no function bodies)</a>
</h3>
<div>
<p>
This pass, only available in <code>opt</code>, prints the dominator tree
into a <code>.dot</code> graph, omitting the function bodies. This graph can
then be processed with the "dot" tool to convert it to postscript or some
other suitable format.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="dot-postdom">-dot-postdom: Print postdominance tree of function to 'dot' file</a>
</h3>
<div>
<p>
This pass, only available in <code>opt</code>, prints the post dominator tree
into a <code>.dot</code> graph. This graph can then be processed with the
"dot" tool to convert it to postscript or some other suitable format.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="dot-postdom-only">-dot-postdom-only: Print postdominance tree of function to 'dot' file (with no function bodies)</a>
</h3>
<div>
<p>
This pass, only available in <code>opt</code>, prints the post dominator tree
into a <code>.dot</code> graph, omitting the function bodies. This graph can
then be processed with the "dot" tool to convert it to postscript or some
other suitable format.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="globalsmodref-aa">-globalsmodref-aa: Simple mod/ref analysis for globals</a>
</h3>
<div>
<p>
This simple pass provides alias and mod/ref information for global values
that do not have their address taken, and keeps track of whether functions
read or write memory (are "pure"). For this simple (but very common) case,
we can provide pretty accurate and useful information.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="instcount">-instcount: Counts the various types of Instructions</a>
</h3>
<div>
<p>
This pass collects the count of all instructions and reports them
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="intervals">-intervals: Interval Partition Construction</a>
</h3>
<div>
<p>
This analysis calculates and represents the interval partition of a function,
or a preexisting interval partition.
</p>
<p>
In this way, the interval partition may be used to reduce a flow graph down
to its degenerate single node interval partition (unless it is irreducible).
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="iv-users">-iv-users: Induction Variable Users</a>
</h3>
<div>
<p>Bookkeeping for "interesting" users of expressions computed from
induction variables.</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="lazy-value-info">-lazy-value-info: Lazy Value Information Analysis</a>
</h3>
<div>
<p>Interface for lazy computation of value constraint information.</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="lda">-lda: Loop Dependence Analysis</a>
</h3>
<div>
<p>Loop dependence analysis framework, which is used to detect dependences in
memory accesses in loops.</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="libcall-aa">-libcall-aa: LibCall Alias Analysis</a>
</h3>
<div>
<p>LibCall Alias Analysis.</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="lint">-lint: Statically lint-checks LLVM IR</a>
</h3>
<div>
<p>This pass statically checks for common and easily-identified constructs
which produce undefined or likely unintended behavior in LLVM IR.</p>
<p>It is not a guarantee of correctness, in two ways. First, it isn't
comprehensive. There are checks which could be done statically which are
not yet implemented. Some of these are indicated by TODO comments, but
those aren't comprehensive either. Second, many conditions cannot be
checked statically. This pass does no dynamic instrumentation, so it
can't check for all possible problems.</p>
<p>Another limitation is that it assumes all code will be executed. A store
through a null pointer in a basic block which is never reached is harmless,
but this pass will warn about it anyway.</p>
<p>Optimization passes may make conditions that this pass checks for more or
less obvious. If an optimization pass appears to be introducing a warning,
it may be that the optimization pass is merely exposing an existing
condition in the code.</p>
<p>This code may be run before instcombine. In many cases, instcombine checks
for the same kinds of things and turns instructions with undefined behavior
into unreachable (or equivalent). Because of this, this pass makes some
effort to look through bitcasts and so on.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="loops">-loops: Natural Loop Information</a>
</h3>
<div>
<p>
This analysis is used to identify natural loops and determine the loop depth
of various nodes of the CFG. Note that the loops identified may actually be
several natural loops that share the same header node... not just a single
natural loop.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="memdep">-memdep: Memory Dependence Analysis</a>
</h3>
<div>
<p>
An analysis that determines, for a given memory operation, what preceding
memory operations it depends on. It builds on alias analysis information, and
tries to provide a lazy, caching interface to a common kind of alias
information query.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="module-debuginfo">-module-debuginfo: Decodes module-level debug info</a>
</h3>
<div>
<p>This pass decodes the debug info metadata in a module and prints in a
(sufficiently-prepared-) human-readable form.
For example, run this pass from opt along with the -analyze option, and
it'll print to standard output.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="no-aa">-no-aa: No Alias Analysis (always returns 'may' alias)</a>
</h3>
<div>
<p>
This is the default implementation of the Alias Analysis interface. It always
returns "I don't know" for alias queries. NoAA is unlike other alias analysis
implementations, in that it does not chain to a previous analysis. As such it
doesn't follow many of the rules that other alias analyses must.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="no-profile">-no-profile: No Profile Information</a>
</h3>
<div>
<p>
The default "no profile" implementation of the abstract
<code>ProfileInfo</code> interface.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="postdomfrontier">-postdomfrontier: Post-Dominance Frontier Construction</a>
</h3>
<div>
<p>
This pass is a simple post-dominator construction algorithm for finding
post-dominator frontiers.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="postdomtree">-postdomtree: Post-Dominator Tree Construction</a>
</h3>
<div>
<p>
This pass is a simple post-dominator construction algorithm for finding
post-dominators.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="print-alias-sets">-print-alias-sets: Alias Set Printer</a>
</h3>
<div>
<p>Yet to be written.</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="print-callgraph">-print-callgraph: Print a call graph</a>
</h3>
<div>
<p>
This pass, only available in <code>opt</code>, prints the call graph to
standard error in a human-readable form.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="print-callgraph-sccs">-print-callgraph-sccs: Print SCCs of the Call Graph</a>
</h3>
<div>
<p>
This pass, only available in <code>opt</code>, prints the SCCs of the call
graph to standard error in a human-readable form.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="print-cfg-sccs">-print-cfg-sccs: Print SCCs of each function CFG</a>
</h3>
<div>
<p>
This pass, only available in <code>opt</code>, prints the SCCs of each
function CFG to standard error in a human-readable form.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="print-dbginfo">-print-dbginfo: Print debug info in human readable form</a>
</h3>
<div>
<p>Pass that prints instructions, and associated debug info:</p>
<ul>
<li>source/line/col information</li>
<li>original variable name</li>
<li>original type name</li>
</ul>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="print-dom-info">-print-dom-info: Dominator Info Printer</a>
</h3>
<div>
<p>Dominator Info Printer.</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="print-externalfnconstants">-print-externalfnconstants: Print external fn callsites passed constants</a>
</h3>
<div>
<p>
This pass, only available in <code>opt</code>, prints out call sites to
external functions that are called with constant arguments. This can be
useful when looking for standard library functions we should constant fold
or handle in alias analyses.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="print-function">-print-function: Print function to stderr</a>
</h3>
<div>
<p>
The <code>PrintFunctionPass</code> class is designed to be pipelined with
other <code>FunctionPass</code>es, and prints out the functions of the module
as they are processed.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="print-module">-print-module: Print module to stderr</a>
</h3>
<div>
<p>
This pass simply prints out the entire module when it is executed.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="print-used-types">-print-used-types: Find Used Types</a>
</h3>
<div>
<p>
This pass is used to seek out all of the types in use by the program. Note
that this analysis explicitly does not include types only used by the symbol
table.
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="profile-estimator">-profile-estimator: Estimate profiling information</a>
</h3>
<div>
<p>Profiling information that estimates the profiling information
in a very crude and unimaginative way.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="profile-loader">-profile-loader: Load profile information from llvmprof.out</a>
</h3>
<div>
<p>
A concrete implementation of profiling information that loads the information
from a profile dump file.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="profile-verifier">-profile-verifier: Verify profiling information</a>
</h3>
<div>
<p>Pass that checks profiling information for plausibility.</p>
</div>
<h3>
<a name="regions">-regions: Detect single entry single exit regions</a>
</h3>
<div>
<p>
The <code>RegionInfo</code> pass detects single entry single exit regions in a
function, where a region is defined as any subgraph that is connected to the
remaining graph at only two spots. Furthermore, an hierarchical region tree is
built.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="scalar-evolution">-scalar-evolution: Scalar Evolution Analysis</a>
</h3>
<div>
<p>
The <code>ScalarEvolution</code> analysis can be used to analyze and
catagorize scalar expressions in loops. It specializes in recognizing general
induction variables, representing them with the abstract and opaque
<code>SCEV</code> class. Given this analysis, trip counts of loops and other
important properties can be obtained.
</p>
<p>
This analysis is primarily useful for induction variable substitution and
strength reduction.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="scev-aa">-scev-aa: ScalarEvolution-based Alias Analysis</a>
</h3>
<div>
<p>Simple alias analysis implemented in terms of ScalarEvolution queries.
This differs from traditional loop dependence analysis in that it tests
for dependencies within a single iteration of a loop, rather than
dependencies between different iterations.
ScalarEvolution has a more complete understanding of pointer arithmetic
than BasicAliasAnalysis' collection of ad-hoc analyses.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="targetdata">-targetdata: Target Data Layout</a>
</h3>
<div>
<p>Provides other passes access to information on how the size and alignment
required by the target ABI for various data types.</p>
</div>
</div>
<!-- ======================================================================= -->
<h2><a name="transforms">Transform Passes</a></h2>
<div>
<p>This section describes the LLVM Transform Passes.</p>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="adce">-adce: Aggressive Dead Code Elimination</a>
</h3>
<div>
<p>ADCE aggressively tries to eliminate code. This pass is similar to
<a href="#dce">DCE</a> but it assumes that values are dead until proven
otherwise. This is similar to <a href="#sccp">SCCP</a>, except applied to
the liveness of values.</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="always-inline">-always-inline: Inliner for always_inline functions</a>
</h3>
<div>
<p>A custom inliner that handles only functions that are marked as
"always inline".</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="argpromotion">-argpromotion: Promote 'by reference' arguments to scalars</a>
</h3>
<div>
<p>
This pass promotes "by reference" arguments to be "by value" arguments. In
practice, this means looking for internal functions that have pointer
arguments. If it can prove, through the use of alias analysis, that an
argument is *only* loaded, then it can pass the value into the function
instead of the address of the value. This can cause recursive simplification
of code and lead to the elimination of allocas (especially in C++ template
code like the STL).
</p>
<p>
This pass also handles aggregate arguments that are passed into a function,
scalarizing them if the elements of the aggregate are only loaded. Note that
it refuses to scalarize aggregates which would require passing in more than
three operands to the function, because passing thousands of operands for a
large array or structure is unprofitable!
</p>
<p>
Note that this transformation could also be done for arguments that are only
stored to (returning the value instead), but does not currently. This case
would be best handled when and if LLVM starts supporting multiple return
values from functions.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="bb-vectorize">-bb-vectorize: Basic-Block Vectorization</a>
</h3>
<div>
<p>This pass combines instructions inside basic blocks to form vector
instructions. It iterates over each basic block, attempting to pair
compatible instructions, repeating this process until no additional
pairs are selected for vectorization. When the outputs of some pair
of compatible instructions are used as inputs by some other pair of
compatible instructions, those pairs are part of a potential
vectorization chain. Instruction pairs are only fused into vector
instructions when they are part of a chain longer than some
threshold length. Moreover, the pass attempts to find the best
possible chain for each pair of compatible instructions. These
heuristics are intended to prevent vectorization in cases where
it would not yield a performance increase of the resulting code.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="block-placement">-block-placement: Profile Guided Basic Block Placement</a>
</h3>
<div>
<p>This pass is a very simple profile guided basic block placement algorithm.
The idea is to put frequently executed blocks together at the start of the
function and hopefully increase the number of fall-through conditional
branches. If there is no profile information for a particular function, this
pass basically orders blocks in depth-first order.</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="break-crit-edges">-break-crit-edges: Break critical edges in CFG</a>
</h3>
<div>
<p>
Break all of the critical edges in the CFG by inserting a dummy basic block.
It may be "required" by passes that cannot deal with critical edges. This
transformation obviously invalidates the CFG, but can update forward dominator
(set, immediate dominators, tree, and frontier) information.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="codegenprepare">-codegenprepare: Optimize for code generation</a>
</h3>
<div>
This pass munges the code in the input function to better prepare it for
SelectionDAG-based code generation. This works around limitations in it's
basic-block-at-a-time approach. It should eventually be removed.
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="constmerge">-constmerge: Merge Duplicate Global Constants</a>
</h3>
<div>
<p>
Merges duplicate global constants together into a single constant that is
shared. This is useful because some passes (ie TraceValues) insert a lot of
string constants into the program, regardless of whether or not an existing
string is available.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="constprop">-constprop: Simple constant propagation</a>
</h3>
<div>
<p>This file implements constant propagation and merging. It looks for
instructions involving only constant operands and replaces them with a
constant value instead of an instruction. For example:</p>
<blockquote><pre>add i32 1, 2</pre></blockquote>
<p>becomes</p>
<blockquote><pre>i32 3</pre></blockquote>
<p>NOTE: this pass has a habit of making definitions be dead. It is a good
idea to to run a <a href="#die">DIE</a> (Dead Instruction Elimination) pass
sometime after running this pass.</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="dce">-dce: Dead Code Elimination</a>
</h3>
<div>
<p>
Dead code elimination is similar to <a href="#die">dead instruction
elimination</a>, but it rechecks instructions that were used by removed
instructions to see if they are newly dead.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="deadargelim">-deadargelim: Dead Argument Elimination</a>
</h3>
<div>
<p>
This pass deletes dead arguments from internal functions. Dead argument
elimination removes arguments which are directly dead, as well as arguments
only passed into function calls as dead arguments of other functions. This
pass also deletes dead arguments in a similar way.
</p>
<p>
This pass is often useful as a cleanup pass to run after aggressive
interprocedural passes, which add possibly-dead arguments.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="deadtypeelim">-deadtypeelim: Dead Type Elimination</a>
</h3>
<div>
<p>
This pass is used to cleanup the output of GCC. It eliminate names for types
that are unused in the entire translation unit, using the <a
href="#findusedtypes">find used types</a> pass.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="die">-die: Dead Instruction Elimination</a>
</h3>
<div>
<p>
Dead instruction elimination performs a single pass over the function,
removing instructions that are obviously dead.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="dse">-dse: Dead Store Elimination</a>
</h3>
<div>
<p>
A trivial dead store elimination that only considers basic-block local
redundant stores.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="functionattrs">-functionattrs: Deduce function attributes</a>
</h3>
<div>
<p>A simple interprocedural pass which walks the call-graph, looking for
functions which do not access or only read non-local memory, and marking them
readnone/readonly. In addition, it marks function arguments (of pointer type)
'nocapture' if a call to the function does not create any copies of the pointer
value that outlive the call. This more or less means that the pointer is only
dereferenced, and not returned from the function or stored in a global.
This pass is implemented as a bottom-up traversal of the call-graph.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="globaldce">-globaldce: Dead Global Elimination</a>
</h3>
<div>
<p>
This transform is designed to eliminate unreachable internal globals from the
program. It uses an aggressive algorithm, searching out globals that are
known to be alive. After it finds all of the globals which are needed, it
deletes whatever is left over. This allows it to delete recursive chunks of
the program which are unreachable.
</p>
</div>
<!-------------------------------------------------------------------------- -->
<h3>
<a name="globalopt">-globalopt: Global Variable Optimizer</a>
</h3>
<div>
<p>