Home | History | Annotate | Download | only in Other
      1 ; Ensure that IR count remarks in the legacy pass manager work.
      2 ; What this test should check for:
      3 ; * Positive, nonzero sizes before/after
      4 ; * Nonzero deltas
      5 ; * Sizes are being tracked properly across multiple remarks. E.g, if we have
      6 ;     original_count_1, final_count_1, and
      7 ;     original_count_2, final_count_2,
      8 ;  Then original_count_2 == final_count_1.
      9 
     10 ; For these remarks, the "function" field in the YAML file doesn't matter.
     11 ; Each of the testcases work by combining the output remarks with the
     12 ; optimization record emit using -pass-remarks-output. This is done to prevent
     13 ; test flakiness wrt instruction counts, but also ensure that the output values
     14 ; are equivalent in both outputs.
     15 
     16 ; RUN: opt < %s -inline -pass-remarks-analysis='size-info' \
     17 ; RUN: -pass-remarks-output=%t.yaml -S -o /dev/null 2> %t; \
     18 ; RUN: cat %t %t.yaml | FileCheck %s -check-prefix=CGSCC
     19 ; CGSCC: remark: <unknown>:0:0: Function Integration/Inlining:
     20 ; CGSCC-SAME: IR instruction count changed from
     21 ; CGSCC-SAME: [[ORIG:[1-9][0-9]*]] to [[FINAL:[1-9][0-9]*]];
     22 ; CGSCC-SAME: Delta: [[DELTA:-?[1-9][0-9]*]]
     23 ; CGSCC: --- !Analysis
     24 ; CGSCC-NEXT: Pass:            size-info
     25 ; CGSCC-NEXT: Name:            IRSizeChange
     26 ; CGSCC-NEXT: Function:
     27 ; CGSCC-NEXT: Args:            
     28 ; CGSCC-NEXT:  - Pass:            Function Integration/Inlining
     29 ; CGSCC-NEXT:  - String:          ': IR instruction count changed from '
     30 ; CGSCC-NEXT:  - IRInstrsBefore:  '[[ORIG]]'
     31 ; CGSCC-NEXT:  - String:          ' to '
     32 ; CGSCC-NEXT:  - IRInstrsAfter:   '[[FINAL]]'
     33 ; CGSCC-NEXT:  - String:          '; Delta: '
     34 ; CGSCC-NEXT:  - DeltaInstrCount: '[[DELTA]]'
     35 
     36 ; RUN: opt < %s -instcombine -pass-remarks-analysis='size-info' \
     37 ; RUN:-pass-remarks-output=%t.yaml -S -o /dev/null 2> %t; \
     38 ; RUN: cat %t %t.yaml | FileCheck %s -check-prefix=FUNC
     39 ; FUNC: remark: <unknown>:0:0: Combine redundant instructions:
     40 ; FUNC-SAME: IR instruction count changed from
     41 ; FUNC-SAME: [[SIZE1:[1-9][0-9]*]] to [[SIZE2:[1-9][0-9]*]];
     42 ; FUNC-SAME: Delta: [[DELTA1:-?[1-9][0-9]*]]
     43 ; FUNC-NEXT: remark: <unknown>:0:0: Combine redundant instructions:
     44 ; FUNC-SAME: IR instruction count changed from
     45 ; FUNC-SAME: [[SIZE2]] to [[SIZE3:[1-9][0-9]*]];
     46 ; FUNC-SAME: Delta: [[DELTA2:-?[1-9][0-9]*]]
     47 ; FUNC: --- !Analysis
     48 ; FUNC-NEXT: Pass:            size-info
     49 ; FUNC-NEXT: Name:            IRSizeChange
     50 ; FUNC-NEXT: Function:
     51 ; FUNC-NEXT: Args:            
     52 ; FUNC-NEXT:  - Pass:            Combine redundant instructions
     53 ; FUNC-NEXT:  - String:          ': IR instruction count changed from '
     54 ; FUNC-NEXT:  - IRInstrsBefore:  '[[SIZE1]]'
     55 ; FUNC-NEXT:  - String:          ' to '
     56 ; FUNC-NEXT:  - IRInstrsAfter:   '[[SIZE2]]'
     57 ; FUNC-NEXT:  - String:          '; Delta: '
     58 ; FUNC-NEXT:  - DeltaInstrCount: '[[DELTA1]]'
     59 ; FUNC: --- !Analysis
     60 ; FUNC-NEXT: Pass:            size-info
     61 ; FUNC-NEXT: Name:            IRSizeChange
     62 ; FUNC-NEXT: Function:
     63 ; FUNC-NEXT: Args:            
     64 ; FUNC-NEXT:   - Pass:            Combine redundant instructions
     65 ; FUNC-NEXT:   - String:          ': IR instruction count changed from '
     66 ; FUNC-NEXT:   - IRInstrsBefore:  '[[SIZE2]]'
     67 ; FUNC-NEXT:   - String:          ' to '
     68 ; FUNC-NEXT:   - IRInstrsAfter:   '[[SIZE3]]'
     69 ; FUNC-NEXT:   - String:          '; Delta: '
     70 ; FUNC-NEXT:   - DeltaInstrCount: '[[DELTA2]]'
     71 
     72 ; RUN: opt < %s -globaldce -pass-remarks-analysis='size-info' \
     73 ; RUN: -pass-remarks-output=%t.yaml -S -o /dev/null 2> %t; \
     74 ; RUN: cat %t %t.yaml | FileCheck %s -check-prefix=MODULE
     75 ; MODULE: remark:
     76 ; MODULE-SAME: Dead Global Elimination:
     77 ; MODULE-SAME: IR instruction count changed from
     78 ; MODULE-SAME: [[ORIG:[1-9][0-9]*]] to [[FINAL:[1-9][0-9]*]];
     79 ; MODULE-SAME: Delta: [[DELTA:-?[1-9][0-9]*]]
     80 ; MODULE: --- !Analysis
     81 ; MODULE-NEXT: Pass:            size-info
     82 ; MODULE-NEXT: Name:            IRSizeChange
     83 ; MODULE-NEXT: Function:
     84 ; MODULE-NEXT: Args:            
     85 ; MODULE-NEXT:   - Pass:            Dead Global Elimination
     86 ; MODULE-NEXT:   - String:          ': IR instruction count changed from '
     87 ; MODULE-NEXT:   - IRInstrsBefore:  '[[ORIG]]'
     88 ; MODULE-NEXT:   - String:          ' to '
     89 ; MODULE-NEXT:   - IRInstrsAfter:   '[[FINAL]]'
     90 ; MODULE-NEXT:   - String:          '; Delta: '
     91 ; MODULE-NEXT:   - DeltaInstrCount: '[[DELTA]]'
     92 
     93 ; RUN: opt < %s -dce -pass-remarks-analysis='size-info' \
     94 ; RUN: -pass-remarks-output=%t.yaml -S -o /dev/null 2> %t; \
     95 ; RUN: cat %t %t.yaml | FileCheck %s -check-prefix=BB
     96 ; BB: remark: <unknown>:0:0: Dead Code Elimination:
     97 ; BB-SAME: IR instruction count changed from
     98 ; BB-SAME: [[ORIG:[1-9][0-9]*]] to [[FINAL:[1-9][0-9]*]];
     99 ; BB-SAME: Delta: [[DELTA:-?[1-9][0-9]*]]
    100 ; BB: --- !Analysis
    101 ; BB-NEXT: Pass:            size-info
    102 ; BB-NEXT: Name:            IRSizeChange
    103 ; BB-NEXT: Function:
    104 ; BB-NEXT: Args:            
    105 ; BB-NEXT:   - Pass:            Dead Code Elimination
    106 ; BB-NEXT:   - String:          ': IR instruction count changed from '
    107 ; BB-NEXT:   - IRInstrsBefore:  '[[ORIG]]'
    108 ; BB-NEXT:   - String:          ' to '
    109 ; BB-NEXT:   - IRInstrsAfter:   '[[FINAL]]'
    110 ; BB-NEXT:   - String:          '; Delta: '
    111 ; BB-NEXT:   - DeltaInstrCount: '[[DELTA]]'
    112 
    113 ; RUN: opt < %s -loop-unroll -pass-remarks-analysis='size-info' \
    114 ; RUN: -pass-remarks-output=%t.yaml -S -o /dev/null 2> %t; \
    115 ; RUN: cat %t %t.yaml | FileCheck %s -check-prefix=LOOP
    116 ; LOOP: remark: <unknown>:0:0: Unroll loops:
    117 ; LOOP-SAME: IR instruction count changed from
    118 ; LOOP-SAME: [[ORIG:[1-9][0-9]*]] to [[FINAL:[1-9][0-9]*]];
    119 ; LOOP-SAME: Delta: [[DELTA:-?[1-9][0-9]*]]
    120 ; LOOP: --- !Analysis
    121 ; LOOP-NEXT: Pass:            size-info
    122 ; LOOP-NEXT: Name:            IRSizeChange
    123 ; LOOP-NEXT: Function:
    124 ; LOOP-NEXT: Args:            
    125 ; LOOP-DAG:   - Pass:            Unroll loops
    126 ; LOOP-NEXT:   - String:          ': IR instruction count changed from '
    127 ; LOOP-NEXT:   - IRInstrsBefore:  '[[ORIG]]'
    128 ; LOOP-NEXT:   - String:          ' to '
    129 ; LOOP-NEXT:   - IRInstrsAfter:   '[[FINAL]]'
    130 ; LOOP-NEXT:   - String:          '; Delta: '
    131 ; LOOP-NEXT:   - DeltaInstrCount: '[[DELTA]]'
    132 declare i1 ()* @boop()
    133 
    134 define internal i1 @pluto() {
    135   %F = call i1 ()* () @boop( )
    136   %c = icmp eq i1 ()* %F, @pluto
    137   ret i1 %c
    138 }
    139 
    140 define i32 @foo(i32 %x) {
    141 entry:
    142   %x.addr = alloca i32, align 4
    143   store i32 %x, i32* %x.addr, align 4
    144   %0 = load i32, i32* %x.addr, align 4
    145   ret i32 %0
    146 }
    147 
    148 define i32 @bar(i32 %x) {
    149 entry:
    150   %x.addr = alloca i32, align 4
    151   store i32 %x, i32* %x.addr, align 4
    152   %0 = load i32, i32* %x.addr, align 4
    153   %call = call i32 @foo(i32 %0)
    154   br label %for.body
    155 for.body:
    156   %s.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
    157   %i.05 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
    158   %add = add nsw i32 %i.05, 4
    159   %inc = add nsw i32 %i.05, 1
    160   %exitcond = icmp eq i32 %inc, 16
    161   br i1 %exitcond, label %for.end, label %for.body
    162 for.end:
    163   ret i32 %add
    164 }
    165