Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s > %t
      2 ; PR6283
      3 
      4 ; Tricky coalescer bug:
      5 ; After coalescing %RAX with a virtual register, this instruction was rematted:
      6 ;
      7 ;   %EAX<def> = MOV32rr %reg1070<kill>
      8 ;
      9 ; This instruction silently defined %RAX, and when rematting removed the
     10 ; instruction, the live interval for %RAX was not properly updated. The valno
     11 ; referred to a deleted instruction and bad things happened.
     12 ;
     13 ; The fix is to implicitly define %RAX when coalescing:
     14 ;
     15 ;   %EAX<def> = MOV32rr %reg1070<kill>, %RAX<imp-def>
     16 ;
     17 
     18 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
     19 target triple = "x86_64-unknown-linux-gnu"
     20 
     21 module asm "\09.ident\09\22GCC: (GNU) 4.5.0 20100212 (experimental) LLVM: 95975\22"
     22 
     23 %0 = type { %"union gimple_statement_d"* }
     24 %"BITMAP_WORD[]" = type [2 x i64]
     25 %"uchar[]" = type [1 x i8]
     26 %"char[]" = type [4 x i8]
     27 %"enum dom_state[]" = type [2 x i32]
     28 %"int[]" = type [4 x i32]
     29 %"struct VEC_basic_block_base" = type { i32, i32, [1 x %"struct basic_block_def"*] }
     30 %"struct VEC_basic_block_gc" = type { %"struct VEC_basic_block_base" }
     31 %"struct VEC_edge_base" = type { i32, i32, [1 x %"struct edge_def"*] }
     32 %"struct VEC_edge_gc" = type { %"struct VEC_edge_base" }
     33 %"struct VEC_gimple_base" = type { i32, i32, [1 x %"union gimple_statement_d"*] }
     34 %"struct VEC_gimple_gc" = type { %"struct VEC_gimple_base" }
     35 %"struct VEC_iv_cand_p_base" = type { i32, i32, [1 x %"struct iv_cand"*] }
     36 %"struct VEC_iv_cand_p_heap" = type { %"struct VEC_iv_cand_p_base" }
     37 %"struct VEC_iv_use_p_base" = type { i32, i32, [1 x %"struct iv_use"*] }
     38 %"struct VEC_iv_use_p_heap" = type { %"struct VEC_iv_use_p_base" }
     39 %"struct VEC_loop_p_base" = type { i32, i32, [1 x %"struct loop"*] }
     40 %"struct VEC_loop_p_gc" = type { %"struct VEC_loop_p_base" }
     41 %"struct VEC_rtx_base" = type { i32, i32, [1 x %"struct rtx_def"*] }
     42 %"struct VEC_rtx_gc" = type { %"struct VEC_rtx_base" }
     43 %"struct VEC_tree_base" = type { i32, i32, [1 x %"union tree_node"*] }
     44 %"struct VEC_tree_gc" = type { %"struct VEC_tree_base" }
     45 %"struct _obstack_chunk" = type { i8*, %"struct _obstack_chunk"*, %"char[]" }
     46 %"struct basic_block_def" = type { %"struct VEC_edge_gc"*, %"struct VEC_edge_gc"*, i8*, %"struct loop"*, [2 x %"struct et_node"*], %"struct basic_block_def"*, %"struct basic_block_def"*, %"union basic_block_il_dependent", i64, i32, i32, i32, i32, i32 }
     47 %"struct bitmap_element" = type { %"struct bitmap_element"*, %"struct bitmap_element"*, i32, %"BITMAP_WORD[]" }
     48 %"struct bitmap_head_def" = type { %"struct bitmap_element"*, %"struct bitmap_element"*, i32, %"struct bitmap_obstack"* }
     49 %"struct bitmap_obstack" = type { %"struct bitmap_element"*, %"struct bitmap_head_def"*, %"struct obstack" }
     50 %"struct block_symbol" = type { [3 x %"union rtunion"], %"struct object_block"*, i64 }
     51 %"struct comp_cost" = type { i32, i32 }
     52 %"struct control_flow_graph" = type { %"struct basic_block_def"*, %"struct basic_block_def"*, %"struct VEC_basic_block_gc"*, i32, i32, i32, %"struct VEC_basic_block_gc"*, i32, %"enum dom_state[]", %"enum dom_state[]", i32, i32 }
     53 %"struct cost_pair" = type { %"struct iv_cand"*, %"struct comp_cost", %"struct bitmap_head_def"*, %"union tree_node"* }
     54 %"struct def_optype_d" = type { %"struct def_optype_d"*, %"union tree_node"** }
     55 %"struct double_int" = type { i64, i64 }
     56 %"struct edge_def" = type { %"struct basic_block_def"*, %"struct basic_block_def"*, %"union edge_def_insns", i8*, %"union tree_node"*, i32, i32, i32, i32, i64 }
     57 %"struct eh_status" = type opaque
     58 %"struct et_node" = type opaque
     59 %"struct function" = type { %"struct eh_status"*, %"struct control_flow_graph"*, %"struct gimple_seq_d"*, %"struct gimple_df"*, %"struct loops"*, %"struct htab"*, %"union tree_node"*, %"union tree_node"*, %"union tree_node"*, %"union tree_node"*, %"struct machine_function"*, %"struct language_function"*, %"struct htab"*, i32, i32, i32, i32, i32, i32, i8*, i8, i8, i8, i8 }
     60 %"struct gimple_bb_info" = type { %"struct gimple_seq_d"*, %"struct gimple_seq_d"* }
     61 %"struct gimple_df" = type { %"struct htab"*, %"struct VEC_gimple_gc"*, %"struct VEC_tree_gc"*, %"union tree_node"*, %"struct pt_solution", %"struct pt_solution", %"struct pointer_map_t"*, %"union tree_node"*, %"struct htab"*, %"struct bitmap_head_def"*, i8, %"struct ssa_operands" }
     62 %"struct gimple_seq_d" = type { %"struct gimple_seq_node_d"*, %"struct gimple_seq_node_d"*, %"struct gimple_seq_d"* }
     63 %"struct gimple_seq_node_d" = type { %"union gimple_statement_d"*, %"struct gimple_seq_node_d"*, %"struct gimple_seq_node_d"* }
     64 %"struct gimple_statement_base" = type { i8, i8, i16, i32, i32, i32, %"struct basic_block_def"*, %"union tree_node"* }
     65 %"struct phi_arg_d[]" = type [1 x %"struct phi_arg_d"]
     66 %"struct gimple_statement_phi" = type { %"struct gimple_statement_base", i32, i32, %"union tree_node"*, %"struct phi_arg_d[]" }
     67 %"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 }
     68 %"struct iv" = type { %"union tree_node"*, %"union tree_node"*, %"union tree_node"*, %"union tree_node"*, i8, i8, i32 }
     69 %"struct iv_cand" = type { i32, i8, i32, %"union gimple_statement_d"*, %"union tree_node"*, %"union tree_node"*, %"struct iv"*, i32, i32, %"struct iv_use"*, %"struct bitmap_head_def"* }
     70 %"struct iv_use" = type { i32, i32, %"struct iv"*, %"union gimple_statement_d"*, %"union tree_node"**, %"struct bitmap_head_def"*, i32, %"struct cost_pair"*, %"struct iv_cand"* }
     71 %"struct ivopts_data" = type { %"struct loop"*, %"struct pointer_map_t"*, i32, i32, %"struct version_info"*, %"struct bitmap_head_def"*, %"struct VEC_iv_use_p_heap"*, %"struct VEC_iv_cand_p_heap"*, %"struct bitmap_head_def"*, i32, i8, i8 }
     72 %"struct lang_decl" = type opaque
     73 %"struct language_function" = type opaque
     74 %"struct loop" = type { i32, i32, %"struct basic_block_def"*, %"struct basic_block_def"*, %"struct comp_cost", i32, i32, %"struct VEC_loop_p_gc"*, %"struct loop"*, %"struct loop"*, i8*, %"union tree_node"*, %"struct double_int", %"struct double_int", i8, i8, i32, %"struct nb_iter_bound"*, %"struct loop_exit"*, i8, %"union tree_node"* }
     75 %"struct loop_exit" = type { %"struct edge_def"*, %"struct loop_exit"*, %"struct loop_exit"*, %"struct loop_exit"* }
     76 %"struct loops" = type { i32, %"struct VEC_loop_p_gc"*, %"struct htab"*, %"struct loop"* }
     77 %"struct machine_cfa_state" = type { %"struct rtx_def"*, i64 }
     78 %"struct machine_function" = type { %"struct stack_local_entry"*, i8*, i32, i32, %"int[]", i32, %"struct machine_cfa_state", i32, i8 }
     79 %"struct nb_iter_bound" = type { %"union gimple_statement_d"*, %"struct double_int", i8, %"struct nb_iter_bound"* }
     80 %"struct object_block" = type { %"union section"*, i32, i64, %"struct VEC_rtx_gc"*, %"struct VEC_rtx_gc"* }
     81 %"struct obstack" = type { i64, %"struct _obstack_chunk"*, i8*, i8*, i8*, i64, i32, %"struct _obstack_chunk"* (i8*, i64)*, void (i8*, %"struct _obstack_chunk"*)*, i8*, i8 }
     82 %"struct phi_arg_d" = type { %"struct ssa_use_operand_d", %"union tree_node"*, i32 }
     83 %"struct pointer_map_t" = type opaque
     84 %"struct pt_solution" = type { i8, %"struct bitmap_head_def"* }
     85 %"struct rtx_def" = type { i16, i8, i8, %"union u" }
     86 %"struct section_common" = type { i32 }
     87 %"struct ssa_operand_memory_d" = type { %"struct ssa_operand_memory_d"*, %"uchar[]" }
     88 %"struct ssa_operands" = type { %"struct ssa_operand_memory_d"*, i32, i32, i8, %"struct def_optype_d"*, %"struct use_optype_d"* }
     89 %"struct ssa_use_operand_d" = type { %"struct ssa_use_operand_d"*, %"struct ssa_use_operand_d"*, %0, %"union tree_node"** }
     90 %"struct stack_local_entry" = type opaque
     91 %"struct tree_base" = type <{ i16, i8, i8, i8, [2 x i8], i8 }>
     92 %"struct tree_common" = type { %"struct tree_base", %"union tree_node"*, %"union tree_node"* }
     93 %"struct tree_decl_common" = type { %"struct tree_decl_minimal", %"union tree_node"*, i8, i8, i8, i8, i8, i32, %"union tree_node"*, %"union tree_node"*, %"union tree_node"*, %"union tree_node"*, %"struct lang_decl"* }
     94 %"struct tree_decl_minimal" = type { %"struct tree_common", i32, i32, %"union tree_node"*, %"union tree_node"* }
     95 %"struct tree_decl_non_common" = type { %"struct tree_decl_with_vis", %"union tree_node"*, %"union tree_node"*, %"union tree_node"*, %"union tree_node"* }
     96 %"struct tree_decl_with_rtl" = type { %"struct tree_decl_common", %"struct rtx_def"* }
     97 %"struct tree_decl_with_vis" = type { %"struct tree_decl_with_rtl", %"union tree_node"*, %"union tree_node"*, %"union tree_node"*, i8, i8, i8 }
     98 %"struct tree_function_decl" = type { %"struct tree_decl_non_common", %"struct function"*, %"union tree_node"*, %"union tree_node"*, %"union tree_node"*, i16, i8, i8 }
     99 %"struct unnamed_section" = type { %"struct section_common", void (i8*)*, i8*, %"union section"* }
    100 %"struct use_optype_d" = type { %"struct use_optype_d"*, %"struct ssa_use_operand_d" }
    101 %"struct version_info" = type { %"union tree_node"*, %"struct iv"*, i8, i32, i8 }
    102 %"union basic_block_il_dependent" = type { %"struct gimple_bb_info"* }
    103 %"union edge_def_insns" = type { %"struct gimple_seq_d"* }
    104 %"union gimple_statement_d" = type { %"struct gimple_statement_phi" }
    105 %"union rtunion" = type { i8* }
    106 %"union section" = type { %"struct unnamed_section" }
    107 %"union tree_node" = type { %"struct tree_function_decl" }
    108 %"union u" = type { %"struct block_symbol" }
    109 
    110 declare fastcc %"union tree_node"* @get_computation_at(%"struct loop"*, %"struct iv_use"* nocapture, %"struct iv_cand"* nocapture, %"union gimple_statement_d"*) nounwind
    111 
    112 declare fastcc i32 @computation_cost(%"union tree_node"*, i8 zeroext) nounwind
    113 
    114 define fastcc i64 @get_computation_cost_at(%"struct ivopts_data"* %data, %"struct iv_use"* nocapture %use, %"struct iv_cand"* nocapture %cand, i8 zeroext %address_p, %"struct bitmap_head_def"** %depends_on, %"union gimple_statement_d"* %at, i8* %can_autoinc) nounwind {
    115 entry:
    116   br i1 undef, label %"100", label %"4"
    117 
    118 "4":                                              ; preds = %entry
    119   br i1 undef, label %"6", label %"5"
    120 
    121 "5":                                              ; preds = %"4"
    122   unreachable
    123 
    124 "6":                                              ; preds = %"4"
    125   br i1 undef, label %"8", label %"7"
    126 
    127 "7":                                              ; preds = %"6"
    128   unreachable
    129 
    130 "8":                                              ; preds = %"6"
    131   br i1 undef, label %"100", label %"10"
    132 
    133 "10":                                             ; preds = %"8"
    134   br i1 undef, label %"17", label %"16"
    135 
    136 "16":                                             ; preds = %"10"
    137   unreachable
    138 
    139 "17":                                             ; preds = %"10"
    140   br i1 undef, label %"19", label %"18"
    141 
    142 "18":                                             ; preds = %"17"
    143   unreachable
    144 
    145 "19":                                             ; preds = %"17"
    146   br i1 undef, label %"93", label %"20"
    147 
    148 "20":                                             ; preds = %"19"
    149   br i1 undef, label %"23", label %"21"
    150 
    151 "21":                                             ; preds = %"20"
    152   unreachable
    153 
    154 "23":                                             ; preds = %"20"
    155   br i1 undef, label %"100", label %"25"
    156 
    157 "25":                                             ; preds = %"23"
    158   br i1 undef, label %"100", label %"26"
    159 
    160 "26":                                             ; preds = %"25"
    161   br i1 undef, label %"30", label %"28"
    162 
    163 "28":                                             ; preds = %"26"
    164   unreachable
    165 
    166 "30":                                             ; preds = %"26"
    167   br i1 undef, label %"59", label %"51"
    168 
    169 "51":                                             ; preds = %"30"
    170   br i1 undef, label %"55", label %"52"
    171 
    172 "52":                                             ; preds = %"51"
    173   unreachable
    174 
    175 "55":                                             ; preds = %"51"
    176   %0 = icmp ugt i32 0, undef                      ; <i1> [#uses=1]
    177   br i1 %0, label %"50.i", label %"9.i"
    178 
    179 "9.i":                                            ; preds = %"55"
    180   unreachable
    181 
    182 "50.i":                                           ; preds = %"55"
    183   br i1 undef, label %"55.i", label %"54.i"
    184 
    185 "54.i":                                           ; preds = %"50.i"
    186   br i1 undef, label %"57.i", label %"55.i"
    187 
    188 "55.i":                                           ; preds = %"54.i", %"50.i"
    189   unreachable
    190 
    191 "57.i":                                           ; preds = %"54.i"
    192   br label %"63.i"
    193 
    194 "61.i":                                           ; preds = %"63.i"
    195   br i1 undef, label %"64.i", label %"62.i"
    196 
    197 "62.i":                                           ; preds = %"61.i"
    198   br label %"63.i"
    199 
    200 "63.i":                                           ; preds = %"62.i", %"57.i"
    201   br i1 undef, label %"61.i", label %"64.i"
    202 
    203 "64.i":                                           ; preds = %"63.i", %"61.i"
    204   unreachable
    205 
    206 "59":                                             ; preds = %"30"
    207   br i1 undef, label %"60", label %"82"
    208 
    209 "60":                                             ; preds = %"59"
    210   br i1 undef, label %"61", label %"82"
    211 
    212 "61":                                             ; preds = %"60"
    213   br i1 undef, label %"62", label %"82"
    214 
    215 "62":                                             ; preds = %"61"
    216   br i1 undef, label %"100", label %"63"
    217 
    218 "63":                                             ; preds = %"62"
    219   br i1 undef, label %"65", label %"64"
    220 
    221 "64":                                             ; preds = %"63"
    222   unreachable
    223 
    224 "65":                                             ; preds = %"63"
    225   br i1 undef, label %"66", label %"67"
    226 
    227 "66":                                             ; preds = %"65"
    228   unreachable
    229 
    230 "67":                                             ; preds = %"65"
    231   %1 = load i32, i32* undef, align 4                   ; <i32> [#uses=0]
    232   br label %"100"
    233 
    234 "82":                                             ; preds = %"61", %"60", %"59"
    235   unreachable
    236 
    237 "93":                                             ; preds = %"19"
    238   %2 = call fastcc %"union tree_node"* @get_computation_at(%"struct loop"* undef, %"struct iv_use"* %use, %"struct iv_cand"* %cand, %"union gimple_statement_d"* %at) nounwind ; <%"union tree_node"*> [#uses=1]
    239   br i1 undef, label %"100", label %"97"
    240 
    241 "97":                                             ; preds = %"93"
    242   br i1 undef, label %"99", label %"98"
    243 
    244 "98":                                             ; preds = %"97"
    245   br label %"99"
    246 
    247 "99":                                             ; preds = %"98", %"97"
    248   %3 = phi %"union tree_node"* [ undef, %"98" ], [ %2, %"97" ] ; <%"union tree_node"*> [#uses=1]
    249   %4 = call fastcc i32 @computation_cost(%"union tree_node"* %3, i8 zeroext undef) nounwind ; <i32> [#uses=1]
    250   br label %"100"
    251 
    252 "100":                                            ; preds = %"99", %"93", %"67", %"62", %"25", %"23", %"8", %entry
    253   %memtmp1.1.0 = phi i32 [ 0, %"99" ], [ 10000000, %entry ], [ 10000000, %"8" ], [ 10000000, %"23" ], [ 10000000, %"25" ], [ undef, %"62" ], [ undef, %"67" ], [ 10000000, %"93" ] ; <i32> [#uses=1]
    254   %memtmp1.0.0 = phi i32 [ %4, %"99" ], [ 10000000, %entry ], [ 10000000, %"8" ], [ 10000000, %"23" ], [ 10000000, %"25" ], [ undef, %"62" ], [ undef, %"67" ], [ 10000000, %"93" ] ; <i32> [#uses=1]
    255   %5 = zext i32 %memtmp1.0.0 to i64               ; <i64> [#uses=1]
    256   %6 = zext i32 %memtmp1.1.0 to i64               ; <i64> [#uses=1]
    257   %7 = shl i64 %6, 32                             ; <i64> [#uses=1]
    258   %8 = or i64 %7, %5                              ; <i64> [#uses=1]
    259   ret i64 %8
    260 }
    261