sunfishcode / llvm2cranelift

LLVM IR to Cranelift IR translator
Apache License 2.0
36 stars 4 forks source link

Crused with clang 5.0 #12

Closed transparent123123 closed 2 years ago

transparent123123 commented 2 years ago

I tried to do a comparison between cranelift and llvm backend. And I used the llvm2cranelift to a .ll by clang5.0. The file I get is like this and the tool crushed with the err message

thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', lib/llvm/src/string_table.rs:41:57
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

Do you have any clue about this bug? Or maybe I should use an older version clang to make it compatible with llvm2cranelift? @sunfishcode

transparent123123 commented 2 years ago

the ll file is this

; ModuleID = 'cpp_pch.c'
source_filename = "cpp_pch.c"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.cpp_reader = type { %struct.cpp_buffer*, %struct.cpp_buffer*, %struct.lexer_state, %struct.line_maps*, i32, %struct._cpp_buff*, %struct._cpp_buff*, %struct._cpp_buff*, %struct.cpp_context, %struct.cpp_context*, %struct.directive*, %struct.cpp_token, i32, i8, %struct.cpp_dir*, %struct.cpp_dir*, %struct.cpp_dir, %struct._cpp_file*, %struct._cpp_file*, %struct.htab*, %struct.htab*, %struct.file_hash_entry_pool*, %struct.htab*, %struct.obstack, i8, i8, %struct.cpp_hashnode*, %struct.cpp_hashnode*, i8, %struct.cpp_token*, %struct.tokenrun, %struct.tokenrun*, i32, i32, i8*, i32, %struct.cset_converter, %struct.cset_converter, %struct.cset_converter, %struct.cset_converter, %struct.cset_converter, i8*, i8*, %struct.cpp_token, %struct.cpp_token, %struct.deps*, %struct.obstack, %struct.obstack, %struct.pragma_entry*, %struct.cpp_callbacks, %struct.ht*, %struct.op*, %struct.op*, %struct.cpp_options, %struct.spec_nodes, i8, %struct.anon.2, i8*, i8*, i8*, %struct.cpp_savedstate*, i32, %struct.cpp_comment_table, %struct.def_pragma_macro* }
%struct.cpp_buffer = type { i8*, i8*, i8*, i8*, i8*, %struct._cpp_line_note*, i32, i32, i32, %struct.cpp_buffer*, %struct._cpp_file*, i8*, %struct.if_stack*, i8, i8, i8, %struct.cpp_dir, %struct.cset_converter }
%struct._cpp_line_note = type { i8*, i32 }
%struct.if_stack = type opaque
%struct.lexer_state = type { i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i32, i8, i8 }
%struct.line_maps = type { %struct.line_map*, i32, i32, i32, i32, i32, i8, i32, i32, i32, i8* (i8*, i64)* }
%struct.line_map = type { i8*, i32, i32, i32, i8, i8, i8 }
%struct._cpp_buff = type { %struct._cpp_buff*, i8*, i8*, i8* }
%struct.cpp_context = type { %struct.cpp_context*, %struct.cpp_context*, %union.anon, %struct._cpp_buff*, %struct.cpp_hashnode*, i8 }
%union.anon = type { %struct.anon }
%struct.anon = type { %union.utoken, %union.utoken }
%union.utoken = type { %struct.cpp_token* }
%struct.directive = type opaque
%struct.cpp_dir = type { %struct.cpp_dir*, i8*, i32, i8, i8, i8*, i8**, i8* (i8*, %struct.cpp_dir*)*, i64, i64 }
%struct._cpp_file = type opaque
%struct.file_hash_entry_pool = type opaque
%struct.htab = type { i32 (i8*)*, i32 (i8*, i8*)*, void (i8*)*, i8**, i64, i64, i64, i32, i32, i8* (i64, i64)*, void (i8*)*, i8*, i8* (i8*, i64, i64)*, void (i8*, i8*)*, i32 }
%struct.cpp_hashnode = type { %struct.ht_identifier, i8, i8, i16, %union._cpp_hashnode_value }
%struct.ht_identifier = type { i8*, i32, i32 }
%union._cpp_hashnode_value = type { %struct.cpp_macro* }
%struct.cpp_macro = type { %struct.cpp_hashnode**, %union.cpp_macro_u, i32, i32, i16, i8 }
%union.cpp_macro_u = type { %struct.cpp_token* }
%struct.tokenrun = type { %struct.tokenrun*, %struct.tokenrun*, %struct.cpp_token*, %struct.cpp_token* }
%struct.cset_converter = type { i8 (i8*, i8*, i64, %struct._cpp_strbuf*)*, i8*, i32 }
%struct._cpp_strbuf = type opaque
%struct.cpp_token = type { i32, i8, i16, %union.cpp_token_u }
%union.cpp_token_u = type { %struct.cpp_string }
%struct.cpp_string = type { i32, i8* }
%struct.deps = type opaque
%struct.obstack = type { i64, %struct._obstack_chunk*, i8*, i8*, i8*, i64, i32, %struct._obstack_chunk* (i8*, i64)*, void (i8*, %struct._obstack_chunk*)*, i8*, i8 }
%struct._obstack_chunk = type { i8*, %struct._obstack_chunk*, [4 x i8] }
%struct.pragma_entry = type opaque
%struct.cpp_callbacks = type { void (%struct.cpp_reader*, %struct.cpp_token*, i32)*, void (%struct.cpp_reader*, %struct.line_map*)*, void (%struct.cpp_reader*, i8*)*, void (%struct.cpp_reader*, i32, i8*, i8*, i32, %struct.cpp_token**)*, void (%struct.cpp_reader*, i32, %struct.cpp_hashnode*)*, void (%struct.cpp_reader*, i32, %struct.cpp_hashnode*)*, void (%struct.cpp_reader*, i32, %struct.cpp_string*)*, void (%struct.cpp_reader*, i32)*, i32 (%struct.cpp_reader*, i8*, i32)*, void (%struct.cpp_reader*, i8*, i32, i8*)*, i8* (%struct.cpp_reader*, i8*, %struct.cpp_dir**)*, %struct.cpp_hashnode* (%struct.cpp_reader*, %struct.cpp_token*)*, i8 (%struct.cpp_reader*, i32, i32, i32, i8*, [1 x %struct.__va_list_tag]*)*, void (%struct.cpp_reader*, i32, %struct.cpp_hashnode*)*, void (%struct.cpp_reader*, i32, %struct.cpp_hashnode*)*, void (%struct.cpp_reader*)*, void (%struct.cpp_reader*, i32, %struct.cpp_hashnode*)* }
%struct.__va_list_tag = type { i32, i32, i8*, i8* }
%struct.ht = type { %struct.obstack, %struct.ht_identifier**, %struct.ht_identifier* (%struct.ht*)*, i8* (i64)*, i32, i32, %struct.cpp_reader*, i32, i32, i8 }
%struct.op = type opaque
%struct.cpp_options = type { i32, i32, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8*, i8*, i8*, i32, i8, i8, %struct.anon.1, i64, i64, i64, i64, i8, i8, i8, i8, i8 }
%struct.anon.1 = type { i32, i8, i8, i8, i8 }
%struct.spec_nodes = type { %struct.cpp_hashnode*, %struct.cpp_hashnode*, %struct.cpp_hashnode*, %struct.cpp_hashnode* }
%struct.anon.2 = type { i8*, i8*, i8*, i32 }
%struct.cpp_savedstate = type { %struct.htab*, i64, i64, %struct.cpp_hashnode**, i8* }
%struct.cpp_comment_table = type { %struct.cpp_comment*, i32, i32 }
%struct.cpp_comment = type { i8*, i32 }
%struct.def_pragma_macro = type { %struct.def_pragma_macro*, i8*, %struct.cpp_macro* }
%struct._IO_FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct._IO_FILE*, i32, i32, i64, i16, i8, [1 x i8], i8*, i64, i8*, i8*, i8*, i8*, i64, i32, [20 x i8] }
%struct._IO_marker = type { %struct._IO_marker*, %struct._IO_FILE*, i32 }
%struct.macrodef_struct = type { i32, i16, i16 }
%struct.ht_node_list = type { %struct.cpp_hashnode**, i64, i64 }
%struct.save_macro_data = type { i8**, i64, i64, i8** }

@.str = private unnamed_addr constant [33 x i8] c"while writing precompiled header\00", align 1
@.str.1 = private unnamed_addr constant [40 x i8] c"%s: not used because `%.*s' is poisoned\00", align 1
@.str.2 = private unnamed_addr constant [26 x i8] c"__GCC_HAVE_DWARF2_CFI_ASM\00", align 1
@.str.3 = private unnamed_addr constant [40 x i8] c"%s: not used because `%.*s' not defined\00", align 1
@.str.4 = private unnamed_addr constant [55 x i8] c"%s: not used because `%.*s' defined as `%s' not `%.*s'\00", align 1
@.str.5 = private unnamed_addr constant [37 x i8] c"%s: not used because `%s' is defined\00", align 1
@.str.6 = private unnamed_addr constant [46 x i8] c"%s: not used because `__COUNTER__' is invalid\00", align 1
@.str.7 = private unnamed_addr constant [33 x i8] c"while reading precompiled header\00", align 1
@.str.8 = private unnamed_addr constant [8 x i8] c"defined\00", align 1
@.str.9 = private unnamed_addr constant [5 x i8] c"true\00", align 1
@.str.10 = private unnamed_addr constant [6 x i8] c"false\00", align 1
@.str.11 = private unnamed_addr constant [12 x i8] c"__VA_ARGS__\00", align 1
@.str.12 = private unnamed_addr constant [4 x i8] c"( \0A\00", align 1

; Function Attrs: inlinehint nounwind readonly uwtable
define i32 @tolower(i32) local_unnamed_addr #0 {
  %2 = add i32 %0, 128
  %3 = icmp ult i32 %2, 384
  br i1 %3, label %4, label %10

; <label>:4:                                      ; preds = %1
  %5 = tail call i32** @__ctype_tolower_loc() #10
  %6 = load i32*, i32** %5, align 8, !tbaa !2
  %7 = sext i32 %0 to i64
  %8 = getelementptr inbounds i32, i32* %6, i64 %7
  %9 = load i32, i32* %8, align 4, !tbaa !6
  br label %10

; <label>:10:                                     ; preds = %1, %4
  %11 = phi i32 [ %9, %4 ], [ %0, %1 ]
  ret i32 %11
}

declare i32** @__ctype_tolower_loc() local_unnamed_addr #1

; Function Attrs: inlinehint nounwind readonly uwtable
define i32 @toupper(i32) local_unnamed_addr #0 {
  %2 = add i32 %0, 128
  %3 = icmp ult i32 %2, 384
  br i1 %3, label %4, label %10

; <label>:4:                                      ; preds = %1
  %5 = tail call i32** @__ctype_toupper_loc() #10
  %6 = load i32*, i32** %5, align 8, !tbaa !2
  %7 = sext i32 %0 to i64
  %8 = getelementptr inbounds i32, i32* %6, i64 %7
  %9 = load i32, i32* %8, align 4, !tbaa !6
  br label %10

; <label>:10:                                     ; preds = %1, %4
  %11 = phi i32 [ %9, %4 ], [ %0, %1 ]
  ret i32 %11
}

declare i32** @__ctype_toupper_loc() local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define i32 @cpp_save_state(%struct.cpp_reader*, %struct._IO_FILE*) local_unnamed_addr #2 {
  %3 = tail call i8* @xmalloc(i64 40) #10
  %4 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 60
  %5 = bitcast %struct.cpp_savedstate** %4 to i8**
  store i8* %3, i8** %5, align 8, !tbaa !8
  %6 = tail call %struct.htab* @htab_create(i64 100, i32 (i8*)* nonnull @cpp_string_hash, i32 (i8*, i8*)* nonnull @cpp_string_eq, void (i8*)* null) #10
  %7 = load %struct.cpp_savedstate*, %struct.cpp_savedstate** %4, align 8, !tbaa !8
  %8 = getelementptr inbounds %struct.cpp_savedstate, %struct.cpp_savedstate* %7, i64 0, i32 0
  store %struct.htab* %6, %struct.htab** %8, align 8, !tbaa !25
  %9 = bitcast %struct.cpp_savedstate* %7 to i8*
  tail call void @cpp_forall_identifiers(%struct.cpp_reader* %0, i32 (%struct.cpp_reader*, %struct.cpp_hashnode*, i8*)* nonnull @save_idents, i8* %9) #10
  %10 = bitcast %struct._IO_FILE* %1 to i8*
  tail call void @cpp_forall_identifiers(%struct.cpp_reader* %0, i32 (%struct.cpp_reader*, %struct.cpp_hashnode*, i8*)* nonnull @write_macdef, i8* %10) #10
  ret i32 0
}

declare i8* @xmalloc(i64) local_unnamed_addr #1

declare %struct.htab* @htab_create(i64, i32 (i8*)*, i32 (i8*, i8*)*, void (i8*)*) local_unnamed_addr #1

; Function Attrs: norecurse nounwind readonly uwtable
define internal i32 @cpp_string_hash(i8* nocapture readonly) #3 {
  %2 = bitcast i8* %0 to i32*
  %3 = load i32, i32* %2, align 8, !tbaa !27
  %4 = zext i32 %3 to i64
  %5 = icmp eq i32 %3, 0
  br i1 %5, label %63, label %6

; <label>:6:                                      ; preds = %1
  %7 = getelementptr inbounds i8, i8* %0, i64 8
  %8 = bitcast i8* %7 to i8**
  %9 = load i8*, i8** %8, align 8, !tbaa !29
  %10 = add nsw i64 %4, -1
  %11 = and i64 %4, 3
  %12 = icmp ult i64 %10, 3
  br i1 %12, label %45, label %13

; <label>:13:                                     ; preds = %6
  %14 = sub nsw i64 %4, %11
  br label %15

; <label>:15:                                     ; preds = %15, %13
  %16 = phi i32 [ 0, %13 ], [ %42, %15 ]
  %17 = phi i8* [ %9, %13 ], [ %38, %15 ]
  %18 = phi i64 [ %14, %13 ], [ %43, %15 ]
  %19 = mul i32 %16, 67
  %20 = getelementptr inbounds i8, i8* %17, i64 1
  %21 = load i8, i8* %17, align 1, !tbaa !30
  %22 = zext i8 %21 to i32
  %23 = add i32 %19, 113
  %24 = sub i32 %23, %22
  %25 = mul i32 %24, 67
  %26 = getelementptr inbounds i8, i8* %17, i64 2
  %27 = load i8, i8* %20, align 1, !tbaa !30
  %28 = zext i8 %27 to i32
  %29 = add i32 %25, 113
  %30 = sub i32 %29, %28
  %31 = mul i32 %30, 67
  %32 = getelementptr inbounds i8, i8* %17, i64 3
  %33 = load i8, i8* %26, align 1, !tbaa !30
  %34 = zext i8 %33 to i32
  %35 = add i32 %31, 113
  %36 = sub i32 %35, %34
  %37 = mul i32 %36, 67
  %38 = getelementptr inbounds i8, i8* %17, i64 4
  %39 = load i8, i8* %32, align 1, !tbaa !30
  %40 = zext i8 %39 to i32
  %41 = add i32 %37, 113
  %42 = sub i32 %41, %40
  %43 = add i64 %18, -4
  %44 = icmp eq i64 %43, 0
  br i1 %44, label %45, label %15

; <label>:45:                                     ; preds = %15, %6
  %46 = phi i32 [ undef, %6 ], [ %42, %15 ]
  %47 = phi i32 [ 0, %6 ], [ %42, %15 ]
  %48 = phi i8* [ %9, %6 ], [ %38, %15 ]
  %49 = icmp eq i64 %11, 0
  br i1 %49, label %63, label %50

; <label>:50:                                     ; preds = %45
  br label %51

; <label>:51:                                     ; preds = %51, %50
  %52 = phi i32 [ %47, %50 ], [ %60, %51 ]
  %53 = phi i8* [ %48, %50 ], [ %56, %51 ]
  %54 = phi i64 [ %11, %50 ], [ %61, %51 ]
  %55 = mul i32 %52, 67
  %56 = getelementptr inbounds i8, i8* %53, i64 1
  %57 = load i8, i8* %53, align 1, !tbaa !30
  %58 = zext i8 %57 to i32
  %59 = add i32 %55, 113
  %60 = sub i32 %59, %58
  %61 = add i64 %54, -1
  %62 = icmp eq i64 %61, 0
  br i1 %62, label %63, label %51, !llvm.loop !31

; <label>:63:                                     ; preds = %45, %51, %1
  %64 = phi i32 [ 0, %1 ], [ %46, %45 ], [ %60, %51 ]
  ret i32 %64
}

; Function Attrs: nounwind readonly uwtable
define internal i32 @cpp_string_eq(i8* nocapture readonly, i8* nocapture readonly) #4 {
  %3 = bitcast i8* %0 to i32*
  %4 = load i32, i32* %3, align 8, !tbaa !27
  %5 = bitcast i8* %1 to i32*
  %6 = load i32, i32* %5, align 8, !tbaa !27
  %7 = icmp eq i32 %4, %6
  br i1 %7, label %8, label %19

; <label>:8:                                      ; preds = %2
  %9 = getelementptr inbounds i8, i8* %0, i64 8
  %10 = bitcast i8* %9 to i8**
  %11 = load i8*, i8** %10, align 8, !tbaa !29
  %12 = getelementptr inbounds i8, i8* %1, i64 8
  %13 = bitcast i8* %12 to i8**
  %14 = load i8*, i8** %13, align 8, !tbaa !29
  %15 = zext i32 %4 to i64
  %16 = tail call i32 @memcmp(i8* %11, i8* %14, i64 %15) #11
  %17 = icmp eq i32 %16, 0
  %18 = zext i1 %17 to i32
  br label %19

; <label>:19:                                     ; preds = %8, %2
  %20 = phi i32 [ 0, %2 ], [ %18, %8 ]
  ret i32 %20
}

declare void @cpp_forall_identifiers(%struct.cpp_reader*, i32 (%struct.cpp_reader*, %struct.cpp_hashnode*, i8*)*, i8*) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define internal i32 @save_idents(%struct.cpp_reader* nocapture readnone, %struct.cpp_hashnode* nocapture readonly, i8* nocapture readonly) #2 {
  %4 = alloca %struct.cpp_string, align 8
  %5 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %1, i64 0, i32 3
  %6 = load i16, i16* %5, align 2
  %7 = and i16 %6, 63
  %8 = icmp eq i16 %7, 0
  br i1 %8, label %36, label %9

; <label>:9:                                      ; preds = %3
  %10 = bitcast %struct.cpp_string* %4 to i8*
  call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %10) #10
  %11 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %1, i64 0, i32 0, i32 1
  %12 = load i32, i32* %11, align 8, !tbaa !33
  %13 = getelementptr inbounds %struct.cpp_string, %struct.cpp_string* %4, i64 0, i32 0
  store i32 %12, i32* %13, align 8, !tbaa !27
  %14 = bitcast %struct.cpp_hashnode* %1 to i64*
  %15 = load i64, i64* %14, align 8, !tbaa !35
  %16 = getelementptr inbounds %struct.cpp_string, %struct.cpp_string* %4, i64 0, i32 1
  %17 = bitcast i8** %16 to i64*
  store i64 %15, i64* %17, align 8, !tbaa !29
  %18 = bitcast i8* %2 to %struct.htab**
  %19 = load %struct.htab*, %struct.htab** %18, align 8, !tbaa !25
  %20 = call i8** @htab_find_slot(%struct.htab* %19, i8* nonnull %10, i32 1) #10
  %21 = load i8*, i8** %20, align 8, !tbaa !2
  %22 = icmp eq i8* %21, null
  br i1 %22, label %23, label %35

; <label>:23:                                     ; preds = %9
  %24 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %1, i64 0, i32 0, i32 0
  %25 = call i8* @xmalloc(i64 16) #10
  store i8* %25, i8** %20, align 8, !tbaa !2
  %26 = load i32, i32* %11, align 8, !tbaa !33
  %27 = bitcast i8* %25 to i32*
  store i32 %26, i32* %27, align 8, !tbaa !27
  %28 = zext i32 %26 to i64
  %29 = call i8* @xmalloc(i64 %28) #10
  %30 = getelementptr inbounds i8, i8* %25, i64 8
  %31 = bitcast i8* %30 to i8**
  store i8* %29, i8** %31, align 8, !tbaa !29
  %32 = load i8*, i8** %24, align 8, !tbaa !35
  %33 = load i32, i32* %11, align 8, !tbaa !33
  %34 = zext i32 %33 to i64
  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %29, i8* %32, i64 %34, i32 1, i1 false)
  br label %35

; <label>:35:                                     ; preds = %23, %9
  call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %10) #10
  br label %36

; <label>:36:                                     ; preds = %3, %35
  ret i32 1
}

; Function Attrs: nounwind uwtable
define internal i32 @write_macdef(%struct.cpp_reader*, %struct.cpp_hashnode*, i8* nocapture) #2 {
  %4 = alloca %struct.macrodef_struct, align 4
  %5 = bitcast i8* %2 to %struct._IO_FILE*
  %6 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %1, i64 0, i32 3
  %7 = load i16, i16* %6, align 2
  %8 = trunc i16 %7 to i6
  switch i6 %8, label %53 [
    i6 0, label %9
    i6 1, label %15
    i6 2, label %51
  ]

; <label>:9:                                      ; preds = %3
  %10 = trunc i16 %7 to i8
  %11 = icmp slt i8 %10, 0
  %12 = and i16 %7, 256
  %13 = icmp eq i16 %12, 0
  %14 = and i1 %11, %13
  br i1 %14, label %18, label %51

; <label>:15:                                     ; preds = %3
  %16 = and i16 %7, 256
  %17 = icmp eq i16 %16, 0
  br i1 %17, label %18, label %51

; <label>:18:                                     ; preds = %9, %15
  %19 = bitcast %struct.macrodef_struct* %4 to i8*
  call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %19) #10
  %20 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %1, i64 0, i32 0, i32 1
  %21 = load i32, i32* %20, align 8, !tbaa !33
  %22 = trunc i32 %21 to i16
  %23 = getelementptr inbounds %struct.macrodef_struct, %struct.macrodef_struct* %4, i64 0, i32 1
  store i16 %22, i16* %23, align 4, !tbaa !36
  %24 = lshr i16 %7, 6
  %25 = and i16 %24, 2
  %26 = getelementptr inbounds %struct.macrodef_struct, %struct.macrodef_struct* %4, i64 0, i32 2
  store i16 %25, i16* %26, align 2, !tbaa !38
  %27 = and i16 %7, 63
  %28 = icmp eq i16 %27, 1
  br i1 %28, label %29, label %33

; <label>:29:                                     ; preds = %18
  %30 = tail call i8* @cpp_macro_definition(%struct.cpp_reader* %0, %struct.cpp_hashnode* nonnull %1) #10
  %31 = tail call i64 @strlen(i8* %30) #11
  %32 = trunc i64 %31 to i32
  br label %37

; <label>:33:                                     ; preds = %18
  %34 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %1, i64 0, i32 0, i32 0
  %35 = load i8*, i8** %34, align 8, !tbaa !35
  %36 = and i32 %21, 65535
  br label %37

; <label>:37:                                     ; preds = %33, %29
  %38 = phi i8* [ %30, %29 ], [ %35, %33 ]
  %39 = phi i32 [ %32, %29 ], [ %36, %33 ]
  %40 = getelementptr inbounds %struct.macrodef_struct, %struct.macrodef_struct* %4, i64 0, i32 0
  store i32 %39, i32* %40, align 4, !tbaa !39
  %41 = call i64 @fwrite(i8* nonnull %19, i64 8, i64 1, %struct._IO_FILE* %5)
  %42 = icmp eq i64 %41, 1
  br i1 %42, label %43, label %48

; <label>:43:                                     ; preds = %37
  %44 = load i32, i32* %40, align 4, !tbaa !39
  %45 = zext i32 %44 to i64
  %46 = tail call i64 @fwrite(i8* %38, i64 1, i64 %45, %struct._IO_FILE* %5)
  %47 = icmp eq i64 %46, %45
  br i1 %47, label %50, label %48

; <label>:48:                                     ; preds = %37, %43
  %49 = tail call zeroext i8 @cpp_errno(%struct.cpp_reader* %0, i32 3, i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str, i64 0, i64 0)) #10
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %19) #10
  br label %51

; <label>:50:                                     ; preds = %43
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %19) #10
  br label %51

; <label>:51:                                     ; preds = %9, %15, %3, %48, %50
  %52 = phi i32 [ 1, %50 ], [ 0, %48 ], [ 1, %3 ], [ 1, %15 ], [ 1, %9 ]
  ret i32 %52

; <label>:53:                                     ; preds = %3
  tail call void @abort() #12
  unreachable
}

; Function Attrs: nounwind uwtable
define i32 @cpp_write_pch_deps(%struct.cpp_reader*, %struct._IO_FILE* nocapture) local_unnamed_addr #2 {
  %3 = alloca i64, align 8
  %4 = bitcast i64* %3 to i8*
  call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %4) #10
  %5 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 60
  %6 = load %struct.cpp_savedstate*, %struct.cpp_savedstate** %5, align 8, !tbaa !8
  %7 = getelementptr inbounds %struct.cpp_savedstate, %struct.cpp_savedstate* %6, i64 0, i32 1
  %8 = getelementptr inbounds %struct.cpp_savedstate, %struct.cpp_savedstate* %6, i64 0, i32 2
  %9 = bitcast %struct.cpp_savedstate* %6 to i8*
  %10 = bitcast i64* %7 to i8*
  call void @llvm.memset.p0i8.i64(i8* %10, i8 0, i64 16, i32 8, i1 false)
  tail call void @cpp_forall_identifiers(%struct.cpp_reader* %0, i32 (%struct.cpp_reader*, %struct.cpp_hashnode*, i8*)* nonnull @count_defs, i8* %9) #10
  %11 = load i64, i64* %8, align 8, !tbaa !40
  %12 = shl i64 %11, 3
  %13 = tail call i8* @xmalloc(i64 %12) #10
  %14 = getelementptr inbounds %struct.cpp_savedstate, %struct.cpp_savedstate* %6, i64 0, i32 3
  %15 = bitcast %struct.cpp_hashnode*** %14 to i8**
  store i8* %13, i8** %15, align 8, !tbaa !41
  store i64 0, i64* %8, align 8, !tbaa !40
  tail call void @cpp_forall_identifiers(%struct.cpp_reader* %0, i32 (%struct.cpp_reader*, %struct.cpp_hashnode*, i8*)* nonnull @write_defs, i8* %9) #10
  %16 = load i8*, i8** %15, align 8, !tbaa !41
  %17 = load i64, i64* %8, align 8, !tbaa !40
  tail call void @spec_qsort(i8* %16, i64 %17, i64 8, i32 (i8*, i8*)* nonnull @comp_hashnodes) #10
  %18 = load i64, i64* %7, align 8, !tbaa !42
  %19 = tail call i8* @xmalloc(i64 %18) #10
  %20 = getelementptr inbounds %struct.cpp_savedstate, %struct.cpp_savedstate* %6, i64 0, i32 4
  store i8* %19, i8** %20, align 8, !tbaa !43
  %21 = load i64, i64* %8, align 8, !tbaa !40
  %22 = icmp eq i64 %21, 0
  br i1 %22, label %40, label %23

; <label>:23:                                     ; preds = %2
  br label %24

; <label>:24:                                     ; preds = %23, %24
  %25 = phi i64 [ %37, %24 ], [ 0, %23 ]
  %26 = phi i8* [ %36, %24 ], [ %19, %23 ]
  %27 = load %struct.cpp_hashnode**, %struct.cpp_hashnode*** %14, align 8, !tbaa !41
  %28 = getelementptr inbounds %struct.cpp_hashnode*, %struct.cpp_hashnode** %27, i64 %25
  %29 = load %struct.cpp_hashnode*, %struct.cpp_hashnode** %28, align 8, !tbaa !2
  %30 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %29, i64 0, i32 0, i32 1
  %31 = load i32, i32* %30, align 8, !tbaa !33
  %32 = zext i32 %31 to i64
  %33 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %29, i64 0, i32 0, i32 0
  %34 = load i8*, i8** %33, align 8, !tbaa !35
  %35 = add nuw nsw i64 %32, 1
  tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %26, i8* %34, i64 %35, i32 1, i1 false)
  %36 = getelementptr inbounds i8, i8* %26, i64 %35
  %37 = add i64 %25, 1
  %38 = load i64, i64* %8, align 8, !tbaa !40
  %39 = icmp ult i64 %37, %38
  br i1 %39, label %24, label %40

; <label>:40:                                     ; preds = %24, %2
  store i64 0, i64* %3, align 8
  %41 = load i64, i64* %7, align 8, !tbaa !42
  %42 = trunc i64 %41 to i32
  %43 = bitcast i64* %3 to i32*
  store i32 %42, i32* %43, align 8, !tbaa !39
  %44 = call i64 @fwrite(i8* nonnull %4, i64 8, i64 1, %struct._IO_FILE* %1)
  %45 = icmp eq i64 %44, 1
  br i1 %45, label %46, label %51

; <label>:46:                                     ; preds = %40
  %47 = load i8*, i8** %20, align 8, !tbaa !43
  %48 = load i64, i64* %7, align 8, !tbaa !42
  %49 = tail call i64 @fwrite(i8* %47, i64 %48, i64 1, %struct._IO_FILE* %1)
  %50 = icmp eq i64 %49, 1
  br i1 %50, label %53, label %51

; <label>:51:                                     ; preds = %46, %40
  %52 = tail call zeroext i8 @cpp_errno(%struct.cpp_reader* %0, i32 3, i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str, i64 0, i64 0)) #10
  br label %61

; <label>:53:                                     ; preds = %46
  %54 = load i8*, i8** %20, align 8, !tbaa !43
  tail call void @free(i8* %54) #10
  tail call void @free(i8* nonnull %9) #10
  store %struct.cpp_savedstate* null, %struct.cpp_savedstate** %5, align 8, !tbaa !8
  %55 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 61
  %56 = bitcast i32* %55 to i8*
  %57 = tail call i64 @fwrite(i8* %56, i64 4, i64 1, %struct._IO_FILE* %1)
  %58 = icmp eq i64 %57, 1
  br i1 %58, label %61, label %59

; <label>:59:                                     ; preds = %53
  %60 = tail call zeroext i8 @cpp_errno(%struct.cpp_reader* nonnull %0, i32 3, i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str, i64 0, i64 0)) #10
  br label %61

; <label>:61:                                     ; preds = %53, %59, %51
  %62 = phi i32 [ -1, %51 ], [ -1, %59 ], [ 0, %53 ]
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %4) #10
  ret i32 %62
}

; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #5

; Function Attrs: nounwind uwtable
define internal i32 @count_defs(%struct.cpp_reader* nocapture readnone, %struct.cpp_hashnode* nocapture readonly, i8* nocapture) #2 {
  %4 = alloca %struct.cpp_string, align 8
  %5 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %1, i64 0, i32 3
  %6 = load i16, i16* %5, align 2
  %7 = trunc i16 %6 to i6
  switch i6 %7, label %35 [
    i6 1, label %8
    i6 0, label %11
    i6 2, label %36
  ]

; <label>:8:                                      ; preds = %3
  %9 = and i16 %6, 256
  %10 = icmp eq i16 %9, 0
  br i1 %10, label %11, label %36

; <label>:11:                                     ; preds = %8, %3
  %12 = bitcast %struct.cpp_string* %4 to i8*
  call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %12) #10
  %13 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %1, i64 0, i32 0, i32 1
  %14 = load i32, i32* %13, align 8, !tbaa !33
  %15 = getelementptr inbounds %struct.cpp_string, %struct.cpp_string* %4, i64 0, i32 0
  store i32 %14, i32* %15, align 8, !tbaa !27
  %16 = bitcast %struct.cpp_hashnode* %1 to i64*
  %17 = load i64, i64* %16, align 8, !tbaa !35
  %18 = getelementptr inbounds %struct.cpp_string, %struct.cpp_string* %4, i64 0, i32 1
  %19 = bitcast i8** %18 to i64*
  store i64 %17, i64* %19, align 8, !tbaa !29
  %20 = bitcast i8* %2 to %struct.htab**
  %21 = load %struct.htab*, %struct.htab** %20, align 8, !tbaa !25
  %22 = call i8* @htab_find(%struct.htab* %21, i8* nonnull %12) #10
  %23 = icmp eq i8* %22, null
  br i1 %23, label %24, label %34

; <label>:24:                                     ; preds = %11
  %25 = load i32, i32* %13, align 8, !tbaa !33
  %26 = add i32 %25, 1
  %27 = zext i32 %26 to i64
  %28 = getelementptr inbounds i8, i8* %2, i64 8
  %29 = bitcast i8* %28 to <2 x i64>*
  %30 = load <2 x i64>, <2 x i64>* %29, align 8, !tbaa !44
  %31 = insertelement <2 x i64> <i64 undef, i64 1>, i64 %27, i32 0
  %32 = add <2 x i64> %30, %31
  %33 = bitcast i8* %28 to <2 x i64>*
  store <2 x i64> %32, <2 x i64>* %33, align 8, !tbaa !44
  br label %34

; <label>:34:                                     ; preds = %24, %11
  call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %12) #10
  br label %36

; <label>:35:                                     ; preds = %3
  tail call void @abort() #12
  unreachable

; <label>:36:                                     ; preds = %3, %8, %34
  ret i32 1
}

; Function Attrs: nounwind uwtable
define internal i32 @write_defs(%struct.cpp_reader* nocapture readnone, %struct.cpp_hashnode*, i8* nocapture) #2 {
  %4 = alloca %struct.cpp_string, align 8
  %5 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %1, i64 0, i32 3
  %6 = load i16, i16* %5, align 2
  %7 = trunc i16 %6 to i6
  switch i6 %7, label %34 [
    i6 1, label %8
    i6 0, label %11
    i6 2, label %35
  ]

; <label>:8:                                      ; preds = %3
  %9 = and i16 %6, 256
  %10 = icmp eq i16 %9, 0
  br i1 %10, label %11, label %35

; <label>:11:                                     ; preds = %8, %3
  %12 = bitcast %struct.cpp_string* %4 to i8*
  call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %12) #10
  %13 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %1, i64 0, i32 0, i32 1
  %14 = load i32, i32* %13, align 8, !tbaa !33
  %15 = getelementptr inbounds %struct.cpp_string, %struct.cpp_string* %4, i64 0, i32 0
  store i32 %14, i32* %15, align 8, !tbaa !27
  %16 = bitcast %struct.cpp_hashnode* %1 to i64*
  %17 = load i64, i64* %16, align 8, !tbaa !35
  %18 = getelementptr inbounds %struct.cpp_string, %struct.cpp_string* %4, i64 0, i32 1
  %19 = bitcast i8** %18 to i64*
  store i64 %17, i64* %19, align 8, !tbaa !29
  %20 = bitcast i8* %2 to %struct.htab**
  %21 = load %struct.htab*, %struct.htab** %20, align 8, !tbaa !25
  %22 = call i8* @htab_find(%struct.htab* %21, i8* nonnull %12) #10
  %23 = icmp eq i8* %22, null
  br i1 %23, label %24, label %33

; <label>:24:                                     ; preds = %11
  %25 = getelementptr inbounds i8, i8* %2, i64 24
  %26 = bitcast i8* %25 to %struct.cpp_hashnode***
  %27 = load %struct.cpp_hashnode**, %struct.cpp_hashnode*** %26, align 8, !tbaa !41
  %28 = getelementptr inbounds i8, i8* %2, i64 16
  %29 = bitcast i8* %28 to i64*
  %30 = load i64, i64* %29, align 8, !tbaa !40
  %31 = getelementptr inbounds %struct.cpp_hashnode*, %struct.cpp_hashnode** %27, i64 %30
  store %struct.cpp_hashnode* %1, %struct.cpp_hashnode** %31, align 8, !tbaa !2
  %32 = add i64 %30, 1
  store i64 %32, i64* %29, align 8, !tbaa !40
  br label %33

; <label>:33:                                     ; preds = %24, %11
  call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %12) #10
  br label %35

; <label>:34:                                     ; preds = %3
  tail call void @abort() #12
  unreachable

; <label>:35:                                     ; preds = %3, %8, %33
  ret i32 1
}

declare void @spec_qsort(i8*, i64, i64, i32 (i8*, i8*)*) local_unnamed_addr #1

; Function Attrs: nounwind readonly uwtable
define internal i32 @comp_hashnodes(i8* nocapture readonly, i8* nocapture readonly) #4 {
  %3 = bitcast i8* %0 to %struct.cpp_hashnode**
  %4 = load %struct.cpp_hashnode*, %struct.cpp_hashnode** %3, align 8, !tbaa !2
  %5 = bitcast i8* %1 to %struct.cpp_hashnode**
  %6 = load %struct.cpp_hashnode*, %struct.cpp_hashnode** %5, align 8, !tbaa !2
  %7 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %4, i64 0, i32 0, i32 0
  %8 = load i8*, i8** %7, align 8, !tbaa !35
  %9 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %6, i64 0, i32 0, i32 0
  %10 = load i8*, i8** %9, align 8, !tbaa !35
  %11 = tail call i32 @strcmp(i8* %8, i8* %10) #11
  ret i32 %11
}

; Function Attrs: argmemonly nounwind
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i32, i1) #5

; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #5

; Function Attrs: argmemonly nounwind
declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i32, i1) #5

; Function Attrs: nounwind
declare i64 @fwrite(i8* nocapture, i64, i64, %struct._IO_FILE* nocapture) local_unnamed_addr #6

declare zeroext i8 @cpp_errno(%struct.cpp_reader*, i32, i8*) local_unnamed_addr #1

; Function Attrs: nounwind
declare void @free(i8* nocapture) local_unnamed_addr #6

; Function Attrs: nounwind uwtable
define i32 @cpp_write_pch_state(%struct.cpp_reader*, %struct._IO_FILE*) local_unnamed_addr #2 {
  %3 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 45
  %4 = load %struct.deps*, %struct.deps** %3, align 8, !tbaa !45
  %5 = icmp eq %struct.deps* %4, null
  br i1 %5, label %6, label %8

; <label>:6:                                      ; preds = %2
  %7 = tail call %struct.deps* @deps_init() #10
  store %struct.deps* %7, %struct.deps** %3, align 8, !tbaa !45
  br label %8

; <label>:8:                                      ; preds = %2, %6
  %9 = phi %struct.deps* [ %4, %2 ], [ %7, %6 ]
  %10 = tail call i32 @deps_save(%struct.deps* %9, %struct._IO_FILE* %1) #10
  %11 = icmp eq i32 %10, 0
  br i1 %11, label %14, label %12

; <label>:12:                                     ; preds = %8
  %13 = tail call zeroext i8 @cpp_errno(%struct.cpp_reader* nonnull %0, i32 3, i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str, i64 0, i64 0)) #10
  br label %31

; <label>:14:                                     ; preds = %8
  %15 = tail call zeroext i8 @_cpp_save_file_entries(%struct.cpp_reader* nonnull %0, %struct._IO_FILE* %1) #10
  %16 = icmp eq i8 %15, 0
  br i1 %16, label %17, label %19

; <label>:17:                                     ; preds = %14
  %18 = tail call zeroext i8 @cpp_errno(%struct.cpp_reader* nonnull %0, i32 3, i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str, i64 0, i64 0)) #10
  br label %31

; <label>:19:                                     ; preds = %14
  %20 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 61
  %21 = bitcast i32* %20 to i8*
  %22 = tail call i64 @fwrite(i8* %21, i64 4, i64 1, %struct._IO_FILE* %1)
  %23 = icmp eq i64 %22, 1
  br i1 %23, label %26, label %24

; <label>:24:                                     ; preds = %19
  %25 = tail call zeroext i8 @cpp_errno(%struct.cpp_reader* nonnull %0, i32 3, i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str, i64 0, i64 0)) #10
  br label %31

; <label>:26:                                     ; preds = %19
  %27 = tail call fastcc i32 @_cpp_save_pushed_macros(%struct.cpp_reader* nonnull %0, %struct._IO_FILE* %1)
  %28 = icmp eq i32 %27, 0
  br i1 %28, label %29, label %31

; <label>:29:                                     ; preds = %26
  %30 = tail call zeroext i8 @cpp_errno(%struct.cpp_reader* nonnull %0, i32 3, i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str, i64 0, i64 0)) #10
  br label %31

; <label>:31:                                     ; preds = %26, %29, %24, %17, %12
  %32 = phi i32 [ -1, %12 ], [ -1, %24 ], [ -1, %29 ], [ -1, %17 ], [ 0, %26 ]
  ret i32 %32
}

declare %struct.deps* @deps_init() local_unnamed_addr #1

declare i32 @deps_save(%struct.deps*, %struct._IO_FILE*) local_unnamed_addr #1

declare zeroext i8 @_cpp_save_file_entries(%struct.cpp_reader*, %struct._IO_FILE*) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define internal fastcc i32 @_cpp_save_pushed_macros(%struct.cpp_reader*, %struct._IO_FILE* nocapture) unnamed_addr #2 {
  %3 = alloca i64, align 8
  %4 = alloca i64, align 8
  %5 = bitcast i64* %3 to i8*
  call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %5) #10
  store i64 0, i64* %3, align 8, !tbaa !44
  %6 = bitcast i64* %4 to i8*
  call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %6) #10
  %7 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 63
  %8 = load %struct.def_pragma_macro*, %struct.def_pragma_macro** %7, align 8, !tbaa !2
  %9 = icmp eq %struct.def_pragma_macro* %8, null
  br i1 %9, label %19, label %10

; <label>:10:                                     ; preds = %2
  br label %11

; <label>:11:                                     ; preds = %10, %11
  %12 = phi i64 [ %14, %11 ], [ 0, %10 ]
  %13 = phi %struct.def_pragma_macro* [ %16, %11 ], [ %8, %10 ]
  %14 = add i64 %12, 1
  %15 = getelementptr inbounds %struct.def_pragma_macro, %struct.def_pragma_macro* %13, i64 0, i32 0
  %16 = load %struct.def_pragma_macro*, %struct.def_pragma_macro** %15, align 8, !tbaa !2
  %17 = icmp eq %struct.def_pragma_macro* %16, null
  br i1 %17, label %18, label %11

; <label>:18:                                     ; preds = %11
  store i64 %14, i64* %3, align 8, !tbaa !44
  br label %19

; <label>:19:                                     ; preds = %18, %2
  %20 = call i64 @fwrite(i8* nonnull %5, i64 8, i64 1, %struct._IO_FILE* %1)
  %21 = icmp eq i64 %20, 1
  br i1 %21, label %22, label %75

; <label>:22:                                     ; preds = %19
  %23 = load i64, i64* %3, align 8, !tbaa !44
  %24 = icmp eq i64 %23, 0
  br i1 %24, label %75, label %25

; <label>:25:                                     ; preds = %22
  %26 = shl i64 %23, 3
  %27 = alloca i8, i64 %26, align 16
  %28 = bitcast i8* %27 to %struct.def_pragma_macro**
  %29 = load %struct.def_pragma_macro*, %struct.def_pragma_macro** %7, align 8, !tbaa !2
  %30 = icmp eq %struct.def_pragma_macro* %29, null
  br i1 %30, label %40, label %31

; <label>:31:                                     ; preds = %25
  br label %32

; <label>:32:                                     ; preds = %31, %32
  %33 = phi %struct.def_pragma_macro* [ %38, %32 ], [ %29, %31 ]
  %34 = phi i64 [ %35, %32 ], [ %23, %31 ]
  %35 = add i64 %34, -1
  %36 = getelementptr inbounds %struct.def_pragma_macro*, %struct.def_pragma_macro** %28, i64 %35
  store %struct.def_pragma_macro* %33, %struct.def_pragma_macro** %36, align 8, !tbaa !2
  %37 = getelementptr inbounds %struct.def_pragma_macro, %struct.def_pragma_macro* %33, i64 0, i32 0
  %38 = load %struct.def_pragma_macro*, %struct.def_pragma_macro** %37, align 8, !tbaa !2
  %39 = icmp eq %struct.def_pragma_macro* %38, null
  br i1 %39, label %40, label %32

; <label>:40:                                     ; preds = %32, %25
  br label %41

; <label>:41:                                     ; preds = %40, %71
  %42 = phi i64 [ %73, %71 ], [ 0, %40 ]
  %43 = getelementptr inbounds %struct.def_pragma_macro*, %struct.def_pragma_macro** %28, i64 %42
  %44 = load %struct.def_pragma_macro*, %struct.def_pragma_macro** %43, align 8, !tbaa !2
  %45 = getelementptr inbounds %struct.def_pragma_macro, %struct.def_pragma_macro* %44, i64 0, i32 1
  %46 = load i8*, i8** %45, align 8, !tbaa !46
  %47 = tail call %struct.cpp_macro* @cpp_push_definition(%struct.cpp_reader* %0, i8* %46) #10
  %48 = load i8*, i8** %45, align 8, !tbaa !46
  %49 = getelementptr inbounds %struct.def_pragma_macro, %struct.def_pragma_macro* %44, i64 0, i32 2
  %50 = load %struct.cpp_macro*, %struct.cpp_macro** %49, align 8, !tbaa !48
  tail call void @cpp_pop_definition(%struct.cpp_reader* %0, i8* %48, %struct.cpp_macro* %50) #10
  %51 = load i8*, i8** %45, align 8, !tbaa !46
  %52 = tail call %struct.cpp_hashnode* @_cpp_lex_identifier(%struct.cpp_reader* %0, i8* %51) #10
  %53 = load i8*, i8** %45, align 8, !tbaa !46
  %54 = tail call i64 @strlen(i8* %53) #11
  store i64 %54, i64* %4, align 8, !tbaa !44
  %55 = call i64 @fwrite(i8* nonnull %6, i64 8, i64 1, %struct._IO_FILE* %1)
  %56 = icmp eq i64 %55, 1
  br i1 %56, label %57, label %75

; <label>:57:                                     ; preds = %41
  %58 = load i8*, i8** %45, align 8, !tbaa !46
  %59 = load i64, i64* %4, align 8, !tbaa !44
  %60 = tail call i64 @fwrite(i8* %58, i64 %59, i64 1, %struct._IO_FILE* %1)
  %61 = icmp eq i64 %60, 1
  br i1 %61, label %62, label %75

; <label>:62:                                     ; preds = %57
  %63 = tail call i8* @cpp_macro_definition(%struct.cpp_reader* %0, %struct.cpp_hashnode* %52) #10
  %64 = tail call i64 @strlen(i8* %63) #11
  store i64 %64, i64* %4, align 8, !tbaa !44
  %65 = call i64 @fwrite(i8* nonnull %6, i64 8, i64 1, %struct._IO_FILE* %1)
  %66 = icmp eq i64 %65, 1
  br i1 %66, label %67, label %75

; <label>:67:                                     ; preds = %62
  %68 = load i64, i64* %4, align 8, !tbaa !44
  %69 = tail call i64 @fwrite(i8* %63, i64 %68, i64 1, %struct._IO_FILE* %1)
  %70 = icmp eq i64 %69, 1
  br i1 %70, label %71, label %75

; <label>:71:                                     ; preds = %67
  %72 = load i8*, i8** %45, align 8, !tbaa !46
  tail call void @cpp_pop_definition(%struct.cpp_reader* %0, i8* %72, %struct.cpp_macro* %47) #10
  %73 = add nuw i64 %42, 1
  %74 = icmp ult i64 %73, %23
  br i1 %74, label %41, label %75

; <label>:75:                                     ; preds = %57, %41, %67, %62, %71, %22, %19
  %76 = phi i32 [ 0, %19 ], [ 1, %22 ], [ 0, %57 ], [ 0, %41 ], [ 0, %67 ], [ 0, %62 ], [ 1, %71 ]
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %6) #10
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %5) #10
  ret i32 %76
}

; Function Attrs: nounwind uwtable
define i32 @cpp_valid_state(%struct.cpp_reader*, i8*, i32) local_unnamed_addr #2 {
  %4 = alloca %struct.macrodef_struct, align 4
  %5 = alloca %struct.ht_node_list, align 8
  %6 = alloca i32, align 4
  %7 = bitcast %struct.macrodef_struct* %4 to i8*
  call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %7) #10
  %8 = tail call i8* @xmalloc(i64 256) #10
  %9 = bitcast %struct.ht_node_list* %5 to i8*
  call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull %9) #10
  call void @llvm.memset.p0i8.i64(i8* nonnull %9, i8 0, i64 24, i32 8, i1 false)
  %10 = bitcast i32* %6 to i8*
  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %10) #10
  %11 = getelementptr inbounds %struct.macrodef_struct, %struct.macrodef_struct* %4, i64 0, i32 1
  %12 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 53, i32 32
  %13 = getelementptr inbounds %struct.macrodef_struct, %struct.macrodef_struct* %4, i64 0, i32 0
  %14 = getelementptr inbounds %struct.macrodef_struct, %struct.macrodef_struct* %4, i64 0, i32 2
  br label %15

; <label>:15:                                     ; preds = %82, %3
  %16 = phi i8* [ %8, %3 ], [ %36, %82 ]
  %17 = phi i64 [ 256, %3 ], [ %37, %82 ]
  br label %18

; <label>:18:                                     ; preds = %15, %93
  %19 = call i64 @read(i32 %2, i8* nonnull %7, i64 8) #10
  %20 = icmp eq i64 %19, 8
  br i1 %20, label %21, label %165

; <label>:21:                                     ; preds = %18
  %22 = load i16, i16* %11, align 4, !tbaa !36
  %23 = icmp eq i16 %22, 0
  br i1 %23, label %96, label %24

; <label>:24:                                     ; preds = %21
  %25 = load i8, i8* %12, align 2, !tbaa !49
  %26 = icmp eq i8 %25, 0
  %27 = load i32, i32* %13, align 4, !tbaa !39
  %28 = zext i32 %27 to i64
  br i1 %26, label %29, label %93

; <label>:29:                                     ; preds = %24
  %30 = icmp ult i64 %17, %28
  br i1 %30, label %31, label %35

; <label>:31:                                     ; preds = %29
  tail call void @free(i8* %16) #10
  %32 = add i32 %27, 256
  %33 = zext i32 %32 to i64
  %34 = tail call i8* @xmalloc(i64 %33) #10
  br label %35

; <label>:35:                                     ; preds = %31, %29
  %36 = phi i8* [ %34, %31 ], [ %16, %29 ]
  %37 = phi i64 [ %33, %31 ], [ %17, %29 ]
  %38 = tail call i64 @read(i32 %2, i8* %36, i64 %28) #10
  %39 = icmp eq i64 %38, %28
  br i1 %39, label %40, label %165

; <label>:40:                                     ; preds = %35
  %41 = zext i16 %22 to i32
  %42 = tail call %struct.cpp_hashnode* @cpp_lookup(%struct.cpp_reader* nonnull %0, i8* %36, i32 %41) #10
  %43 = load i16, i16* %14, align 2, !tbaa !38
  %44 = and i16 %43, 2
  %45 = icmp eq i16 %44, 0
  br i1 %45, label %46, label %52

; <label>:46:                                     ; preds = %40
  %47 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %42, i64 0, i32 3
  %48 = load i16, i16* %47, align 2
  %49 = lshr i16 %48, 6
  %50 = and i16 %49, 2
  %51 = icmp eq i16 %50, 0
  br i1 %51, label %58, label %52

; <label>:52:                                     ; preds = %46, %40
  %53 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 53, i32 41
  %54 = load i8, i8* %53, align 4, !tbaa !50
  %55 = icmp eq i8 %54, 0
  br i1 %55, label %167, label %56

; <label>:56:                                     ; preds = %52
  %57 = tail call zeroext i8 (%struct.cpp_reader*, i32, i8*, ...) @cpp_error(%struct.cpp_reader* nonnull %0, i32 1, i8* getelementptr inbounds ([40 x i8], [40 x i8]* @.str.1, i64 0, i64 0), i8* %1, i32 %41, i8* %36) #10
  br label %167

; <label>:58:                                     ; preds = %46
  %59 = and i16 %48, 63
  %60 = icmp eq i16 %59, 1
  br i1 %60, label %75, label %61

; <label>:61:                                     ; preds = %58
  %62 = trunc i16 %49 to i8
  %63 = icmp sgt i8 %62, -1
  %64 = icmp eq i16 %22, 25
  %65 = and i1 %64, %63
  br i1 %65, label %66, label %69

; <label>:66:                                     ; preds = %61
  %67 = tail call i32 @memcmp(i8* %36, i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str.2, i64 0, i64 0), i64 25) #11
  %68 = icmp eq i32 %67, 0
  br i1 %68, label %82, label %69

; <label>:69:                                     ; preds = %61, %66
  %70 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 53, i32 41
  %71 = load i8, i8* %70, align 4, !tbaa !50
  %72 = icmp eq i8 %71, 0
  br i1 %72, label %167, label %73

; <label>:73:                                     ; preds = %69
  %74 = tail call zeroext i8 (%struct.cpp_reader*, i32, i8*, ...) @cpp_error(%struct.cpp_reader* nonnull %0, i32 1, i8* getelementptr inbounds ([40 x i8], [40 x i8]* @.str.3, i64 0, i64 0), i8* %1, i32 %41, i8* %36) #10
  br label %167

; <label>:75:                                     ; preds = %58
  %76 = tail call i8* @cpp_macro_definition(%struct.cpp_reader* nonnull %0, %struct.cpp_hashnode* nonnull %42) #10
  %77 = tail call i64 @strlen(i8* %76) #11
  %78 = icmp eq i64 %77, %28
  br i1 %78, label %79, label %83

; <label>:79:                                     ; preds = %75
  %80 = tail call i32 @memcmp(i8* %36, i8* %76, i64 %28) #11
  %81 = icmp eq i32 %80, 0
  br i1 %81, label %82, label %83

; <label>:82:                                     ; preds = %79, %66
  br label %15

; <label>:83:                                     ; preds = %79, %75
  %84 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 53, i32 41
  %85 = load i8, i8* %84, align 4, !tbaa !50
  %86 = icmp eq i8 %85, 0
  br i1 %86, label %167, label %87

; <label>:87:                                     ; preds = %83
  %88 = zext i16 %22 to i64
  %89 = getelementptr inbounds i8, i8* %76, i64 %88
  %90 = sub i32 %27, %41
  %91 = getelementptr inbounds i8, i8* %36, i64 %88
  %92 = tail call zeroext i8 (%struct.cpp_reader*, i32, i8*, ...) @cpp_error(%struct.cpp_reader* nonnull %0, i32 1, i8* getelementptr inbounds ([55 x i8], [55 x i8]* @.str.4, i64 0, i64 0), i8* %1, i32 %41, i8* %36, i8* %89, i32 %90, i8* %91) #10
  br label %167

; <label>:93:                                     ; preds = %24
  %94 = tail call i64 @lseek(i32 %2, i64 %28, i32 1) #10
  %95 = icmp eq i64 %94, -1
  br i1 %95, label %165, label %18

; <label>:96:                                     ; preds = %21
  tail call void @free(i8* %16) #10
  %97 = load i32, i32* %13, align 4, !tbaa !39
  %98 = zext i32 %97 to i64
  %99 = tail call i8* @xmalloc(i64 %98) #10
  %100 = tail call i64 @read(i32 %2, i8* %99, i64 %98) #10
  %101 = icmp eq i64 %100, %98
  br i1 %101, label %102, label %165

; <label>:102:                                    ; preds = %96
  %103 = getelementptr inbounds %struct.ht_node_list, %struct.ht_node_list* %5, i64 0, i32 1
  %104 = bitcast i64* %103 to <2 x i64>*
  store <2 x i64> <i64 0, i64 10>, <2 x i64>* %104, align 8, !tbaa !44
  %105 = tail call i8* @xmalloc(i64 80) #10
  %106 = getelementptr inbounds %struct.ht_node_list, %struct.ht_node_list* %5, i64 0, i32 0
  %107 = bitcast %struct.ht_node_list* %5 to i8**
  store i8* %105, i8** %107, align 8, !tbaa !51
  call void @cpp_forall_identifiers(%struct.cpp_reader* %0, i32 (%struct.cpp_reader*, %struct.cpp_hashnode*, i8*)* nonnull @collect_ht_nodes, i8* nonnull %9) #10
  %108 = load i8*, i8** %107, align 8, !tbaa !51
  %109 = load i64, i64* %103, align 8, !tbaa !53
  call void @spec_qsort(i8* %108, i64 %109, i64 8, i32 (i8*, i8*)* nonnull @comp_hashnodes) #10
  %110 = getelementptr inbounds i8, i8* %99, i64 %98
  %111 = icmp eq i32 %97, 0
  br i1 %111, label %112, label %114

; <label>:112:                                    ; preds = %102
  %113 = load i8*, i8** %107, align 8, !tbaa !51
  br label %148

; <label>:114:                                    ; preds = %102
  %115 = load i64, i64* %103, align 8, !tbaa !53
  %116 = load %struct.cpp_hashnode**, %struct.cpp_hashnode*** %106, align 8
  %117 = bitcast %struct.cpp_hashnode** %116 to i8*
  br label %118

; <label>:118:                                    ; preds = %114, %144
  %119 = phi i32 [ 0, %114 ], [ %146, %144 ]
  %120 = phi i8* [ %99, %114 ], [ %145, %144 ]
  %121 = zext i32 %119 to i64
  %122 = icmp ugt i64 %115, %121
  br i1 %122, label %123, label %148

; <label>:123:                                    ; preds = %118
  %124 = getelementptr inbounds %struct.cpp_hashnode*, %struct.cpp_hashnode** %116, i64 %121
  %125 = load %struct.cpp_hashnode*, %struct.cpp_hashnode** %124, align 8, !tbaa !2
  %126 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %125, i64 0, i32 0, i32 0
  %127 = load i8*, i8** %126, align 8, !tbaa !35
  %128 = call i32 @strcmp(i8* %120, i8* %127) #11
  %129 = icmp slt i32 %128, 0
  br i1 %129, label %130, label %134

; <label>:130:                                    ; preds = %123
  %131 = call i64 @strlen(i8* %120) #11
  %132 = add i64 %131, 1
  %133 = getelementptr inbounds i8, i8* %120, i64 %132
  br label %144

; <label>:134:                                    ; preds = %123
  %135 = icmp eq i32 %128, 0
  br i1 %135, label %138, label %136

; <label>:136:                                    ; preds = %134
  %137 = add i32 %119, 1
  br label %144

; <label>:138:                                    ; preds = %134
  %139 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 53, i32 41
  %140 = load i8, i8* %139, align 4, !tbaa !50
  %141 = icmp eq i8 %140, 0
  br i1 %141, label %170, label %142

; <label>:142:                                    ; preds = %138
  %143 = call zeroext i8 (%struct.cpp_reader*, i32, i8*, ...) @cpp_error(%struct.cpp_reader* nonnull %0, i32 1, i8* getelementptr inbounds ([37 x i8], [37 x i8]* @.str.5, i64 0, i64 0), i8* %1, i8* %120) #10
  br label %170

; <label>:144:                                    ; preds = %136, %130
  %145 = phi i8* [ %120, %136 ], [ %133, %130 ]
  %146 = phi i32 [ %137, %136 ], [ %119, %130 ]
  %147 = icmp ult i8* %145, %110
  br i1 %147, label %118, label %148

; <label>:148:                                    ; preds = %118, %144, %112
  %149 = phi i8* [ %113, %112 ], [ %117, %144 ], [ %117, %118 ]
  call void @free(i8* %149) #10
  store %struct.cpp_hashnode** null, %struct.cpp_hashnode*** %106, align 8, !tbaa !51
  call void @free(i8* %99) #10
  %150 = call i64 @read(i32 %2, i8* nonnull %10, i64 4) #10
  %151 = icmp eq i64 %150, 4
  br i1 %151, label %152, label %165

; <label>:152:                                    ; preds = %148
  %153 = load i32, i32* %6, align 4, !tbaa !6
  %154 = icmp eq i32 %153, 0
  br i1 %154, label %179, label %155

; <label>:155:                                    ; preds = %152
  %156 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 61
  %157 = load i32, i32* %156, align 8, !tbaa !54
  %158 = icmp eq i32 %157, 0
  br i1 %158, label %179, label %159

; <label>:159:                                    ; preds = %155
  %160 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 53, i32 41
  %161 = load i8, i8* %160, align 4, !tbaa !50
  %162 = icmp eq i8 %161, 0
  br i1 %162, label %173, label %163

; <label>:163:                                    ; preds = %159
  %164 = call zeroext i8 (%struct.cpp_reader*, i32, i8*, ...) @cpp_error(%struct.cpp_reader* nonnull %0, i32 1, i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.6, i64 0, i64 0), i8* %1) #10
  br label %173

; <label>:165:                                    ; preds = %35, %93, %18, %148, %96
  %166 = call zeroext i8 @cpp_errno(%struct.cpp_reader* %0, i32 3, i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.7, i64 0, i64 0)) #10
  br label %179

; <label>:167:                                    ; preds = %87, %83, %73, %69, %56, %52
  %168 = icmp eq i8* %36, null
  br i1 %168, label %173, label %169

; <label>:169:                                    ; preds = %167
  tail call void @free(i8* nonnull %36) #10
  br label %173

; <label>:170:                                    ; preds = %142, %138
  %171 = icmp eq i8* %99, null
  br i1 %171, label %173, label %172

; <label>:172:                                    ; preds = %170
  call void @free(i8* nonnull %99) #10
  br label %173

; <label>:173:                                    ; preds = %163, %159, %169, %167, %170, %172
  %174 = getelementptr inbounds %struct.ht_node_list, %struct.ht_node_list* %5, i64 0, i32 0
  %175 = load %struct.cpp_hashnode**, %struct.cpp_hashnode*** %174, align 8, !tbaa !51
  %176 = icmp eq %struct.cpp_hashnode** %175, null
  br i1 %176, label %179, label %177

; <label>:177:                                    ; preds = %173
  %178 = bitcast %struct.cpp_hashnode** %175 to i8*
  call void @free(i8* %178) #10
  br label %179

; <label>:179:                                    ; preds = %177, %173, %152, %155, %165
  %180 = phi i32 [ -1, %165 ], [ 0, %155 ], [ 0, %152 ], [ 1, %173 ], [ 1, %177 ]
  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %10) #10
  call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %9) #10
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %7) #10
  ret i32 %180
}

declare i64 @read(i32, i8* nocapture, i64) local_unnamed_addr #1

; Function Attrs: nounwind
declare i64 @lseek(i32, i64, i32) local_unnamed_addr #6

declare %struct.cpp_hashnode* @cpp_lookup(%struct.cpp_reader*, i8*, i32) local_unnamed_addr #1

declare zeroext i8 @cpp_error(%struct.cpp_reader*, i32, i8*, ...) local_unnamed_addr #1

; Function Attrs: nounwind readonly
declare i32 @memcmp(i8* nocapture, i8* nocapture, i64) local_unnamed_addr #7

declare i8* @cpp_macro_definition(%struct.cpp_reader*, %struct.cpp_hashnode*) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define internal i32 @collect_ht_nodes(%struct.cpp_reader* nocapture readnone, %struct.cpp_hashnode*, i8* nocapture) #2 {
  %4 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %1, i64 0, i32 3
  %5 = load i16, i16* %4, align 2
  %6 = and i16 %5, 63
  %7 = icmp ne i16 %6, 0
  %8 = trunc i16 %5 to i8
  %9 = icmp slt i8 %8, 0
  %10 = or i1 %7, %9
  br i1 %10, label %11, label %35

; <label>:11:                                     ; preds = %3
  %12 = getelementptr inbounds i8, i8* %2, i64 8
  %13 = bitcast i8* %12 to i64*
  %14 = load i64, i64* %13, align 8, !tbaa !53
  %15 = getelementptr inbounds i8, i8* %2, i64 16
  %16 = bitcast i8* %15 to i64*
  %17 = load i64, i64* %16, align 8, !tbaa !55
  %18 = icmp eq i64 %14, %17
  br i1 %18, label %22, label %19

; <label>:19:                                     ; preds = %11
  %20 = bitcast i8* %2 to %struct.cpp_hashnode***
  %21 = load %struct.cpp_hashnode**, %struct.cpp_hashnode*** %20, align 8, !tbaa !51
  br label %30

; <label>:22:                                     ; preds = %11
  %23 = shl i64 %14, 1
  store i64 %23, i64* %16, align 8, !tbaa !55
  %24 = bitcast i8* %2 to i8**
  %25 = load i8*, i8** %24, align 8, !tbaa !51
  %26 = shl i64 %14, 4
  %27 = tail call i8* @xrealloc(i8* %25, i64 %26) #10
  store i8* %27, i8** %24, align 8, !tbaa !51
  %28 = bitcast i8* %27 to %struct.cpp_hashnode**
  %29 = load i64, i64* %13, align 8, !tbaa !53
  br label %30

; <label>:30:                                     ; preds = %19, %22
  %31 = phi i64 [ %14, %19 ], [ %29, %22 ]
  %32 = phi %struct.cpp_hashnode** [ %21, %19 ], [ %28, %22 ]
  %33 = getelementptr inbounds %struct.cpp_hashnode*, %struct.cpp_hashnode** %32, i64 %31
  store %struct.cpp_hashnode* %1, %struct.cpp_hashnode** %33, align 8, !tbaa !2
  %34 = add i64 %31, 1
  store i64 %34, i64* %13, align 8, !tbaa !53
  br label %35

; <label>:35:                                     ; preds = %3, %30
  ret i32 1
}

; Function Attrs: nounwind uwtable
define void @cpp_prepare_state(%struct.cpp_reader*, %struct.save_macro_data** nocapture) local_unnamed_addr #2 {
  %3 = tail call i8* @xmalloc(i64 32) #10
  %4 = getelementptr inbounds i8, i8* %3, i64 16
  %5 = bitcast i8* %4 to i64*
  store i64 512, i64* %5, align 8, !tbaa !56
  %6 = tail call i8* @xmalloc(i64 4096) #10
  %7 = bitcast i8* %3 to i8**
  store i8* %6, i8** %7, align 8, !tbaa !58
  %8 = getelementptr inbounds i8, i8* %3, i64 8
  %9 = bitcast i8* %8 to i64*
  store i64 0, i64* %9, align 8, !tbaa !59
  tail call void @cpp_forall_identifiers(%struct.cpp_reader* %0, i32 (%struct.cpp_reader*, %struct.cpp_hashnode*, i8*)* nonnull @save_macros, i8* %3) #10
  %10 = tail call i8** @_cpp_save_pragma_names(%struct.cpp_reader* %0) #10
  %11 = getelementptr inbounds i8, i8* %3, i64 24
  %12 = bitcast i8* %11 to i8***
  store i8** %10, i8*** %12, align 8, !tbaa !60
  %13 = bitcast %struct.save_macro_data** %1 to i8**
  store i8* %3, i8** %13, align 8, !tbaa !2
  ret void
}

; Function Attrs: nounwind uwtable
define internal i32 @save_macros(%struct.cpp_reader*, %struct.cpp_hashnode*, i8* nocapture) #2 {
  %4 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %1, i64 0, i32 3
  %5 = load i16, i16* %4, align 2
  %6 = and i16 %5, 63
  %7 = icmp ne i16 %6, 0
  %8 = and i16 %5, 256
  %9 = icmp eq i16 %8, 0
  %10 = and i1 %7, %9
  br i1 %10, label %11, label %45

; <label>:11:                                     ; preds = %3
  %12 = getelementptr inbounds i8, i8* %2, i64 8
  %13 = bitcast i8* %12 to i64*
  %14 = load i64, i64* %13, align 8, !tbaa !59
  %15 = getelementptr inbounds i8, i8* %2, i64 16
  %16 = bitcast i8* %15 to i64*
  %17 = load i64, i64* %16, align 8, !tbaa !56
  %18 = icmp eq i64 %14, %17
  br i1 %18, label %19, label %26

; <label>:19:                                     ; preds = %11
  %20 = shl i64 %14, 1
  store i64 %20, i64* %16, align 8, !tbaa !56
  %21 = bitcast i8* %2 to i8**
  %22 = load i8*, i8** %21, align 8, !tbaa !58
  %23 = shl i64 %14, 4
  %24 = tail call i8* @xrealloc(i8* %22, i64 %23) #10
  store i8* %24, i8** %21, align 8, !tbaa !58
  %25 = load i16, i16* %4, align 2
  br label %26

; <label>:26:                                     ; preds = %19, %11
  %27 = phi i16 [ %25, %19 ], [ %5, %11 ]
  %28 = trunc i16 %27 to i6
  switch i6 %28, label %44 [
    i6 2, label %45
    i6 1, label %29
  ]

; <label>:29:                                     ; preds = %26
  %30 = tail call i8* @cpp_macro_definition(%struct.cpp_reader* %0, %struct.cpp_hashnode* nonnull %1) #10
  %31 = tail call i64 @strlen(i8* %30) #11
  %32 = add i64 %31, 2
  %33 = tail call i8* @xmemdup(i8* %30, i64 %31, i64 %32) #10
  %34 = bitcast i8* %2 to i8***
  %35 = load i8**, i8*** %34, align 8, !tbaa !58
  %36 = load i64, i64* %13, align 8, !tbaa !59
  %37 = getelementptr inbounds i8*, i8** %35, i64 %36
  store i8* %33, i8** %37, align 8, !tbaa !2
  %38 = load i8**, i8*** %34, align 8, !tbaa !58
  %39 = getelementptr inbounds i8*, i8** %38, i64 %36
  %40 = load i8*, i8** %39, align 8, !tbaa !2
  %41 = getelementptr inbounds i8, i8* %40, i64 %31
  store i8 10, i8* %41, align 1, !tbaa !30
  %42 = load i64, i64* %13, align 8, !tbaa !59
  %43 = add i64 %42, 1
  store i64 %43, i64* %13, align 8, !tbaa !59
  br label %45

; <label>:44:                                     ; preds = %26
  tail call void @abort() #12
  unreachable

; <label>:45:                                     ; preds = %29, %3, %26
  ret i32 1
}

declare i8** @_cpp_save_pragma_names(%struct.cpp_reader*) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define i32 @cpp_read_state(%struct.cpp_reader*, i8*, %struct._IO_FILE*, %struct.save_macro_data* nocapture) local_unnamed_addr #2 {
  %5 = alloca i64, align 8
  %6 = alloca i64, align 8
  %7 = alloca i64, align 8
  %8 = alloca %struct.lexer_state, align 4
  %9 = alloca i32, align 4
  %10 = getelementptr inbounds %struct.lexer_state, %struct.lexer_state* %8, i64 0, i32 0
  call void @llvm.lifetime.start.p0i8(i64 20, i8* nonnull %10)
  %11 = bitcast i32* %9 to i8*
  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %11) #10
  %12 = tail call %struct.cpp_hashnode* @cpp_lookup(%struct.cpp_reader* %0, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.8, i64 0, i64 0), i32 7) #10
  %13 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 54, i32 0
  store %struct.cpp_hashnode* %12, %struct.cpp_hashnode** %13, align 8, !tbaa !61
  %14 = tail call %struct.cpp_hashnode* @cpp_lookup(%struct.cpp_reader* %0, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.9, i64 0, i64 0), i32 4) #10
  %15 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 54, i32 1
  store %struct.cpp_hashnode* %14, %struct.cpp_hashnode** %15, align 8, !tbaa !62
  %16 = tail call %struct.cpp_hashnode* @cpp_lookup(%struct.cpp_reader* %0, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.10, i64 0, i64 0), i32 5) #10
  %17 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 54, i32 2
  store %struct.cpp_hashnode* %16, %struct.cpp_hashnode** %17, align 8, !tbaa !63
  %18 = tail call %struct.cpp_hashnode* @cpp_lookup(%struct.cpp_reader* %0, i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.11, i64 0, i64 0), i32 11) #10
  %19 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 54, i32 3
  store %struct.cpp_hashnode* %18, %struct.cpp_hashnode** %19, align 8, !tbaa !64
  %20 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 2, i32 0
  call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull %10, i8* %20, i64 20, i32 4, i1 false), !tbaa.struct !65
  store i8 1, i8* %20, align 8, !tbaa !66
  %21 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 2, i32 8
  store i8 1, i8* %21, align 8, !tbaa !67
  %22 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 2, i32 3
  store i8 0, i8* %22, align 1, !tbaa !68
  %23 = getelementptr inbounds %struct.save_macro_data, %struct.save_macro_data* %3, i64 0, i32 1
  %24 = load i64, i64* %23, align 8, !tbaa !59
  %25 = icmp eq i64 %24, 0
  br i1 %25, label %67, label %26

; <label>:26:                                     ; preds = %4
  %27 = getelementptr inbounds %struct.save_macro_data, %struct.save_macro_data* %3, i64 0, i32 0
  br label %28

; <label>:28:                                     ; preds = %26, %62
  %29 = phi i64 [ 0, %26 ], [ %64, %62 ]
  %30 = load i8**, i8*** %27, align 8, !tbaa !58
  %31 = getelementptr inbounds i8*, i8** %30, i64 %29
  %32 = load i8*, i8** %31, align 8, !tbaa !2
  %33 = tail call i64 @strcspn(i8* %32, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.12, i64 0, i64 0)) #11
  %34 = trunc i64 %33 to i32
  %35 = shl i64 %33, 32
  %36 = ashr exact i64 %35, 32
  %37 = tail call %struct.cpp_hashnode* @cpp_lookup(%struct.cpp_reader* %0, i8* %32, i32 %34) #10
  %38 = load i8**, i8*** %27, align 8, !tbaa !58
  %39 = getelementptr inbounds i8*, i8** %38, i64 %29
  %40 = load i8*, i8** %39, align 8, !tbaa !2
  %41 = getelementptr inbounds i8, i8* %40, i64 %36
  %42 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %37, i64 0, i32 3
  %43 = load i16, i16* %42, align 2
  %44 = and i16 %43, 63
  %45 = icmp eq i16 %44, 0
  br i1 %45, label %46, label %62

; <label>:46:                                     ; preds = %28
  %47 = tail call i8* @strchr(i8* %41, i32 10) #11
  %48 = ptrtoint i8* %47 to i64
  %49 = ptrtoint i8* %41 to i64
  %50 = sub i64 %48, %49
  %51 = tail call %struct.cpp_buffer* @cpp_push_buffer(%struct.cpp_reader* %0, i8* %41, i64 %50, i32 1) #10
  %52 = icmp eq %struct.cpp_buffer* %51, null
  br i1 %52, label %61, label %53

; <label>:53:                                     ; preds = %46
  tail call void @_cpp_clean_line(%struct.cpp_reader* %0) #10
  %54 = tail call zeroext i8 @_cpp_create_definition(%struct.cpp_reader* %0, %struct.cpp_hashnode* %37) #10
  %55 = icmp eq i8 %54, 0
  br i1 %55, label %56, label %57

; <label>:56:                                     ; preds = %53
  tail call void @abort() #12
  unreachable

; <label>:57:                                     ; preds = %53
  tail call void @_cpp_pop_buffer(%struct.cpp_reader* %0) #10
  %58 = load i8**, i8*** %27, align 8, !tbaa !58
  %59 = getelementptr inbounds i8*, i8** %58, i64 %29
  %60 = load i8*, i8** %59, align 8, !tbaa !2
  br label %62

; <label>:61:                                     ; preds = %46
  tail call void @abort() #12
  unreachable

; <label>:62:                                     ; preds = %57, %28
  %63 = phi i8* [ %60, %57 ], [ %40, %28 ]
  tail call void @free(i8* %63) #10
  %64 = add i64 %29, 1
  %65 = load i64, i64* %23, align 8, !tbaa !59
  %66 = icmp ult i64 %64, %65
  br i1 %66, label %28, label %67

; <label>:67:                                     ; preds = %62, %4
  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %20, i8* nonnull %10, i64 20, i32 4, i1 false), !tbaa.struct !65
  %68 = getelementptr inbounds %struct.save_macro_data, %struct.save_macro_data* %3, i64 0, i32 3
  %69 = load i8**, i8*** %68, align 8, !tbaa !60
  tail call void @_cpp_restore_pragma_names(%struct.cpp_reader* %0, i8** %69) #10
  %70 = bitcast %struct.save_macro_data* %3 to i8*
  tail call void @free(i8* %70) #10
  %71 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 45
  %72 = load %struct.deps*, %struct.deps** %71, align 8, !tbaa !45
  %73 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 53, i32 42
  %74 = load i8, i8* %73, align 1, !tbaa !69
  %75 = icmp eq i8 %74, 0
  %76 = select i1 %75, i8* null, i8* %1
  %77 = tail call i32 @deps_restore(%struct.deps* %72, %struct._IO_FILE* %2, i8* %76) #10
  %78 = icmp eq i32 %77, 0
  br i1 %78, label %79, label %171

; <label>:79:                                     ; preds = %67
  %80 = tail call zeroext i8 @_cpp_read_file_entries(%struct.cpp_reader* nonnull %0, %struct._IO_FILE* %2) #10
  %81 = icmp eq i8 %80, 0
  br i1 %81, label %171, label %82

; <label>:82:                                     ; preds = %79
  %83 = call i64 @fread(i8* nonnull %11, i64 4, i64 1, %struct._IO_FILE* %2)
  %84 = icmp eq i64 %83, 1
  br i1 %84, label %85, label %171

; <label>:85:                                     ; preds = %82
  %86 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 61
  %87 = load i32, i32* %86, align 8, !tbaa !54
  %88 = icmp eq i32 %87, 0
  br i1 %88, label %89, label %91

; <label>:89:                                     ; preds = %85
  %90 = load i32, i32* %9, align 4, !tbaa !6
  store i32 %90, i32* %86, align 8, !tbaa !54
  br label %91

; <label>:91:                                     ; preds = %85, %89
  %92 = bitcast i64* %5 to i8*
  call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %92) #10
  store i64 0, i64* %5, align 8, !tbaa !44
  %93 = bitcast i64* %6 to i8*
  call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %93) #10
  %94 = bitcast i64* %7 to i8*
  call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %94) #10
  %95 = call i64 @fread(i8* nonnull %92, i64 8, i64 1, %struct._IO_FILE* %2) #10
  %96 = icmp eq i64 %95, 1
  br i1 %96, label %97, label %166

; <label>:97:                                     ; preds = %91
  %98 = load i64, i64* %5, align 8, !tbaa !44
  %99 = icmp eq i64 %98, 0
  br i1 %99, label %173, label %100

; <label>:100:                                    ; preds = %97
  %101 = getelementptr inbounds %struct.cpp_reader, %struct.cpp_reader* %0, i64 0, i32 63
  %102 = bitcast %struct.def_pragma_macro** %101 to i64*
  %103 = bitcast %struct.def_pragma_macro** %101 to i8**
  br label %104

; <label>:104:                                    ; preds = %154, %100
  %105 = phi i64 [ 0, %100 ], [ %162, %154 ]
  %106 = call i64 @fread(i8* nonnull %93, i64 8, i64 1, %struct._IO_FILE* %2) #10
  %107 = icmp eq i64 %106, 1
  br i1 %107, label %108, label %167

; <label>:108:                                    ; preds = %104
  %109 = tail call i8* @xmalloc(i64 24) #10
  %110 = load i64, i64* %6, align 8, !tbaa !44
  %111 = add i64 %110, 1
  %112 = tail call i8* @xmalloc(i64 %111) #10
  %113 = getelementptr inbounds i8, i8* %109, i64 8
  %114 = bitcast i8* %113 to i8**
  store i8* %112, i8** %114, align 8, !tbaa !46
  %115 = getelementptr inbounds i8, i8* %112, i64 %110
  store i8 0, i8* %115, align 1, !tbaa !30
  %116 = load i8*, i8** %114, align 8, !tbaa !46
  %117 = tail call i64 @fread(i8* %116, i64 %110, i64 1, %struct._IO_FILE* %2) #10
  %118 = icmp eq i64 %117, 1
  br i1 %118, label %119, label %168

; <label>:119:                                    ; preds = %108
  %120 = load i8*, i8** %114, align 8, !tbaa !46
  %121 = tail call %struct.cpp_macro* @cpp_push_definition(%struct.cpp_reader* nonnull %0, i8* %120) #10
  %122 = call i64 @fread(i8* nonnull %94, i64 8, i64 1, %struct._IO_FILE* %2) #10
  %123 = icmp eq i64 %122, 1
  br i1 %123, label %124, label %169

; <label>:124:                                    ; preds = %119
  %125 = load i64, i64* %7, align 8, !tbaa !44
  %126 = add i64 %125, 2
  %127 = tail call i8* @xmalloc(i64 %126) #10
  %128 = getelementptr inbounds i8, i8* %127, i64 %125
  store i8 10, i8* %128, align 1, !tbaa !30
  %129 = add i64 %125, 1
  %130 = getelementptr inbounds i8, i8* %127, i64 %129
  store i8 0, i8* %130, align 1, !tbaa !30
  %131 = tail call i64 @fread(i8* %127, i64 %125, i64 1, %struct._IO_FILE* %2) #10
  %132 = icmp eq i64 %131, 1
  br i1 %132, label %133, label %170

; <label>:133:                                    ; preds = %124
  %134 = load i8*, i8** %114, align 8, !tbaa !46
  tail call void @cpp_pop_definition(%struct.cpp_reader* nonnull %0, i8* %134, %struct.cpp_macro* null) #10
  %135 = tail call i64 @strcspn(i8* %127, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.12, i64 0, i64 0)) #11
  %136 = trunc i64 %135 to i32
  %137 = shl i64 %135, 32
  %138 = ashr exact i64 %137, 32
  %139 = tail call %struct.cpp_hashnode* @cpp_lookup(%struct.cpp_reader* nonnull %0, i8* %127, i32 %136) #10
  %140 = getelementptr inbounds i8, i8* %127, i64 %138
  %141 = getelementptr inbounds %struct.cpp_hashnode, %struct.cpp_hashnode* %139, i64 0, i32 3
  %142 = load i16, i16* %141, align 2
  %143 = and i16 %142, -10688
  store i16 %143, i16* %141, align 2
  %144 = tail call i8* @strchr(i8* %140, i32 10) #11
  %145 = ptrtoint i8* %144 to i64
  %146 = ptrtoint i8* %140 to i64
  %147 = sub i64 %145, %146
  %148 = tail call %struct.cpp_buffer* @cpp_push_buffer(%struct.cpp_reader* nonnull %0, i8* %140, i64 %147, i32 1) #10
  %149 = icmp eq %struct.cpp_buffer* %148, null
  br i1 %149, label %164, label %150

; <label>:150:                                    ; preds = %133
  tail call void @_cpp_clean_line(%struct.cpp_reader* %0) #10
  %151 = tail call zeroext i8 @_cpp_create_definition(%struct.cpp_reader* %0, %struct.cpp_hashnode* %139) #10
  %152 = icmp eq i8 %151, 0
  br i1 %152, label %153, label %154

; <label>:153:                                    ; preds = %150
  tail call void @abort() #12
  unreachable

; <label>:154:                                    ; preds = %150
  tail call void @_cpp_pop_buffer(%struct.cpp_reader* %0) #10
  %155 = load i8*, i8** %114, align 8, !tbaa !46
  %156 = tail call %struct.cpp_macro* @cpp_push_definition(%struct.cpp_reader* %0, i8* %155) #10
  %157 = getelementptr inbounds i8, i8* %109, i64 16
  %158 = bitcast i8* %157 to %struct.cpp_macro**
  store %struct.cpp_macro* %156, %struct.cpp_macro** %158, align 8, !tbaa !48
  tail call void @free(i8* %127) #10
  %159 = load i64, i64* %102, align 8, !tbaa !70
  %160 = bitcast i8* %109 to i64*
  store i64 %159, i64* %160, align 8, !tbaa !71
  store i8* %109, i8** %103, align 8, !tbaa !70
  %161 = load i8*, i8** %114, align 8, !tbaa !46
  tail call void @cpp_pop_definition(%struct.cpp_reader* %0, i8* %161, %struct.cpp_macro* %121) #10
  %162 = add nuw i64 %105, 1
  %163 = icmp ult i64 %162, %98
  br i1 %163, label %104, label %165

; <label>:164:                                    ; preds = %133
  tail call void @abort() #12
  unreachable

; <label>:165:                                    ; preds = %154
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %94) #10
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %93) #10
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %92) #10
  br label %174

; <label>:166:                                    ; preds = %91
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %94) #10
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %93) #10
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %92) #10
  br label %171

; <label>:167:                                    ; preds = %104
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %94) #10
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %93) #10
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %92) #10
  br label %171

; <label>:168:                                    ; preds = %108
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %94) #10
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %93) #10
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %92) #10
  br label %171

; <label>:169:                                    ; preds = %119
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %94) #10
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %93) #10
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %92) #10
  br label %171

; <label>:170:                                    ; preds = %124
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %94) #10
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %93) #10
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %92) #10
  br label %171

; <label>:171:                                    ; preds = %170, %169, %168, %167, %166, %82, %79, %67
  %172 = tail call zeroext i8 @cpp_errno(%struct.cpp_reader* nonnull %0, i32 3, i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.7, i64 0, i64 0)) #10
  br label %174

; <label>:173:                                    ; preds = %97
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %94) #10
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %93) #10
  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %92) #10
  br label %174

; <label>:174:                                    ; preds = %165, %173, %171
  %175 = phi i32 [ -1, %171 ], [ 0, %165 ], [ 0, %173 ]
  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %11) #10
  call void @llvm.lifetime.end.p0i8(i64 20, i8* nonnull %10)
  ret i32 %175
}

declare %struct.cpp_buffer* @cpp_push_buffer(%struct.cpp_reader*, i8*, i64, i32) local_unnamed_addr #1

declare void @_cpp_clean_line(%struct.cpp_reader*) local_unnamed_addr #1

declare zeroext i8 @_cpp_create_definition(%struct.cpp_reader*, %struct.cpp_hashnode*) local_unnamed_addr #1

; Function Attrs: noreturn nounwind
declare void @abort() local_unnamed_addr #8

declare void @_cpp_pop_buffer(%struct.cpp_reader*) local_unnamed_addr #1

declare void @_cpp_restore_pragma_names(%struct.cpp_reader*, i8**) local_unnamed_addr #1

declare i32 @deps_restore(%struct.deps*, %struct._IO_FILE*, i8*) local_unnamed_addr #1

declare zeroext i8 @_cpp_read_file_entries(%struct.cpp_reader*, %struct._IO_FILE*) local_unnamed_addr #1

; Function Attrs: nounwind
declare i64 @fread(i8* nocapture, i64, i64, %struct._IO_FILE* nocapture) local_unnamed_addr #6

declare i8** @htab_find_slot(%struct.htab*, i8*, i32) local_unnamed_addr #1

declare i8* @htab_find(%struct.htab*, i8*) local_unnamed_addr #1

declare %struct.cpp_macro* @cpp_push_definition(%struct.cpp_reader*, i8*) local_unnamed_addr #1

declare void @cpp_pop_definition(%struct.cpp_reader*, i8*, %struct.cpp_macro*) local_unnamed_addr #1

declare %struct.cpp_hashnode* @_cpp_lex_identifier(%struct.cpp_reader*, i8*) local_unnamed_addr #1

; Function Attrs: argmemonly nounwind readonly
declare i64 @strlen(i8* nocapture) local_unnamed_addr #9

declare i8* @xrealloc(i8*, i64) local_unnamed_addr #1

; Function Attrs: nounwind readonly
declare i32 @strcmp(i8* nocapture, i8* nocapture) local_unnamed_addr #7

declare i8* @xmemdup(i8*, i64, i64) local_unnamed_addr #1

; Function Attrs: nounwind readonly
declare i64 @strcspn(i8* nocapture, i8* nocapture) local_unnamed_addr #7

; Function Attrs: nounwind readonly
declare i8* @strchr(i8*, i32) local_unnamed_addr #7

attributes #0 = { inlinehint nounwind readonly uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #2 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #3 = { norecurse nounwind readonly uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #4 = { nounwind readonly uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #5 = { argmemonly nounwind }
attributes #6 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #7 = { nounwind readonly "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #8 = { noreturn nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #9 = { argmemonly nounwind readonly "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #10 = { nounwind }
attributes #11 = { nounwind readonly }
attributes #12 = { noreturn nounwind }

!llvm.module.flags = !{!0}
!llvm.ident = !{!1}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{!"clang version 5.0.1 (tags/RELEASE_501/final)"}
!2 = !{!3, !3, i64 0}
!3 = !{!"any pointer", !4, i64 0}
!4 = !{!"omnipotent char", !5, i64 0}
!5 = !{!"Simple C/C++ TBAA"}
!6 = !{!7, !7, i64 0}
!7 = !{!"int", !4, i64 0}
!8 = !{!9, !3, i64 1264}
!9 = !{!"cpp_reader", !3, i64 0, !3, i64 8, !10, i64 16, !3, i64 40, !7, i64 48, !3, i64 56, !3, i64 64, !3, i64 72, !11, i64 80, !3, i64 136, !3, i64 144, !12, i64 152, !7, i64 176, !4, i64 180, !3, i64 184, !3, i64 192, !14, i64 200, !3, i64 264, !3, i64 272, !3, i64 280, !3, i64 288, !3, i64 296, !3, i64 304, !16, i64 312, !4, i64 400, !4, i64 401, !3, i64 408, !3, i64 416, !4, i64 424, !3, i64 432, !17, i64 440, !3, i64 472, !7, i64 480, !7, i64 484, !3, i64 488, !7, i64 496, !18, i64 504, !18, i64 528, !18, i64 552, !18, i64 576, !18, i64 600, !3, i64 624, !3, i64 632, !12, i64 640, !12, i64 664, !3, i64 688, !16, i64 696, !16, i64 784, !3, i64 872, !19, i64 880, !3, i64 1016, !3, i64 1024, !3, i64 1032, !20, i64 1040, !22, i64 1168, !4, i64 1200, !23, i64 1208, !3, i64 1240, !3, i64 1248, !3, i64 1256, !3, i64 1264, !7, i64 1272, !24, i64 1280, !3, i64 1296}
!10 = !{!"lexer_state", !4, i64 0, !4, i64 1, !4, i64 2, !4, i64 3, !4, i64 4, !4, i64 5, !4, i64 6, !4, i64 7, !4, i64 8, !4, i64 9, !4, i64 10, !7, i64 12, !4, i64 16, !4, i64 17}
!11 = !{!"cpp_context", !3, i64 0, !3, i64 8, !4, i64 16, !3, i64 32, !3, i64 40, !4, i64 48}
!12 = !{!"cpp_token", !7, i64 0, !7, i64 4, !13, i64 6, !4, i64 8}
!13 = !{!"short", !4, i64 0}
!14 = !{!"cpp_dir", !3, i64 0, !3, i64 8, !7, i64 16, !4, i64 20, !4, i64 21, !3, i64 24, !3, i64 32, !3, i64 40, !15, i64 48, !15, i64 56}
!15 = !{!"long", !4, i64 0}
!16 = !{!"obstack", !15, i64 0, !3, i64 8, !3, i64 16, !3, i64 24, !3, i64 32, !15, i64 40, !7, i64 48, !3, i64 56, !3, i64 64, !3, i64 72, !7, i64 80, !7, i64 80, !7, i64 80}
!17 = !{!"tokenrun", !3, i64 0, !3, i64 8, !3, i64 16, !3, i64 24}
!18 = !{!"cset_converter", !3, i64 0, !3, i64 8, !7, i64 16}
!19 = !{!"cpp_callbacks", !3, i64 0, !3, i64 8, !3, i64 16, !3, i64 24, !3, i64 32, !3, i64 40, !3, i64 48, !3, i64 56, !3, i64 64, !3, i64 72, !3, i64 80, !3, i64 88, !3, i64 96, !3, i64 104, !3, i64 112, !3, i64 120, !3, i64 128}
!20 = !{!"cpp_options", !7, i64 0, !4, i64 4, !4, i64 8, !4, i64 9, !4, i64 10, !4, i64 11, !4, i64 12, !4, i64 13, !4, i64 14, !4, i64 15, !4, i64 16, !4, i64 17, !4, i64 18, !4, i64 19, !4, i64 20, !4, i64 21, !4, i64 22, !4, i64 23, !4, i64 24, !4, i64 25, !4, i64 26, !4, i64 27, !4, i64 28, !4, i64 29, !4, i64 30, !4, i64 31, !4, i64 32, !4, i64 33, !4, i64 34, !4, i64 35, !4, i64 36, !4, i64 37, !4, i64 38, !4, i64 39, !4, i64 40, !4, i64 41, !4, i64 42, !3, i64 48, !3, i64 56, !3, i64 64, !4, i64 72, !4, i64 76, !4, i64 77, !21, i64 80, !15, i64 88, !15, i64 96, !15, i64 104, !15, i64 112, !4, i64 120, !4, i64 121, !4, i64 122, !4, i64 123, !4, i64 124}
!21 = !{!"", !4, i64 0, !4, i64 4, !4, i64 5, !4, i64 6, !4, i64 7}
!22 = !{!"spec_nodes", !3, i64 0, !3, i64 8, !3, i64 16, !3, i64 24}
!23 = !{!"", !3, i64 0, !3, i64 8, !3, i64 16, !7, i64 24}
!24 = !{!"", !3, i64 0, !7, i64 8, !7, i64 12}
!25 = !{!26, !3, i64 0}
!26 = !{!"cpp_savedstate", !3, i64 0, !15, i64 8, !15, i64 16, !3, i64 24, !3, i64 32}
!27 = !{!28, !7, i64 0}
!28 = !{!"cpp_string", !7, i64 0, !3, i64 8}
!29 = !{!28, !3, i64 8}
!30 = !{!4, !4, i64 0}
!31 = distinct !{!31, !32}
!32 = !{!"llvm.loop.unroll.disable"}
!33 = !{!34, !7, i64 8}
!34 = !{!"ht_identifier", !3, i64 0, !7, i64 8, !7, i64 12}
!35 = !{!34, !3, i64 0}
!36 = !{!37, !13, i64 4}
!37 = !{!"macrodef_struct", !7, i64 0, !13, i64 4, !13, i64 6}
!38 = !{!37, !13, i64 6}
!39 = !{!37, !7, i64 0}
!40 = !{!26, !15, i64 16}
!41 = !{!26, !3, i64 24}
!42 = !{!26, !15, i64 8}
!43 = !{!26, !3, i64 32}
!44 = !{!15, !15, i64 0}
!45 = !{!9, !3, i64 688}
!46 = !{!47, !3, i64 8}
!47 = !{!"def_pragma_macro", !3, i64 0, !3, i64 8, !3, i64 16}
!48 = !{!47, !3, i64 16}
!49 = !{!9, !4, i64 1078}
!50 = !{!9, !4, i64 1116}
!51 = !{!52, !3, i64 0}
!52 = !{!"ht_node_list", !3, i64 0, !15, i64 8, !15, i64 16}
!53 = !{!52, !15, i64 8}
!54 = !{!9, !7, i64 1272}
!55 = !{!52, !15, i64 16}
!56 = !{!57, !15, i64 16}
!57 = !{!"save_macro_data", !3, i64 0, !15, i64 8, !15, i64 16, !3, i64 24}
!58 = !{!57, !3, i64 0}
!59 = !{!57, !15, i64 8}
!60 = !{!57, !3, i64 24}
!61 = !{!22, !3, i64 0}
!62 = !{!22, !3, i64 8}
!63 = !{!22, !3, i64 16}
!64 = !{!22, !3, i64 24}
!65 = !{i64 0, i64 1, !30, i64 1, i64 1, !30, i64 2, i64 1, !30, i64 3, i64 1, !30, i64 4, i64 1, !30, i64 5, i64 1, !30, i64 6, i64 1, !30, i64 7, i64 1, !30, i64 8, i64 1, !30, i64 9, i64 1, !30, i64 10, i64 1, !30, i64 12, i64 4, !6, i64 16, i64 1, !30, i64 17, i64 1, !30}
!66 = !{!9, !4, i64 16}
!67 = !{!9, !4, i64 24}
!68 = !{!9, !4, i64 19}
!69 = !{!9, !4, i64 1117}
!70 = !{!9, !3, i64 1296}
!71 = !{!47, !3, i64 0}
sunfishcode commented 2 years ago

This repo was an early experiment, and I'm not currently working on it. If anyone wants to fork it, they're welcome to.