好的,各位观众,欢迎来到今天的“编译器内部大冒险”!今天咱们不玩虚的,直接钻进编译器的心脏,看看它到底是怎么把我们辛辛苦苦写的 C++ 代码,变成机器能懂的二进制指令的。别害怕,虽然听起来很高深,但其实也挺有趣的,前提是咱们得找对路。
今天的主题是“C++ 编译器内部表示(IR)分析:LLVM IR / GCC RTL 的阅读与优化”。简单来说,就是研究编译器在翻译 C++ 代码的过程中,产生的中间语言(IR),以及如何利用这些中间语言来提升程序的性能。
第一站:为什么要有中间语言?
想象一下,你要把中文小说翻译成法语,但你只会英语。怎么办?找个懂中文和英语的翻译,先把中文翻译成英语,然后再找个懂英语和法语的翻译,把英语翻译成法语。
编译器也是一样的道理。C++ 是一种高级语言,直接翻译成机器码太复杂了。所以编译器会先把它翻译成一种中间语言,这种语言比 C++ 更接近机器码,但又不像机器码那样难以理解。不同的编译器使用不同的中间语言。常见的有 LLVM IR 和 GCC RTL。
这样做的好处是:
- 解耦: 前端(C++ 编译器)只需要关心如何把 C++ 翻译成 IR,后端(代码生成器)只需要关心如何把 IR 翻译成机器码。这样,前端和后端可以独立开发,互不影响。
- 优化: 可以在 IR 上进行各种优化,比如死代码消除、循环展开等等。这些优化可以提高程序的性能。
- 可移植性: 同样的 IR 可以被翻译成不同的机器码,从而实现跨平台编译。
第二站:初探 LLVM IR
LLVM IR (Intermediate Representation) 是 LLVM 项目中使用的一种中间语言。它是一种静态单赋值(SSA)的 IR,这意味着每个变量只会被赋值一次。
咱们来看一个简单的 C++ 例子:
int add(int a, int b) {
return a + b;
}
用 Clang 编译成 LLVM IR:
clang -S -emit-llvm add.cpp -o add.ll
打开 add.ll
文件,你可能会看到类似这样的内容:
; ModuleID = 'add.cpp'
source_filename = "add.cpp"
target datalayout = "e-m:e-p270:32:32-p271:32:32-i64:64-i128:128-f80:128-fp128:128-n64:64-S128"
target triple = "x86_64-pc-linux-gnu"
; Function Attrs: noinline nounwind optnone uwtable
define dso_local i32 @_Z3addii(i32 %0, i32 %1) #0 {
%3 = alloca i32, align 4
%4 = alloca i32, align 4
store i32 %0, i32* %3, align 4
store i32 %1, i32* %4, align 4
%5 = load i32, i32* %3, align 4
%6 = load i32, i32* %4, align 4
%7 = add nsw i32 %5, %6
ret i32 %7
}
attributes #0 = { noinline nounwind optnone uwtable "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
!llvm.module.flags = !{!0, !1, !2}
!llvm.ident = !{!3}
!0 = !{i32 2, !"SDK Version", [8 x i8] c"12.3.10"}
!1 = !{i32 2, !"Dwarf Version", i32 4}
!2 = !{i32 1, !"Debug Info Version", i32 7}
!3 = !{!"clang version 12.0.0 (https://github.com/llvm/llvm-project.git 79c1620c6c9920c9a2e52b6589e7a074535f7e9f)"}
别被吓到,咱们慢慢来。
define dso_local i32 @_Z3addii(i32 %0, i32 %1) #0
: 定义了一个名为_Z3addii
的函数,它接受两个i32
(32 位整数) 类型的参数%0
和%1
,并返回一个i32
类型的值。_Z3addii
是 C++ 函数add
的名字修饰(name mangling)后的结果。#0
是一个属性组的引用,包含了函数的各种属性。%3 = alloca i32, align 4
: 在栈上分配一块 4 字节的内存,用于存储一个i32
类型的值。%3
是一个局部变量,指向这块内存的地址。alloca
指令用于在栈上分配内存。- *`store i32 %0, i32 %3, align 4
**: 将
%0的值存储到
%3指向的内存中。
store` 指令用于将一个值存储到内存中。 - *`%5 = load i32, i32 %3, align 4
**: 从
%3指向的内存中加载一个
i32类型的值,并将其存储到
%5中。
load` 指令用于从内存中加载一个值。 %7 = add nsw i32 %5, %6
: 将%5
和%6
的值相加,并将结果存储到%7
中。add
指令用于执行加法运算。nsw
(no signed wrap) 标志表示如果加法运算导致有符号溢出,则结果是未定义的。ret i32 %7
: 返回%7
的值。ret
指令用于从函数返回。
LLVM IR 的关键概念:
概念 | 解释 |
---|---|
指令 | 执行具体操作的代码,比如 add , load , store , ret 。 |
基本块 | 一系列指令的序列,只有一个入口和一个出口。 |
函数 | 一系列的指令和基本块的集合,定义了一个可调用的代码单元。 |
模块 | 包含所有代码的顶层结构,可以包含多个函数、全局变量等等。 |
变量 | 用 % 开头的标识符,代表寄存器或栈上的内存位置。LLVM IR 是 SSA 形式,每个变量只被赋值一次。 |
类型 | i32 (32位整数), i8* (指向 8 位整数的指针), float (浮点数) 等等。 |
第三站:GCC RTL
RTL (Register Transfer Language) 是 GCC (GNU Compiler Collection) 使用的一种中间语言。它比 LLVM IR 更接近机器码,更底层。RTL 主要描述了数据如何在寄存器之间传输,以及如何执行算术和逻辑运算。
同样的 C++ 代码:
int add(int a, int b) {
return a + b;
}
用 GCC 编译成 RTL:
gcc -O1 -fverbose-asm -fdump-rtl-expand add.cpp
这会生成一个名为 add.cpp.15.expand
的文件,其中包含了 RTL 代码。内容会很长,节选关键部分:
;; Function add (add, funcdef_no 0, decl_uid 106)
;; 3037 insns (difference between insn numbers is constant: 10)
(note 1 0 7 NOTE_INSN_DELETED)
(note 1 0 8 NOTE_INSN_DELETED)
(note 1 0 9 NOTE_INSN_DELETED)
(note 1 0 10 NOTE_INSN_DELETED)
(note 1 0 11 NOTE_INSN_DELETED)
(note 1 0 12 NOTE_INSN_DELETED)
(note 1 0 13 NOTE_INSN_DELETED)
(note 1 0 14 NOTE_INSN_DELETED)
(note 1 0 15 NOTE_INSN_DELETED)
(note 1 0 16 NOTE_INSN_DELETED)
(note 1 0 17 NOTE_INSN_DELETED)
(note 1 0 18 NOTE_INSN_DELETED)
(note 1 0 19 NOTE_INSN_DELETED)
(note 1 0 20 NOTE_INSN_DELETED)
(note 1 0 21 NOTE_INSN_DELETED)
(note 1 0 22 NOTE_INSN_DELETED)
(note 1 0 23 NOTE_INSN_DELETED)
(note 1 0 24 NOTE_INSN_DELETED)
(note 1 0 25 NOTE_INSN_DELETED)
(note 1 0 26 NOTE_INSN_DELETED)
(note 1 0 27 NOTE_INSN_DELETED)
(note 1 0 28 NOTE_INSN_DELETED)
(note 1 0 29 NOTE_INSN_DELETED)
(note 1 0 30 NOTE_INSN_DELETED)
(note 1 0 31 NOTE_INSN_DELETED)
(note 1 0 32 NOTE_INSN_DELETED)
(note 1 0 33 NOTE_INSN_DELETED)
(note 1 0 34 NOTE_INSN_DELETED)
(note 1 0 35 NOTE_INSN_DELETED)
(note 1 0 36 NOTE_INSN_DELETED)
(note 1 0 37 NOTE_INSN_DELETED)
(note 1 0 38 NOTE_INSN_DELETED)
(note 1 0 39 NOTE_INSN_DELETED)
(note 1 0 40 NOTE_INSN_DELETED)
(note 1 0 41 NOTE_INSN_DELETED)
(note 1 0 42 NOTE_INSN_DELETED)
(note 1 0 43 NOTE_INSN_DELETED)
(note 1 0 44 NOTE_INSN_DELETED)
(note 1 0 45 NOTE_INSN_DELETED)
(note 1 0 46 NOTE_INSN_DELETED)
(note 1 0 47 NOTE_INSN_DELETED)
(note 1 0 48 NOTE_INSN_DELETED)
(note 1 0 49 NOTE_INSN_DELETED)
(note 1 0 50 NOTE_INSN_DELETED)
(note 1 0 51 NOTE_INSN_DELETED)
(note 1 0 52 NOTE_INSN_DELETED)
(note 1 0 53 NOTE_INSN_DELETED)
(note 1 0 54 NOTE_INSN_DELETED)
(note 1 0 55 NOTE_INSN_DELETED)
(note 1 0 56 NOTE_INSN_DELETED)
(note 1 0 57 NOTE_INSN_DELETED)
(note 1 0 58 NOTE_INSN_DELETED)
(note 1 0 59 NOTE_INSN_DELETED)
(note 1 0 60 NOTE_INSN_DELETED)
(note 1 0 61 NOTE_INSN_DELETED)
(note 1 0 62 NOTE_INSN_DELETED)
(note 1 0 63 NOTE_INSN_DELETED)
(note 1 0 64 NOTE_INSN_DELETED)
(note 1 0 65 NOTE_INSN_DELETED)
(note 1 0 66 NOTE_INSN_DELETED)
(note 1 0 67 NOTE_INSN_DELETED)
(note 1 0 68 NOTE_INSN_DELETED)
(note 1 0 69 NOTE_INSN_DELETED)
(note 1 0 70 NOTE_INSN_DELETED)
(note 1 0 71 NOTE_INSN_DELETED)
(note 1 0 72 NOTE_INSN_DELETED)
(note 1 0 73 NOTE_INSN_DELETED)
(note 1 0 74 NOTE_INSN_DELETED)
(note 1 0 75 NOTE_INSN_DELETED)
(note 1 0 76 NOTE_INSN_DELETED)
(note 1 0 77 NOTE_INSN_DELETED)
(note 1 0 78 NOTE_INSN_DELETED)
(note 1 0 79 NOTE_INSN_DELETED)
(note 1 0 80 NOTE_INSN_DELETED)
(note 1 0 81 NOTE_INSN_DELETED)
(note 1 0 82 NOTE_INSN_DELETED)
(note 1 0 83 NOTE_INSN_DELETED)
(note 1 0 84 NOTE_INSN_DELETED)
(note 1 0 85 NOTE_INSN_DELETED)
(note 1 0 86 NOTE_INSN_DELETED)
(note 1 0 87 NOTE_INSN_DELETED)
(note 1 0 88 NOTE_INSN_DELETED)
(note 1 0 89 NOTE_INSN_DELETED)
(note 1 0 90 NOTE_INSN_DELETED)
(note 1 0 91 NOTE_INSN_DELETED)
(note 1 0 92 NOTE_INSN_DELETED)
(note 1 0 93 NOTE_INSN_DELETED)
(note 1 0 94 NOTE_INSN_DELETED)
(note 1 0 95 NOTE_INSN_DELETED)
(note 1 0 96 NOTE_INSN_DELETED)
(note 1 0 97 NOTE_INSN_DELETED)
(note 1 0 98 NOTE_INSN_DELETED)
(note 1 0 99 NOTE_INSN_DELETED)
(note 1 0 100 NOTE_INSN_DELETED)
(note 1 0 101 NOTE_INSN_DELETED)
(note 1 0 102 NOTE_INSN_DELETED)
(note 1 0 103 NOTE_INSN_DELETED)
(note 1 0 104 NOTE_INSN_DELETED)
(note 1 0 105 NOTE_INSN_DELETED)
(note 1 0 106 NOTE_INSN_DELETED)
(note 1 0 107 NOTE_INSN_DELETED)
(note 1 0 108 NOTE_INSN_DELETED)
(note 1 0 109 NOTE_INSN_DELETED)
(note 1 0 110 NOTE_INSN_DELETED)
(note 1 0 111 NOTE_INSN_DELETED)
(note 1 0 112 NOTE_INSN_DELETED)
(note 1 0 113 NOTE_INSN_DELETED)
(note 1 0 114 NOTE_INSN_DELETED)
(note 1 0 115 NOTE_INSN_DELETED)
(note 1 0 116 NOTE_INSN_DELETED)
(note 1 0 117 NOTE_INSN_DELETED)
(note 1 0 118 NOTE_INSN_DELETED)
(note 1 0 119 NOTE_INSN_DELETED)
(note 1 0 120 NOTE_INSN_DELETED)
(note 1 0 121 NOTE_INSN_DELETED)
(note 1 0 122 NOTE_INSN_DELETED)
(note 1 0 123 NOTE_INSN_DELETED)
(note 1 0 124 NOTE_INSN_DELETED)
(note 1 0 125 NOTE_INSN_DELETED)
(note 1 0 126 NOTE_INSN_DELETED)
(note 1 0 127 NOTE_INSN_DELETED)
(note 1 0 128 NOTE_INSN_DELETED)
(note 1 0 129 NOTE_INSN_DELETED)
(note 1 0 130 NOTE_INSN_DELETED)
(note 1 0 131 NOTE_INSN_DELETED)
(note 1 0 132 NOTE_INSN_DELETED)
(note 1 0 133 NOTE_INSN_DELETED)
(note 1 0 134 NOTE_INSN_DELETED)
(note 1 0 135 NOTE_INSN_DELETED)
(note 1 0 136 NOTE_INSN_DELETED)
(note 1 0 137 NOTE_INSN_DELETED)
(note 1 0 138 NOTE_INSN_DELETED)
(note 1 0 139 NOTE_INSN_DELETED)
(note 1 0 140 NOTE_INSN_DELETED)
(note 1 0 141 NOTE_INSN_DELETED)
(note 1 0 142 NOTE_INSN_DELETED)
(note 1 0 143 NOTE_INSN_DELETED)
(note 1 0 144 NOTE_INSN_DELETED)
(note 1 0 145 NOTE_INSN_DELETED)
(note 1 0 146 NOTE_INSN_DELETED)
(note 1 0 147 NOTE_INSN_DELETED)
(note 1 0 148 NOTE_INSN_DELETED)
(note 1 0 149 NOTE_INSN_DELETED)
(note 1 0 150 NOTE_INSN_DELETED)
(note 1 0 151 NOTE_INSN_DELETED)
(note 1 0 152 NOTE_INSN_DELETED)
(note 1 0 153 NOTE_INSN_DELETED)
(note 1 0 154 NOTE_INSN_DELETED)
(note 1 0 155 NOTE_INSN_DELETED)
(note 1 0 156 NOTE_INSN_DELETED)
(note 1 0 157 NOTE_INSN_DELETED)
(note 1 0 158 NOTE_INSN_DELETED)
(note 1 0 159 NOTE_INSN_DELETED)
(note 1 0 160 NOTE_INSN_DELETED)
(note 1 0 161 NOTE_INSN_DELETED)
(note 1 0 162 NOTE_INSN_DELETED)
(note 1 0 163 NOTE_INSN_DELETED)
(note 1 0 164 NOTE_INSN_DELETED)
(note 1 0 165 NOTE_INSN_DELETED)
(note 1 0 166 NOTE_INSN_DELETED)
(note 1 0 167 NOTE_INSN_DELETED)
(note 1 0 168 NOTE_INSN_DELETED)
(note 1 0 169 NOTE_INSN_DELETED)
(note 1 0 170 NOTE_INSN_DELETED)
(note 1 0 171 NOTE_INSN_DELETED)
(note 1 0 172 NOTE_INSN_DELETED)
(note 1 0 173 NOTE_INSN_DELETED)
(note 1 0 174 NOTE_INSN_DELETED)
(note 1 0 175 NOTE_INSN_DELETED)
(note 1 0 176 NOTE_INSN_DELETED)
(note 1 0 177 NOTE_INSN_DELETED)
(note 1 0 178 NOTE_INSN_DELETED)
(note 1 0 179 NOTE_INSN_DELETED)
(note 1 0 180 NOTE_INSN_DELETED)
(note 1 0 181 NOTE_INSN_DELETED)
(note 1 0 182 NOTE_INSN_DELETED)
(note 1 0 183 NOTE_INSN_DELETED)
(note 1 0 184 NOTE_INSN_DELETED)
(note 1 0 185 NOTE_INSN_DELETED)
(note 1 0 186 NOTE_INSN_DELETED)
(note 1 0 187 NOTE_INSN_DELETED)
(note 1 0 188 NOTE_INSN_DELETED)
(note 1 0 189 NOTE_INSN_DELETED)
(note 1 0 190 NOTE_INSN_DELETED)
(note 1 0 191 NOTE_INSN_DELETED)
(note 1 0 192 NOTE_INSN_DELETED)
(note 1 0 193 NOTE_INSN_DELETED)
(note 1 0 194 NOTE_INSN_DELETED)
(note 1 0 195 NOTE_INSN_DELETED)
(note 1 0 196 NOTE_INSN_DELETED)
(note 1 0 197 NOTE_INSN_DELETED)
(note 1 0 198 NOTE_INSN_DELETED)
(note 1 0 199 NOTE_INSN_DELETED)
(note 1 0 200 NOTE_INSN_DELETED)
(note 1 0 201 NOTE_INSN_DELETED)
(note 1 0 202 NOTE_INSN_DELETED)
(note 1 0 203 NOTE_INSN_DELETED)
(note 1 0 204 NOTE_INSN_DELETED)
(note 1 0 205 NOTE_INSN_DELETED)
(note 1 0 206 NOTE_INSN_DELETED)
(note 1 0 207 NOTE_INSN_DELETED)
(note 1 0 208 NOTE_INSN_DELETED)
(note 1 0 209 NOTE_INSN_DELETED)
(note 1 0 210 NOTE_INSN_DELETED)
(note 1 0 211 NOTE_INSN_DELETED)
(note 1 0 212 NOTE_INSN_DELETED)
(note 1 0 213 NOTE_INSN_DELETED)
(note 1 0 214 NOTE_INSN_DELETED)
(note 1 0 215 NOTE_INSN_DELETED)
(note 1 0 216 NOTE_INSN_DELETED)
(note 1 0 217 NOTE_INSN_DELETED)
(note 1 0 218 NOTE_INSN_DELETED)
(note 1 0 219 NOTE_INSN_DELETED)
(note 1 0 220 NOTE_INSN_DELETED)
(note 1 0 221 NOTE_INSN_DELETED)
(note 1 0 222 NOTE_INSN_DELETED)
(note 1 0 223 NOTE_INSN_DELETED)
(note 1 0 224 NOTE_INSN_DELETED)
(note 1 0 225 NOTE_INSN_DELETED)
(note 1 0 226 NOTE_INSN_DELETED)
(note 1 0 227 NOTE_INSN_DELETED)
(note 1 0 228 NOTE_INSN_DELETED)
(note 1 0 229 NOTE_INSN_DELETED)
(note 1 0 230 NOTE_INSN_DELETED)
(note 1 0 231 NOTE_INSN_DELETED)
(note 1 0 232 NOTE_INSN_DELETED)
(note 1 0 233 NOTE_INSN_DELETED)
(note 1 0 234 NOTE_INSN_DELETED)
(note 1 0 235 NOTE_INSN_DELETED)
(note 1 0 236 NOTE_INSN_DELETED)
(note 1 0 237 NOTE_INSN_DELETED)
(note 1 0 238 NOTE_INSN_DELETED)
(note 1 0 239 NOTE_INSN_DELETED)
(note 1 0 240 NOTE_INSN_DELETED)
(note 1 0 241 NOTE_INSN_DELETED)
(note 1 0 242 NOTE_INSN_DELETED)
(note 1 0 243 NOTE_INSN_DELETED)
(note 1 0 244 NOTE_INSN_DELETED)
(note 1 0 245 NOTE_INSN_DELETED)
(note 1 0 246 NOTE_INSN_DELETED)
(note 1 0 247 NOTE_INSN_DELETED)
(note 1 0 248 NOTE_INSN_DELETED)
(note 1 0 249 NOTE_INSN_DELETED)
(note 1 0 250 NOTE_INSN_DELETED)
(note 1 0 251 NOTE_INSN_DELETED)
(note 1 0 252 NOTE_INSN_DELETED)
(note 1 0 253 NOTE_INSN_DELETED)
(note 1 0 254 NOTE_INSN_DELETED)
(note 1 0 255 NOTE_INSN_DELETED)
(note 1 0 256 NOTE_INSN_DELETED)
(note 1 0 257 NOTE_INSN_DELETED)
(note 1 0 258 NOTE_INSN_DELETED)
(note 1 0 259 NOTE_INSN_DELETED)
(note 1 0 260 NOTE_INSN_DELETED)
(note 1 0 261 NOTE_INSN_DELETED)
(note 1 0 262 NOTE_INSN_DELETED)
(note 1 0 263 NOTE_INSN_DELETED)
(note 1 0 264 NOTE_INSN_DELETED)
(note 1 0 265 NOTE_INSN_DELETED)
(note 1 0 266 NOTE_INSN_DELETED)
(note 1 0 267 NOTE_INSN_DELETED)
(note 1 0 268 NOTE_INSN_DELETED)
(note 1 0 269 NOTE_INSN_DELETED)
(note 1 0 270 NOTE_INSN_DELETED)
(note 1 0 271 NOTE_INSN_DELETED)
(note 1 0 272 NOTE_INSN_DELETED)
(note 1 0 273 NOTE_INSN_DELETED)
(note 1 0 274 NOTE_INSN_DELETED)
(note 1 0 275 NOTE_INSN_DELETED)
(note 1 0 276 NOTE_INSN_DELETED)
(note 1 0 277 NOTE_INSN_DELETED)
(note 1 0 278 NOTE_INSN_DELETED)
(note 1 0 279 NOTE_INSN_DELETED)
(note 1 0 280 NOTE_INSN_DELETED)
(note 1 0 281 NOTE_INSN_DELETED)
(note 1 0 282 NOTE_INSN_DELETED)
(note 1 0 283 NOTE_INSN_DELETED)
(note 1 0 284 NOTE_INSN_DELETED)
(note 1 0 285 NOTE_INSN_DELETED)
(note 1 0 286 NOTE_INSN_DELETED)
(note 1 0 287 NOTE_INSN_DELETED)
(note 1 0 288 NOTE_INSN_DELETED)
(note 1 0 289 NOTE_INSN_DELETED)
(note 1 0 290 NOTE_INSN_DELETED)
(note 1 0 291 NOTE_INSN_DELETED)
(note 1 0 292 NOTE_INSN_DELETED)
(note 1 0 293 NOTE_INSN_DELETED)
(note 1 0 294 NOTE_INSN_DELETED)
(note 1 0 295 NOTE_INSN_DELETED)
(note 1 0 296 NOTE_INSN_DELETED)
(note 1 0 297 NOTE_INSN_DELETED)
(note 1 0 298 NOTE_INSN_DELETED)
(note 1 0 299 NOTE_INSN_DELETED)
(note 1 0 300 NOTE_INSN_DELETED)
(note 1 0 301 NOTE_INSN_DELETED)
(note 1 0 302 NOTE_INSN_DELETED)
(note 1 0 303 NOTE_INSN_DELETED)
(note 1 0 304 NOTE_INSN_DELETED)
(note 1 0 305 NOTE_INSN_DELETED)
(note 1 0 306 NOTE_INSN_DELETED)
(note 1 0 307 NOTE_INSN_DELETED)
(note 1 0 308 NOTE_INSN_DELETED)
(note 1 0 309 NOTE_INSN_DELETED)
(note 1 0 310 NOTE_INSN_DELETED)
(note 1 0 311 NOTE_INSN_DELETED)
(note 1 0 312 NOTE_INSN_DELETED)
(note 1 0 313 NOTE_INSN_DELETED)
(note 1 0 314 NOTE_INSN_DELETED)
(note 1 0 315 NOTE_INSN_DELETED)
(note 1 0 316 NOTE_INSN_DELETED)
(note 1 0 317 NOTE_INSN_DELETED)
(note 1 0 318 NOTE_INSN_DELETED)
(note 1 0 319 NOTE_INSN_DELETED)
(note 1 0 320 NOTE_INSN_DELETED)
(note 1 0 321 NOTE_INSN_DELETED)
(note 1 0 322 NOTE_INSN_DELETED)
(note 1 0 323 NOTE_INSN_DELETED)
(note 1 0 324 NOTE_INSN_DELETED)
(note 1 0 325 NOTE_INSN_DELETED)
(note 1 0 326 NOTE_INSN_DELETED)
(note 1 0 327 NOTE_INSN_DELETED)
(note 1 0 328 NOTE_INSN_DELETED)
(note 1 0 329 NOTE_INSN_DELETED)
(note 1 0 330 NOTE_INSN_DELETED)
(note 1 0 331 NOTE_INSN_DELETED)
(note 1 0 332 NOTE_INSN_DELETED)
(note 1 0 333 NOTE_INSN_DELETED)
(note 1 0 334 NOTE_INSN_DELETED)
(note 1 0 335 NOTE_INSN_DELETED)
(note 1 0 336 NOTE_INSN_DELETED)
(note 1 0 337 NOTE_INSN_DELETED)
(note 1 0 338 NOTE_INSN_DELETED)
(note