[llvm-commits] [llvm] r42996 - in /llvm/trunk: lib/CodeGen/SimpleRegisterCoalescing.cpp test/CodeGen/X86/2007-10-15-CoalescerCrash.ll

Evan Cheng evan.cheng at apple.com
Mon Oct 15 11:33:51 PDT 2007


Author: evancheng
Date: Mon Oct 15 13:33:50 2007
New Revision: 42996

URL: http://llvm.org/viewvc/llvm-project?rev=42996&view=rev
Log:
Fix PR1729: watch out for val# with no def.

Added:
    llvm/trunk/test/CodeGen/X86/2007-10-15-CoalescerCrash.ll
Modified:
    llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp

Modified: llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp?rev=42996&r1=42995&r2=42996&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp (original)
+++ llvm/trunk/lib/CodeGen/SimpleRegisterCoalescing.cpp Mon Oct 15 13:33:50 2007
@@ -422,14 +422,19 @@
     // then create and update the actual physical register allocated to RHS.
     if (RealDstReg) {
       LiveInterval &RealDstInt = li_->getOrCreateInterval(RealDstReg);
-      for (unsigned i = 0, e = ResSrcInt->getNumValNums(); i != e; ++i) {
-        const VNInfo *SrcValNo = ResSrcInt->getValNumInfo(i);
-        const VNInfo *DstValNo =
-          ResDstInt->FindLiveRangeContaining(SrcValNo->def)->valno;
-        VNInfo *ValNo = RealDstInt.getNextValue(DstValNo->def, DstValNo->reg,
-                                                li_->getVNInfoAllocator());
-        RealDstInt.addKills(ValNo, DstValNo->kills);
-        RealDstInt.MergeValueInAsValue(*ResDstInt, DstValNo, ValNo);
+      SmallSet<const VNInfo*, 4> CopiedValNos;
+      for (LiveInterval::Ranges::const_iterator I = ResSrcInt->ranges.begin(),
+             E = ResSrcInt->ranges.end(); I != E; ++I) {
+        LiveInterval::const_iterator DstLR =
+          ResDstInt->FindLiveRangeContaining(I->start);
+        assert(DstLR != ResDstInt->end() && "Invalid joined interval!");
+        const VNInfo *DstValNo = DstLR->valno;
+        if (CopiedValNos.insert(DstValNo)) {
+          VNInfo *ValNo = RealDstInt.getNextValue(DstValNo->def, DstValNo->reg,
+                                                  li_->getVNInfoAllocator());
+          RealDstInt.addKills(ValNo, DstValNo->kills);
+          RealDstInt.MergeValueInAsValue(*ResDstInt, DstValNo, ValNo);
+        }
       }
       repDstReg = RealDstReg;
     }

Added: llvm/trunk/test/CodeGen/X86/2007-10-15-CoalescerCrash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2007-10-15-CoalescerCrash.ll?rev=42996&view=auto

==============================================================================
--- llvm/trunk/test/CodeGen/X86/2007-10-15-CoalescerCrash.ll (added)
+++ llvm/trunk/test/CodeGen/X86/2007-10-15-CoalescerCrash.ll Mon Oct 15 13:33:50 2007
@@ -0,0 +1,400 @@
+; RUN: llvm-as < %s | llc -mtriple=x86_64-linux-gnu
+; PR1729
+
+	%struct.CUMULATIVE_ARGS = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }
+	%struct.VEC_edge = type { i32, i32, [1 x %struct.edge_def*] }
+	%struct.VEC_tree = type { i32, i32, [1 x %struct.tree_node*] }
+	%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._obstack_chunk = type { i8*, %struct._obstack_chunk*, [4 x i8] }
+	%struct.addr_diff_vec_flags = type <{ i8, i8, i8, i8 }>
+	%struct.alloc_pool_def = type { i8*, i64, i64, %struct.alloc_pool_list_def*, i64, i64, i64, %struct.alloc_pool_list_def*, i64, i64 }
+	%struct.alloc_pool_list_def = type { %struct.alloc_pool_list_def* }
+	%struct.basic_block_def = type { %struct.rtx_def*, %struct.rtx_def*, %struct.tree_node*, %struct.VEC_edge*, %struct.VEC_edge*, %struct.bitmap_head_def*, %struct.bitmap_head_def*, i8*, %struct.loop*, [2 x %struct.et_node*], %struct.basic_block_def*, %struct.basic_block_def*, %struct.reorder_block_def*, %struct.bb_ann_d*, i64, i32, i32, i32, i32 }
+	%struct.bb_ann_d = type opaque
+	%struct.bitmap_element_def = type { %struct.bitmap_element_def*, %struct.bitmap_element_def*, i32, [2 x i64] }
+	%struct.bitmap_head_def = type { %struct.bitmap_element_def*, %struct.bitmap_element_def*, i32, %struct.bitmap_obstack* }
+	%struct.bitmap_obstack = type { %struct.bitmap_element_def*, %struct.bitmap_head_def*, %struct.obstack }
+	%struct.cselib_val_struct = type opaque
+	%struct.dataflow_d = type opaque
+	%struct.die_struct = type opaque
+	%struct.edge_def = type { %struct.basic_block_def*, %struct.basic_block_def*, %struct.edge_def_insns, i8*, %struct.location_t*, i32, i32, i64, i32 }
+	%struct.edge_def_insns = type { %struct.rtx_def* }
+	%struct.edge_iterator = type { i32, %struct.VEC_edge** }
+	%struct.eh_status = type opaque
+	%struct.elt_list = type opaque
+	%struct.emit_status = type { i32, i32, %struct.rtx_def*, %struct.rtx_def*, %struct.sequence_stack*, i32, %struct.location_t, i32, i8*, %struct.rtx_def** }
+	%struct.et_node = type opaque
+	%struct.expr_status = type { i32, i32, i32, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def* }
+	%struct.function = type { %struct.eh_status*, %struct.expr_status*, %struct.emit_status*, %struct.varasm_status*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.function*, i32, i32, i32, i32, %struct.rtx_def*, %struct.CUMULATIVE_ARGS, %struct.rtx_def*, %struct.rtx_def*, %struct.initial_value_struct*, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def*, i8, i32, i64, %struct.tree_node*, %struct.tree_node*, %struct.rtx_def*, %struct.varray_head_tag*, %struct.temp_slot*, i32, %struct.var_refs_queue*, i32, i32, %struct.rtvec_def*, %struct.tree_node*, i32, i32, i32, %struct.machine_function*, i32, i32, i8, i8, %struct.language_function*, %struct.rtx_def*, i32, i32, i32, i32, %struct.location_t, %struct.varray_head_tag*, %struct.tree_node*, %struct.tree_node*, i8, i8, i8 }
+	%struct.ht_identifier = type { i8*, i32, i32 }
+	%struct.initial_value_struct = type opaque
+	%struct.lang_decl = type opaque
+	%struct.lang_type = type opaque
+	%struct.language_function = type opaque
+	%struct.location_t = type { i8*, i32 }
+	%struct.loop = type opaque
+	%struct.machine_function = type { %struct.stack_local_entry*, i8*, %struct.rtx_def*, i32, i32, i32, i32, i32 }
+	%struct.mem_attrs = type { i64, %struct.tree_node*, %struct.rtx_def*, %struct.rtx_def*, i32 }
+	%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.phi_arg_d = type { %struct.tree_node*, i8 }
+	%struct.ptr_info_def = type opaque
+	%struct.real_value = type opaque
+	%struct.reg_attrs = type { %struct.tree_node*, i64 }
+	%struct.reg_info_def = type { i32, i32, i32, i32, i32, i32, i32, i32, i32 }
+	%struct.reorder_block_def = type { %struct.rtx_def*, %struct.rtx_def*, %struct.basic_block_def*, %struct.basic_block_def*, %struct.basic_block_def*, i32, i32, i32 }
+	%struct.rtunion = type { i8* }
+	%struct.rtvec_def = type { i32, [1 x %struct.rtx_def*] }
+	%struct.rtx_def = type { i16, i8, i8, %struct.u }
+	%struct.sequence_stack = type { %struct.rtx_def*, %struct.rtx_def*, %struct.sequence_stack* }
+	%struct.simple_bitmap_def = type { i32, i32, i32, [1 x i64] }
+	%struct.stack_local_entry = type opaque
+	%struct.temp_slot = type opaque
+	%struct.tree_binfo = type { %struct.tree_common, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.VEC_tree*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.VEC_tree }
+	%struct.tree_block = type { %struct.tree_common, i32, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node* }
+	%struct.tree_common = type { %struct.tree_node*, %struct.tree_node*, %union.tree_ann_d*, i8, i8, i8, i8, i8 }
+	%struct.tree_complex = type { %struct.tree_common, %struct.tree_node*, %struct.tree_node* }
+	%struct.tree_decl = type { %struct.tree_common, %struct.location_t, i32, %struct.tree_node*, i8, i8, i8, i8, i8, i8, i8, i8, i32, %struct.tree_decl_u1, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.rtx_def*, i32, %struct.tree_decl_u2, %struct.tree_node*, %struct.tree_node*, i64, %struct.lang_decl* }
+	%struct.tree_decl_u1 = type { i64 }
+	%struct.tree_decl_u1_a = type <{ i32 }>
+	%struct.tree_decl_u2 = type { %struct.function* }
+	%struct.tree_exp = type { %struct.tree_common, %struct.location_t*, i32, %struct.tree_node*, [1 x %struct.tree_node*] }
+	%struct.tree_identifier = type { %struct.tree_common, %struct.ht_identifier }
+	%struct.tree_int_cst = type { %struct.tree_common, %struct.tree_int_cst_lowhi }
+	%struct.tree_int_cst_lowhi = type { i64, i64 }
+	%struct.tree_list = type { %struct.tree_common, %struct.tree_node*, %struct.tree_node* }
+	%struct.tree_node = type { %struct.tree_decl }
+	%struct.tree_phi_node = type { %struct.tree_common, %struct.tree_node*, i32, i32, i32, %struct.basic_block_def*, %struct.dataflow_d*, [1 x %struct.phi_arg_d] }
+	%struct.tree_real_cst = type { %struct.tree_common, %struct.real_value* }
+	%struct.tree_ssa_name = type { %struct.tree_common, %struct.tree_node*, i32, %struct.ptr_info_def*, %struct.tree_node*, i8* }
+	%struct.tree_statement_list = type { %struct.tree_common, %struct.tree_statement_list_node*, %struct.tree_statement_list_node* }
+	%struct.tree_statement_list_node = type { %struct.tree_statement_list_node*, %struct.tree_statement_list_node*, %struct.tree_node* }
+	%struct.tree_string = type { %struct.tree_common, i32, [1 x i8] }
+	%struct.tree_type = type { %struct.tree_common, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, i32, i16, i8, i8, i32, %struct.tree_node*, %struct.tree_node*, %struct.rtunion, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, i64, %struct.lang_type* }
+	%struct.tree_type_symtab = type { i8* }
+	%struct.tree_value_handle = type { %struct.tree_common, %struct.value_set*, i32 }
+	%struct.tree_vec = type { %struct.tree_common, i32, [1 x %struct.tree_node*] }
+	%struct.tree_vector = type { %struct.tree_common, %struct.tree_node* }
+	%struct.u = type { [1 x %struct.rtunion] }
+	%struct.value_set = type opaque
+	%struct.var_refs_queue = type { %struct.rtx_def*, i32, i32, %struct.var_refs_queue* }
+	%struct.varasm_status = type opaque
+	%struct.varray_data = type { [1 x i64] }
+	%struct.varray_head_tag = type { i64, i64, i32, i8*, %struct.varray_data }
+	%union.tree_ann_d = type opaque
+ at first_edge_aux_obj = external global i8*		; <i8**> [#uses=0]
+ at first_block_aux_obj = external global i8*		; <i8**> [#uses=0]
+ at n_edges = external global i32		; <i32*> [#uses=0]
+ at ENTRY_BLOCK_PTR = external global %struct.basic_block_def*		; <%struct.basic_block_def**> [#uses=0]
+ at EXIT_BLOCK_PTR = external global %struct.basic_block_def*		; <%struct.basic_block_def**> [#uses=0]
+ at n_basic_blocks = external global i32		; <i32*> [#uses=0]
+ at .str = external constant [9 x i8]		; <[9 x i8]*> [#uses=0]
+ at rbi_pool = external global %struct.alloc_pool_def*		; <%struct.alloc_pool_def**> [#uses=0]
+ at __FUNCTION__.19643 = external constant [18 x i8]		; <[18 x i8]*> [#uses=0]
+ at .str1 = external constant [20 x i8]		; <[20 x i8]*> [#uses=0]
+ at __FUNCTION__.19670 = external constant [15 x i8]		; <[15 x i8]*> [#uses=0]
+ at basic_block_info = external global %struct.varray_head_tag*		; <%struct.varray_head_tag**> [#uses=0]
+ at last_basic_block = external global i32		; <i32*> [#uses=0]
+ at __FUNCTION__.19696 = external constant [14 x i8]		; <[14 x i8]*> [#uses=0]
+ at __FUNCTION__.20191 = external constant [20 x i8]		; <[20 x i8]*> [#uses=0]
+ at block_aux_obstack = external global %struct.obstack		; <%struct.obstack*> [#uses=0]
+ at __FUNCTION__.20301 = external constant [20 x i8]		; <[20 x i8]*> [#uses=0]
+ at __FUNCTION__.20316 = external constant [19 x i8]		; <[19 x i8]*> [#uses=0]
+ at edge_aux_obstack = external global %struct.obstack		; <%struct.obstack*> [#uses=0]
+ at stderr = external global %struct._IO_FILE*		; <%struct._IO_FILE**> [#uses=0]
+ at __FUNCTION__.20463 = external constant [11 x i8]		; <[11 x i8]*> [#uses=0]
+ at .str2 = external constant [7 x i8]		; <[7 x i8]*> [#uses=0]
+ at .str3 = external constant [6 x i8]		; <[6 x i8]*> [#uses=0]
+ at .str4 = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
+ at .str5 = external constant [11 x i8]		; <[11 x i8]*> [#uses=0]
+ at .str6 = external constant [8 x i8]		; <[8 x i8]*> [#uses=0]
+ at .str7 = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
+ at bitnames.20157 = external constant [13 x i8*]		; <[13 x i8*]*> [#uses=0]
+ at .str8 = external constant [9 x i8]		; <[9 x i8]*> [#uses=0]
+ at .str9 = external constant [3 x i8]		; <[3 x i8]*> [#uses=0]
+ at .str10 = external constant [7 x i8]		; <[7 x i8]*> [#uses=0]
+ at .str11 = external constant [3 x i8]		; <[3 x i8]*> [#uses=0]
+ at .str12 = external constant [5 x i8]		; <[5 x i8]*> [#uses=0]
+ at .str13 = external constant [9 x i8]		; <[9 x i8]*> [#uses=0]
+ at .str14 = external constant [13 x i8]		; <[13 x i8]*> [#uses=0]
+ at .str15 = external constant [12 x i8]		; <[12 x i8]*> [#uses=0]
+ at .str16 = external constant [8 x i8]		; <[8 x i8]*> [#uses=0]
+ at .str17 = external constant [10 x i8]		; <[10 x i8]*> [#uses=0]
+ at .str18 = external constant [5 x i8]		; <[5 x i8]*> [#uses=0]
+ at .str19 = external constant [6 x i8]		; <[6 x i8]*> [#uses=0]
+ at .str20 = external constant [5 x i8]		; <[5 x i8]*> [#uses=0]
+ at .str21 = external constant [3 x i8]		; <[3 x i8]*> [#uses=0]
+ at .str22 = external constant [3 x i8]		; <[3 x i8]*> [#uses=0]
+ at __FUNCTION__.19709 = external constant [20 x i8]		; <[20 x i8]*> [#uses=0]
+ at .str23 = external constant [5 x i8]		; <[5 x i8]*> [#uses=0]
+ at .str24 = external constant [10 x i8]		; <[10 x i8]*> [#uses=0]
+ at __FUNCTION__.19813 = external constant [19 x i8]		; <[19 x i8]*> [#uses=0]
+ at .str25 = external constant [7 x i8]		; <[7 x i8]*> [#uses=0]
+ at .str26 = external constant [6 x i8]		; <[6 x i8]*> [#uses=0]
+ at initialized.20241.b = external global i1		; <i1*> [#uses=0]
+ at __FUNCTION__.20244 = external constant [21 x i8]		; <[21 x i8]*> [#uses=0]
+ at __FUNCTION__.19601 = external constant [12 x i8]		; <[12 x i8]*> [#uses=0]
+ at __FUNCTION__.14571 = external constant [8 x i8]		; <[8 x i8]*> [#uses=0]
+ at __FUNCTION__.14535 = external constant [13 x i8]		; <[13 x i8]*> [#uses=0]
+ at .str27 = external constant [28 x i8]		; <[28 x i8]*> [#uses=0]
+ at __FUNCTION__.14589 = external constant [8 x i8]		; <[8 x i8]*> [#uses=0]
+ at __FUNCTION__.19792 = external constant [12 x i8]		; <[12 x i8]*> [#uses=0]
+ at __FUNCTION__.19851 = external constant [19 x i8]		; <[19 x i8]*> [#uses=0]
+ at profile_status = external global i32		; <i32*> [#uses=0]
+ at .str29 = external constant [46 x i8]		; <[46 x i8]*> [#uses=0]
+ at .str30 = external constant [49 x i8]		; <[49 x i8]*> [#uses=0]
+ at .str31 = external constant [54 x i8]		; <[54 x i8]*> [#uses=0]
+ at .str32 = external constant [49 x i8]		; <[49 x i8]*> [#uses=1]
+ at __FUNCTION__.19948 = external constant [15 x i8]		; <[15 x i8]*> [#uses=0]
+ at reg_n_info = external global %struct.varray_head_tag*		; <%struct.varray_head_tag**> [#uses=0]
+ at reload_completed = external global i32		; <i32*> [#uses=0]
+ at .str33 = external constant [15 x i8]		; <[15 x i8]*> [#uses=0]
+ at .str34 = external constant [43 x i8]		; <[43 x i8]*> [#uses=0]
+ at .str35 = external constant [13 x i8]		; <[13 x i8]*> [#uses=0]
+ at .str36 = external constant [1 x i8]		; <[1 x i8]*> [#uses=0]
+ at .str37 = external constant [2 x i8]		; <[2 x i8]*> [#uses=0]
+ at .str38 = external constant [16 x i8]		; <[16 x i8]*> [#uses=0]
+ at cfun = external global %struct.function*		; <%struct.function**> [#uses=0]
+ at .str39 = external constant [14 x i8]		; <[14 x i8]*> [#uses=0]
+ at .str40 = external constant [11 x i8]		; <[11 x i8]*> [#uses=0]
+ at .str41 = external constant [20 x i8]		; <[20 x i8]*> [#uses=0]
+ at .str42 = external constant [17 x i8]		; <[17 x i8]*> [#uses=0]
+ at .str43 = external constant [19 x i8]		; <[19 x i8]*> [#uses=0]
+ at mode_size = external global [48 x i8]		; <[48 x i8]*> [#uses=0]
+ at target_flags = external global i32		; <i32*> [#uses=0]
+ at .str44 = external constant [11 x i8]		; <[11 x i8]*> [#uses=0]
+ at reg_class_names = external global [0 x i8*]		; <[0 x i8*]*> [#uses=0]
+ at .str45 = external constant [10 x i8]		; <[10 x i8]*> [#uses=0]
+ at .str46 = external constant [13 x i8]		; <[13 x i8]*> [#uses=0]
+ at .str47 = external constant [19 x i8]		; <[19 x i8]*> [#uses=0]
+ at .str48 = external constant [12 x i8]		; <[12 x i8]*> [#uses=0]
+ at .str49 = external constant [10 x i8]		; <[10 x i8]*> [#uses=0]
+ at .str50 = external constant [3 x i8]		; <[3 x i8]*> [#uses=0]
+ at .str51 = external constant [29 x i8]		; <[29 x i8]*> [#uses=0]
+ at .str52 = external constant [17 x i8]		; <[17 x i8]*> [#uses=0]
+ at .str53 = external constant [19 x i8]		; <[19 x i8]*> [#uses=0]
+ at .str54 = external constant [22 x i8]		; <[22 x i8]*> [#uses=0]
+ at .str55 = external constant [10 x i8]		; <[10 x i8]*> [#uses=0]
+ at .str56 = external constant [12 x i8]		; <[12 x i8]*> [#uses=0]
+ at .str57 = external constant [26 x i8]		; <[26 x i8]*> [#uses=0]
+ at .str58 = external constant [15 x i8]		; <[15 x i8]*> [#uses=0]
+ at .str59 = external constant [14 x i8]		; <[14 x i8]*> [#uses=0]
+ at .str60 = external constant [26 x i8]		; <[26 x i8]*> [#uses=0]
+ at .str61 = external constant [24 x i8]		; <[24 x i8]*> [#uses=0]
+ at initialized.20366.b = external global i1		; <i1*> [#uses=0]
+ at __FUNCTION__.20369 = external constant [20 x i8]		; <[20 x i8]*> [#uses=0]
+ at __FUNCTION__.20442 = external constant [19 x i8]		; <[19 x i8]*> [#uses=0]
+ at bb_bitnames.20476 = external constant [6 x i8*]		; <[6 x i8*]*> [#uses=0]
+ at .str62 = external constant [6 x i8]		; <[6 x i8]*> [#uses=0]
+ at .str63 = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
+ at .str64 = external constant [10 x i8]		; <[10 x i8]*> [#uses=0]
+ at .str65 = external constant [8 x i8]		; <[8 x i8]*> [#uses=0]
+ at .str66 = external constant [17 x i8]		; <[17 x i8]*> [#uses=0]
+ at .str67 = external constant [11 x i8]		; <[11 x i8]*> [#uses=0]
+ at .str68 = external constant [15 x i8]		; <[15 x i8]*> [#uses=0]
+ at .str69 = external constant [3 x i8]		; <[3 x i8]*> [#uses=0]
+ at .str70 = external constant [3 x i8]		; <[3 x i8]*> [#uses=0]
+ at __FUNCTION__.20520 = external constant [32 x i8]		; <[32 x i8]*> [#uses=0]
+ at dump_file = external global %struct._IO_FILE*		; <%struct._IO_FILE**> [#uses=0]
+ at .str71 = external constant [86 x i8]		; <[86 x i8]*> [#uses=0]
+ at .str72 = external constant [94 x i8]		; <[94 x i8]*> [#uses=0]
+ at reg_obstack = external global %struct.bitmap_obstack		; <%struct.bitmap_obstack*> [#uses=0]
+
+declare void @init_flow()
+
+declare i8* @ggc_alloc_cleared_stat(i64)
+
+declare fastcc void @free_edge(%struct.edge_def*)
+
+declare void @ggc_free(i8*)
+
+declare %struct.basic_block_def* @alloc_block()
+
+declare void @alloc_rbi_pool()
+
+declare %struct.alloc_pool_def* @create_alloc_pool(i8*, i64, i64)
+
+declare void @free_rbi_pool()
+
+declare void @free_alloc_pool(%struct.alloc_pool_def*)
+
+declare void @initialize_bb_rbi(%struct.basic_block_def*)
+
+declare void @fancy_abort(i8*, i32, i8*)
+
+declare i8* @pool_alloc(%struct.alloc_pool_def*)
+
+declare void @llvm.memset.i64(i8*, i8, i64, i32)
+
+declare void @link_block(%struct.basic_block_def*, %struct.basic_block_def*)
+
+declare void @unlink_block(%struct.basic_block_def*)
+
+declare void @compact_blocks()
+
+declare void @varray_check_failed(%struct.varray_head_tag*, i64, i8*, i32, i8*)
+
+declare void @expunge_block(%struct.basic_block_def*)
+
+declare void @clear_bb_flags()
+
+declare void @alloc_aux_for_block(%struct.basic_block_def*, i32)
+
+declare void @_obstack_newchunk(%struct.obstack*, i32)
+
+declare void @clear_aux_for_blocks()
+
+declare void @free_aux_for_blocks()
+
+declare void @obstack_free(%struct.obstack*, i8*)
+
+declare void @alloc_aux_for_edge(%struct.edge_def*, i32)
+
+declare void @debug_bb(%struct.basic_block_def*)
+
+declare void @dump_bb(%struct.basic_block_def*, %struct._IO_FILE*, i32)
+
+declare %struct.basic_block_def* @debug_bb_n(i32)
+
+declare void @dump_edge_info(%struct._IO_FILE*, %struct.edge_def*, i32)
+
+declare i32 @fputs_unlocked(i8* noalias , %struct._IO_FILE* noalias )
+
+declare i32 @fprintf(%struct._IO_FILE* noalias , i8* noalias , ...)
+
+declare i64 @fwrite(i8*, i64, i64, i8*)
+
+declare i32 @__overflow(%struct._IO_FILE*, i32)
+
+declare %struct.edge_def* @unchecked_make_edge(%struct.basic_block_def*, %struct.basic_block_def*, i32)
+
+declare i8* @vec_gc_p_reserve(i8*, i32)
+
+declare void @vec_assert_fail(i8*, i8*, i8*, i32, i8*)
+
+declare void @execute_on_growing_pred(%struct.edge_def*)
+
+declare %struct.edge_def* @make_edge(%struct.basic_block_def*, %struct.basic_block_def*, i32)
+
+declare %struct.edge_def* @find_edge(%struct.basic_block_def*, %struct.basic_block_def*)
+
+declare %struct.edge_def* @make_single_succ_edge(%struct.basic_block_def*, %struct.basic_block_def*, i32)
+
+declare %struct.edge_def* @cached_make_edge(%struct.simple_bitmap_def**, %struct.basic_block_def*, %struct.basic_block_def*, i32)
+
+declare void @redirect_edge_succ(%struct.edge_def*, %struct.basic_block_def*)
+
+declare void @execute_on_shrinking_pred(%struct.edge_def*)
+
+declare void @alloc_aux_for_blocks(i32)
+
+declare i8* @xmalloc(i64)
+
+declare i32 @_obstack_begin(%struct.obstack*, i32, i32, i8* (i64)*, void (i8*)*)
+
+declare void @free(i8*)
+
+declare void @clear_edges()
+
+declare void @remove_edge(%struct.edge_def*)
+
+declare %struct.edge_def* @redirect_edge_succ_nodup(%struct.edge_def*, %struct.basic_block_def*)
+
+declare void @redirect_edge_pred(%struct.edge_def*, %struct.basic_block_def*)
+
+define void @check_bb_profile(%struct.basic_block_def* %bb, %struct._IO_FILE* %file) {
+entry:
+	br i1 false, label %cond_false759.preheader, label %cond_false149.preheader
+
+cond_false149.preheader:		; preds = %entry
+	ret void
+
+cond_false759.preheader:		; preds = %entry
+	br i1 false, label %cond_next873, label %cond_true794
+
+bb644:		; preds = %cond_next873
+	ret void
+
+cond_true794:		; preds = %cond_false759.preheader
+	ret void
+
+cond_next873:		; preds = %cond_false759.preheader
+	br i1 false, label %bb882, label %bb644
+
+bb882:		; preds = %cond_next873
+	br i1 false, label %cond_true893, label %cond_next901
+
+cond_true893:		; preds = %bb882
+	br label %cond_false1036
+
+cond_next901:		; preds = %bb882
+	ret void
+
+bb929:		; preds = %cond_next1150
+	%tmp934 = add i64 0, %lsum.11225.0		; <i64> [#uses=1]
+	br i1 false, label %cond_next979, label %cond_true974
+
+cond_true974:		; preds = %bb929
+	ret void
+
+cond_next979:		; preds = %bb929
+	br label %cond_false1036
+
+cond_false1036:		; preds = %cond_next979, %cond_true893
+	%lsum.11225.0 = phi i64 [ 0, %cond_true893 ], [ %tmp934, %cond_next979 ]		; <i64> [#uses=2]
+	br i1 false, label %cond_next1056, label %cond_true1051
+
+cond_true1051:		; preds = %cond_false1036
+	ret void
+
+cond_next1056:		; preds = %cond_false1036
+	br i1 false, label %cond_next1150, label %cond_true1071
+
+cond_true1071:		; preds = %cond_next1056
+	ret void
+
+cond_next1150:		; preds = %cond_next1056
+	%tmp1156 = icmp eq %struct.edge_def* null, null		; <i1> [#uses=1]
+	br i1 %tmp1156, label %bb1159, label %bb929
+
+bb1159:		; preds = %cond_next1150
+	br i1 false, label %cond_true1169, label %UnifiedReturnBlock
+
+cond_true1169:		; preds = %bb1159
+	%tmp11741175 = trunc i64 %lsum.11225.0 to i32		; <i32> [#uses=1]
+	%tmp1178 = tail call i32 (%struct._IO_FILE* noalias , i8* noalias , ...)* @fprintf( %struct._IO_FILE* %file noalias , i8* getelementptr ([49 x i8]* @.str32, i32 0, i64 0) noalias , i32 %tmp11741175, i32 0 )		; <i32> [#uses=0]
+	ret void
+
+UnifiedReturnBlock:		; preds = %bb1159
+	ret void
+}
+
+declare void @dump_flow_info(%struct._IO_FILE*)
+
+declare i32 @max_reg_num()
+
+declare void @rtl_check_failed_flag(i8*, %struct.rtx_def*, i8*, i32, i8*)
+
+declare i32 @reg_preferred_class(i32)
+
+declare i32 @reg_alternate_class(i32)
+
+declare i8 @maybe_hot_bb_p(%struct.basic_block_def*) zeroext 
+
+declare i8 @probably_never_executed_bb_p(%struct.basic_block_def*) zeroext 
+
+declare void @dump_regset(%struct.bitmap_head_def*, %struct._IO_FILE*)
+
+declare void @debug_flow_info()
+
+declare void @alloc_aux_for_edges(i32)
+
+declare void @clear_aux_for_edges()
+
+declare void @free_aux_for_edges()
+
+declare void @brief_dump_cfg(%struct._IO_FILE*)
+
+declare i32 @fputc(i32, i8*)
+
+declare void @update_bb_profile_for_threading(%struct.basic_block_def*, i32, i64, %struct.edge_def*)





More information about the llvm-commits mailing list