Hal Finkel 989b264cc2 [llvm-opt-report] Distinguish inlined contexts when optimizations differ
How code is optimized sometimes, perhaps often, depends on the context into
which it was inlined. This change allows llvm-opt-report to track the
differences between the optimizations performed, or not, in different contexts,
and when these differ, display those differences.

For example, this code:

  $ cat /tmp/q.cpp
  void bar();
  void foo(int n) {
    for (int i = 0; i < n; ++i)
      bar();
  }

  void quack() {
    foo(4);
  }

  void quack2() {
    foo(4);
  }

will now produce this report:

  < /home/hfinkel/src/llvm/test/tools/llvm-opt-report/Inputs/q.cpp
   2         | void bar();
   3         | void foo(int n) {
   [[
    > foo(int):
   4         |   for (int i = 0; i < n; ++i)
    > quack(), quack2():
   4  U4     |   for (int i = 0; i < n; ++i)
   ]]
   5         |     bar();
   6         | }
   7         |
   8         | void quack() {
   9 I       |   foo(4);
  10         | }
  11         |
  12         | void quack2() {
  13 I       |   foo(4);
  14         | }
  15         |

Note that the tool has demangled the function names, and grouped the reports
associated with line 4. This shows that the loop on line 4 was unrolled by a
factor of 4 when inlined into the functions quack() and quack2(), but not in
the function foo(int) itself.

llvm-svn: 283402
2016-10-05 22:25:33 +00:00

50 lines
2.0 KiB
Plaintext

RUN: llvm-opt-report -r %p %p/Inputs/q2.yaml | FileCheck -strict-whitespace %s
RUN: llvm-opt-report -s -r %p %p/Inputs/q2.yaml | FileCheck -strict-whitespace -check-prefix=CHECK-SUCCINCT %s
; CHECK: < {{.*}}/Inputs/q2.c
; CHECK-NEXT: 2 | void bar();
; CHECK-NEXT: 3 | void foo(int n) {
; CHECK-NEXT: {{\[\[}}
; CHECK-NEXT: > quack, quack2:
; CHECK-NEXT: 4 | for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j)
; CHECK-NEXT: U4 | ^
; CHECK-NEXT: U4 | ^
; CHECK-NEXT: > foo:
; CHECK-NEXT: 4 | for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j)
; CHECK-NEXT: {{\]\]}}
; CHECK-NEXT: 5 | bar();
; CHECK-NEXT: 6 | }
; CHECK-NEXT: 7 |
; CHECK-NEXT: 8 | void quack() {
; CHECK-NEXT: 9 I | foo(4);
; CHECK-NEXT: 10 | }
; CHECK-NEXT: 11 |
; CHECK-NEXT: 12 | void quack2() {
; CHECK-NEXT: 13 I | foo(4);
; CHECK-NEXT: 14 | }
; CHECK-NEXT: 15 |
; CHECK-SUCCINCT: < {{.*}}/Inputs/q2.c
; CHECK-SUCCINCT-NEXT: 2 | void bar();
; CHECK-SUCCINCT-NEXT: 3 | void foo(int n) {
; CHECK-SUCCINCT-NEXT: {{\[\[}}
; CHECK-SUCCINCT-NEXT: > quack, quack2:
; CHECK-SUCCINCT-NEXT: 4 | for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j)
; CHECK-SUCCINCT-NEXT: U | ^
; CHECK-SUCCINCT-NEXT: U | ^
; CHECK-SUCCINCT-NEXT: > foo:
; CHECK-SUCCINCT-NEXT: 4 | for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j)
; CHECK-SUCCINCT-NEXT: {{\]\]}}
; CHECK-SUCCINCT-NEXT: 5 | bar();
; CHECK-SUCCINCT-NEXT: 6 | }
; CHECK-SUCCINCT-NEXT: 7 |
; CHECK-SUCCINCT-NEXT: 8 | void quack() {
; CHECK-SUCCINCT-NEXT: 9 I | foo(4);
; CHECK-SUCCINCT-NEXT: 10 | }
; CHECK-SUCCINCT-NEXT: 11 |
; CHECK-SUCCINCT-NEXT: 12 | void quack2() {
; CHECK-SUCCINCT-NEXT: 13 I | foo(4);
; CHECK-SUCCINCT-NEXT: 14 | }
; CHECK-SUCCINCT-NEXT: 15 |