Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / X86 / 2010-02-12-CoalescerBug-Impdef.ll
bloba1e65a4369c35d500aa43aa96dcd2e28b9aaeac4
1 ; RUN: llc < %s > %t
2 ; PR6283
4 ; Tricky coalescer bug:
5 ; After coalescing %RAX with a virtual register, this instruction was rematted:
7 ;   %EAX = MOV32rr killed %reg1070
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.
13 ; The fix is to implicitly define %RAX when coalescing:
15 ;   %EAX = MOV32rr killed %reg1070, implicit-def %RAX
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"
21 module asm "\09.ident\09\22GCC: (GNU) 4.5.0 20100212 (experimental) LLVM: 95975\22"
23 %0 = type { ptr }
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 ptr] }
30 %"struct VEC_basic_block_gc" = type { %"struct VEC_basic_block_base" }
31 %"struct VEC_edge_base" = type { i32, i32, [1 x ptr] }
32 %"struct VEC_edge_gc" = type { %"struct VEC_edge_base" }
33 %"struct VEC_gimple_base" = type { i32, i32, [1 x ptr] }
34 %"struct VEC_gimple_gc" = type { %"struct VEC_gimple_base" }
35 %"struct VEC_iv_cand_p_base" = type { i32, i32, [1 x ptr] }
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 ptr] }
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 ptr] }
40 %"struct VEC_loop_p_gc" = type { %"struct VEC_loop_p_base" }
41 %"struct VEC_rtx_base" = type { i32, i32, [1 x ptr] }
42 %"struct VEC_rtx_gc" = type { %"struct VEC_rtx_base" }
43 %"struct VEC_tree_base" = type { i32, i32, [1 x ptr] }
44 %"struct VEC_tree_gc" = type { %"struct VEC_tree_base" }
45 %"struct _obstack_chunk" = type { ptr, ptr, %"char[]" }
46 %"struct basic_block_def" = type { ptr, ptr, ptr, ptr, [2 x ptr], ptr, ptr, %"union basic_block_il_dependent", i64, i32, i32, i32, i32, i32 }
47 %"struct bitmap_element" = type { ptr, ptr, i32, %"BITMAP_WORD[]" }
48 %"struct bitmap_head_def" = type { ptr, ptr, i32, ptr }
49 %"struct bitmap_obstack" = type { ptr, ptr, %"struct obstack" }
50 %"struct block_symbol" = type { [3 x %"union rtunion"], ptr, i64 }
51 %"struct comp_cost" = type { i32, i32 }
52 %"struct control_flow_graph" = type { ptr, ptr, ptr, i32, i32, i32, ptr, i32, %"enum dom_state[]", %"enum dom_state[]", i32, i32 }
53 %"struct cost_pair" = type { ptr, %"struct comp_cost", ptr, ptr }
54 %"struct def_optype_d" = type { ptr, ptr }
55 %"struct double_int" = type { i64, i64 }
56 %"struct edge_def" = type { ptr, ptr, %"union edge_def_insns", ptr, ptr, i32, i32, i32, i32, i64 }
57 %"struct eh_status" = type opaque
58 %"struct et_node" = type opaque
59 %"struct function" = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, i32, i32, i32, ptr, i8, i8, i8, i8 }
60 %"struct gimple_bb_info" = type { ptr, ptr }
61 %"struct gimple_df" = type { ptr, ptr, ptr, ptr, %"struct pt_solution", %"struct pt_solution", ptr, ptr, ptr, ptr, i8, %"struct ssa_operands" }
62 %"struct gimple_seq_d" = type { ptr, ptr, ptr }
63 %"struct gimple_seq_node_d" = type { ptr, ptr, ptr }
64 %"struct gimple_statement_base" = type { i8, i8, i16, i32, i32, i32, ptr, ptr }
65 %"struct phi_arg_d[]" = type [1 x %"struct phi_arg_d"]
66 %"struct gimple_statement_phi" = type { %"struct gimple_statement_base", i32, i32, ptr, %"struct phi_arg_d[]" }
67 %"struct htab" = type { ptr, ptr, ptr, ptr, i64, i64, i64, i32, i32, ptr, ptr, ptr, ptr, ptr, i32 }
68 %"struct iv" = type { ptr, ptr, ptr, ptr, i8, i8, i32 }
69 %"struct iv_cand" = type { i32, i8, i32, ptr, ptr, ptr, ptr, i32, i32, ptr, ptr }
70 %"struct iv_use" = type { i32, i32, ptr, ptr, ptr, ptr, i32, ptr, ptr }
71 %"struct ivopts_data" = type { ptr, ptr, i32, i32, ptr, ptr, ptr, ptr, ptr, i32, i8, i8 }
72 %"struct lang_decl" = type opaque
73 %"struct language_function" = type opaque
74 %"struct loop" = type { i32, i32, ptr, ptr, %"struct comp_cost", i32, i32, ptr, ptr, ptr, ptr, ptr, %"struct double_int", %"struct double_int", i8, i8, i32, ptr, ptr, i8, ptr }
75 %"struct loop_exit" = type { ptr, ptr, ptr, ptr }
76 %"struct loops" = type { i32, ptr, ptr, ptr }
77 %"struct machine_cfa_state" = type { ptr, i64 }
78 %"struct machine_function" = type { ptr, ptr, i32, i32, %"int[]", i32, %"struct machine_cfa_state", i32, i8 }
79 %"struct nb_iter_bound" = type { ptr, %"struct double_int", i8, ptr }
80 %"struct object_block" = type { ptr, i32, i64, ptr, ptr }
81 %"struct obstack" = type { i64, ptr, ptr, ptr, ptr, i64, i32, ptr, ptr, ptr, i8 }
82 %"struct phi_arg_d" = type { %"struct ssa_use_operand_d", ptr, i32 }
83 %"struct pointer_map_t" = type opaque
84 %"struct pt_solution" = type { i8, ptr }
85 %"struct rtx_def" = type { i16, i8, i8, %"union u" }
86 %"struct section_common" = type { i32 }
87 %"struct ssa_operand_memory_d" = type { ptr, %"uchar[]" }
88 %"struct ssa_operands" = type { ptr, i32, i32, i8, ptr, ptr }
89 %"struct ssa_use_operand_d" = type { ptr, ptr, %0, ptr }
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", ptr, ptr }
93 %"struct tree_decl_common" = type { %"struct tree_decl_minimal", ptr, i8, i8, i8, i8, i8, i32, ptr, ptr, ptr, ptr, ptr }
94 %"struct tree_decl_minimal" = type { %"struct tree_common", i32, i32, ptr, ptr }
95 %"struct tree_decl_non_common" = type { %"struct tree_decl_with_vis", ptr, ptr, ptr, ptr }
96 %"struct tree_decl_with_rtl" = type { %"struct tree_decl_common", ptr }
97 %"struct tree_decl_with_vis" = type { %"struct tree_decl_with_rtl", ptr, ptr, ptr, i8, i8, i8 }
98 %"struct tree_function_decl" = type { %"struct tree_decl_non_common", ptr, ptr, ptr, ptr, i16, i8, i8 }
99 %"struct unnamed_section" = type { %"struct section_common", ptr, ptr, ptr }
100 %"struct use_optype_d" = type { ptr, %"struct ssa_use_operand_d" }
101 %"struct version_info" = type { ptr, ptr, i8, i32, i8 }
102 %"union basic_block_il_dependent" = type { ptr }
103 %"union edge_def_insns" = type { ptr }
104 %"union gimple_statement_d" = type { %"struct gimple_statement_phi" }
105 %"union rtunion" = type { ptr }
106 %"union section" = type { %"struct unnamed_section" }
107 %"union tree_node" = type { %"struct tree_function_decl" }
108 %"union u" = type { %"struct block_symbol" }
110 declare fastcc ptr @get_computation_at(ptr, ptr nocapture, ptr nocapture, ptr) nounwind
112 declare fastcc i32 @computation_cost(ptr, i8 zeroext) nounwind
114 define fastcc i64 @get_computation_cost_at(ptr %data, ptr nocapture %use, ptr nocapture %cand, i8 zeroext %address_p, ptr %depends_on, ptr %at, ptr %can_autoinc) nounwind {
115 entry:
116   br i1 undef, label %"100", label %"4"
118 "4":                                              ; preds = %entry
119   br i1 undef, label %"6", label %"5"
121 "5":                                              ; preds = %"4"
122   unreachable
124 "6":                                              ; preds = %"4"
125   br i1 undef, label %"8", label %"7"
127 "7":                                              ; preds = %"6"
128   unreachable
130 "8":                                              ; preds = %"6"
131   br i1 undef, label %"100", label %"10"
133 "10":                                             ; preds = %"8"
134   br i1 undef, label %"17", label %"16"
136 "16":                                             ; preds = %"10"
137   unreachable
139 "17":                                             ; preds = %"10"
140   br i1 undef, label %"19", label %"18"
142 "18":                                             ; preds = %"17"
143   unreachable
145 "19":                                             ; preds = %"17"
146   br i1 undef, label %"93", label %"20"
148 "20":                                             ; preds = %"19"
149   br i1 undef, label %"23", label %"21"
151 "21":                                             ; preds = %"20"
152   unreachable
154 "23":                                             ; preds = %"20"
155   br i1 undef, label %"100", label %"25"
157 "25":                                             ; preds = %"23"
158   br i1 undef, label %"100", label %"26"
160 "26":                                             ; preds = %"25"
161   br i1 undef, label %"30", label %"28"
163 "28":                                             ; preds = %"26"
164   unreachable
166 "30":                                             ; preds = %"26"
167   br i1 undef, label %"59", label %"51"
169 "51":                                             ; preds = %"30"
170   br i1 undef, label %"55", label %"52"
172 "52":                                             ; preds = %"51"
173   unreachable
175 "55":                                             ; preds = %"51"
176   %0 = icmp ugt i32 0, undef                      ; <i1> [#uses=1]
177   br i1 %0, label %"50.i", label %"9.i"
179 "9.i":                                            ; preds = %"55"
180   unreachable
182 "50.i":                                           ; preds = %"55"
183   br i1 undef, label %"55.i", label %"54.i"
185 "54.i":                                           ; preds = %"50.i"
186   br i1 undef, label %"57.i", label %"55.i"
188 "55.i":                                           ; preds = %"54.i", %"50.i"
189   unreachable
191 "57.i":                                           ; preds = %"54.i"
192   br label %"63.i"
194 "61.i":                                           ; preds = %"63.i"
195   br i1 undef, label %"64.i", label %"62.i"
197 "62.i":                                           ; preds = %"61.i"
198   br label %"63.i"
200 "63.i":                                           ; preds = %"62.i", %"57.i"
201   br i1 undef, label %"61.i", label %"64.i"
203 "64.i":                                           ; preds = %"63.i", %"61.i"
204   unreachable
206 "59":                                             ; preds = %"30"
207   br i1 undef, label %"60", label %"82"
209 "60":                                             ; preds = %"59"
210   br i1 undef, label %"61", label %"82"
212 "61":                                             ; preds = %"60"
213   br i1 undef, label %"62", label %"82"
215 "62":                                             ; preds = %"61"
216   br i1 undef, label %"100", label %"63"
218 "63":                                             ; preds = %"62"
219   br i1 undef, label %"65", label %"64"
221 "64":                                             ; preds = %"63"
222   unreachable
224 "65":                                             ; preds = %"63"
225   br i1 undef, label %"66", label %"67"
227 "66":                                             ; preds = %"65"
228   unreachable
230 "67":                                             ; preds = %"65"
231   %1 = load i32, ptr undef, align 4                   ; <i32> [#uses=0]
232   br label %"100"
234 "82":                                             ; preds = %"61", %"60", %"59"
235   unreachable
237 "93":                                             ; preds = %"19"
238   %2 = call fastcc ptr @get_computation_at(ptr undef, ptr %use, ptr %cand, ptr %at) nounwind ; <ptr> [#uses=1]
239   br i1 undef, label %"100", label %"97"
241 "97":                                             ; preds = %"93"
242   br i1 undef, label %"99", label %"98"
244 "98":                                             ; preds = %"97"
245   br label %"99"
247 "99":                                             ; preds = %"98", %"97"
248   %3 = phi ptr [ undef, %"98" ], [ %2, %"97" ] ; <ptr> [#uses=1]
249   %4 = call fastcc i32 @computation_cost(ptr %3, i8 zeroext undef) nounwind ; <i32> [#uses=1]
250   br label %"100"
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