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