1; RUN: opt -scalarrepl -disable-output < %s 2; RUN: opt -scalarrepl-ssa -disable-output < %s 3 4target 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" 5target triple = "x86_64-apple-darwin10.0.0" 6 7; PR9017 8define void @test1() nounwind readnone ssp { 9entry: 10 %l_72 = alloca i32*, align 8 11 unreachable 12 13for.cond: ; preds = %for.cond 14 %tmp1.i = load i32*, i32** %l_72, align 8 15 store i32* %tmp1.i, i32** %l_72, align 8 16 br label %for.cond 17 18if.end: ; No predecessors! 19 ret void 20} 21 22 23define void @test2() { 24 %E = alloca { { i32, float, double, i64 }, { i32, float, double, i64 } } ; <{ { i32, float, double, i64 }, { i32, float, double, i64 } }*> [#uses=1] 25 %tmp.151 = getelementptr { { i32, float, double, i64 }, { i32, float, double, i64 } }, { { i32, float, double, i64 }, { i32, float, double, i64 } }* %E, i64 0, i32 1, i32 3 ; <i64*> [#uses=0] 26 ret void 27} 28 29define i32 @test3() { 30 %X = alloca { [4 x i32] } ; <{ [4 x i32] }*> [#uses=1] 31 %Y = getelementptr { [4 x i32] }, { [4 x i32] }* %X, i64 0, i32 0, i64 2 ; <i32*> [#uses=2] 32 store i32 4, i32* %Y 33 %Z = load i32, i32* %Y ; <i32> [#uses=1] 34 ret i32 %Z 35} 36 37 38%struct.rtx_def = type { [2 x i8], i32, [1 x %union.rtunion_def] } 39%union.rtunion_def = type { i32 } 40 41define void @test4() { 42entry: 43 %c_addr.i = alloca i8 ; <i8*> [#uses=1] 44 switch i32 0, label %return [ 45 i32 36, label %label.7 46 i32 34, label %label.7 47 i32 41, label %label.5 48 ] 49label.5: ; preds = %entry 50 ret void 51label.7: ; preds = %entry, %entry 52 br i1 false, label %then.4, label %switchexit.0 53then.4: ; preds = %label.7 54 %tmp.0.i = bitcast i8* %c_addr.i to i32* ; <i32*> [#uses=1] 55 store i32 44, i32* %tmp.0.i 56 ret void 57switchexit.0: ; preds = %label.7 58 ret void 59return: ; preds = %entry 60 ret void 61} 62 63 64define void @test5() { 65entry: 66 %source_ptr = alloca i8*, align 4 ; <i8**> [#uses=2] 67 br i1 false, label %bb1357, label %cond_next583 68cond_next583: ; preds = %entry 69 ret void 70bb1357: ; preds = %entry 71 br i1 false, label %bb1365, label %bb27055 72bb1365: ; preds = %bb1357 73 switch i32 0, label %cond_next10377 [ 74 i32 0, label %bb4679 75 i32 1, label %bb4679 76 i32 2, label %bb4679 77 i32 3, label %bb4679 78 i32 4, label %bb5115 79 i32 5, label %bb6651 80 i32 6, label %bb7147 81 i32 7, label %bb8683 82 i32 8, label %bb9131 83 i32 9, label %bb9875 84 i32 10, label %bb4679 85 i32 11, label %bb4859 86 i32 12, label %bb4679 87 i32 16, label %bb10249 88 ] 89bb4679: ; preds = %bb1365, %bb1365, %bb1365, %bb1365, %bb1365, %bb1365 90 ret void 91bb4859: ; preds = %bb1365 92 ret void 93bb5115: ; preds = %bb1365 94 ret void 95bb6651: ; preds = %bb1365 96 ret void 97bb7147: ; preds = %bb1365 98 ret void 99bb8683: ; preds = %bb1365 100 ret void 101bb9131: ; preds = %bb1365 102 ret void 103bb9875: ; preds = %bb1365 104 %source_ptr9884 = bitcast i8** %source_ptr to i8** ; <i8**> [#uses=1] 105 %tmp9885 = load i8*, i8** %source_ptr9884 ; <i8*> [#uses=0] 106 ret void 107bb10249: ; preds = %bb1365 108 %source_ptr10257 = bitcast i8** %source_ptr to i16** ; <i16**> [#uses=1] 109 %tmp10258 = load i16*, i16** %source_ptr10257 ; <i16*> [#uses=0] 110 ret void 111cond_next10377: ; preds = %bb1365 112 ret void 113bb27055: ; preds = %bb1357 114 ret void 115} 116 117 118 %"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>" = type { %"struct.__gnu_cxx::bitmap_allocator<char>::_Alloc_block"* } 119 %"struct.__gnu_cxx::bitmap_allocator<char>" = type { i8 } 120 %"struct.__gnu_cxx::bitmap_allocator<char>::_Alloc_block" = type { [8 x i8] } 121 122; PR1045 123define void @test6() { 124entry: 125 %this_addr.i = alloca %"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"* ; <%"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"**> [#uses=3] 126 %tmp = alloca %"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>", align 4 ; <%"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"*> [#uses=1] 127 store %"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"* %tmp, %"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"** %this_addr.i 128 %tmp.i = load %"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"*, %"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"** %this_addr.i ; <%"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"*> [#uses=1] 129 %tmp.i.upgrd.1 = bitcast %"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"* %tmp.i to %"struct.__gnu_cxx::bitmap_allocator<char>"* ; <%"struct.__gnu_cxx::bitmap_allocator<char>"*> [#uses=0] 130 %tmp1.i = load %"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"*, %"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"** %this_addr.i ; <%"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"*> [#uses=1] 131 %tmp.i.upgrd.2 = getelementptr %"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>", %"struct.__gnu_cxx::balloc::_Inclusive_between<__gnu_cxx::bitmap_allocator<char>::_Alloc_block*>"* %tmp1.i, i32 0, i32 0 ; <%"struct.__gnu_cxx::bitmap_allocator<char>::_Alloc_block"**> [#uses=0] 132 unreachable 133} 134 135 %struct.CGPoint = type { float, float } 136 %struct.aal_big_range_t = type { i32, i32 } %struct.aal_callback_t = type { i8* (i8*, i32)*, void (i8*, i8*)* } %struct.aal_edge_pool_t = type { %struct.aal_edge_pool_t*, i32, i32, [0 x %struct.aal_edge_t] } %struct.aal_edge_t = type { %struct.CGPoint, %struct.CGPoint, i32 } 137 %struct.aal_range_t = type { i16, i16 } 138 %struct.aal_span_pool_t = type { %struct.aal_span_pool_t*, [341 x %struct.aal_span_t] } 139 %struct.aal_span_t = type { %struct.aal_span_t*, %struct.aal_big_range_t } 140 %struct.aal_spanarray_t = type { [2 x %struct.aal_range_t] } 141 %struct.aal_spanbucket_t = type { i16, [2 x i8], %struct.anon } 142 %struct.aal_state_t = type { %struct.CGPoint, %struct.CGPoint, %struct.CGPoint, i32, float, float, float, float, %struct.CGPoint, %struct.CGPoint, float, float, float, float, i32, i32, i32, i32, float, float, i8*, i32, i32, %struct.aal_edge_pool_t*, %struct.aal_edge_pool_t*, i8*, %struct.aal_callback_t*, i32, %struct.aal_span_t*, %struct.aal_span_t*, %struct.aal_span_t*, %struct.aal_span_pool_t*, i8, float, i8, i32 } 143 %struct.anon = type { %struct.aal_spanarray_t } 144 145 146 147define fastcc void @test7() { 148entry: 149 %SB = alloca %struct.aal_spanbucket_t, align 4 ; <%struct.aal_spanbucket_t*> [#uses=2] 150 br i1 false, label %cond_true, label %cond_next79 151 152cond_true: ; preds = %entry 153 br i1 false, label %cond_next, label %cond_next114.i 154 155cond_next114.i: ; preds = %cond_true 156 ret void 157 158cond_next: ; preds = %cond_true 159 %SB19 = bitcast %struct.aal_spanbucket_t* %SB to i8* ; <i8*> [#uses=1] 160 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %SB19, i8* null, i32 12, i32 0, i1 false) 161 br i1 false, label %cond_next34, label %cond_next79 162 163cond_next34: ; preds = %cond_next 164 %i.2.reload22 = load i32, i32* null ; <i32> [#uses=1] 165 %tmp51 = getelementptr %struct.aal_spanbucket_t, %struct.aal_spanbucket_t* %SB, i32 0, i32 2, i32 0, i32 0, i32 %i.2.reload22, i32 1 166 ; <i16*> [#uses=0] 167 ret void 168 169cond_next79: ; preds = %cond_next, %entry 170 ret void 171} 172 173 174 %struct.c37304a__vrec = type { i8, %struct.c37304a__vrec___disc___XVN } 175 %struct.c37304a__vrec___disc___XVN = type { 176%struct.c37304a__vrec___disc___XVN___O } 177 %struct.c37304a__vrec___disc___XVN___O = type { } 178 179; PR3304 180define void @test8() { 181entry: 182 %v = alloca %struct.c37304a__vrec 183 %0 = getelementptr %struct.c37304a__vrec, %struct.c37304a__vrec* %v, i32 0, i32 0 184 store i8 8, i8* %0, align 1 185 unreachable 186} 187 188 189 190; rdar://6808691 - ZeroLengthMemSet 191 %0 = type <{ i32, i16, i8, i8, i64, i64, i16, [0 x i16] }> 192 193define i32 @test9() { 194entry: 195 %.compoundliteral = alloca %0 196 %tmp228 = getelementptr %0, %0* %.compoundliteral, i32 0, i32 7 197 %tmp229 = bitcast [0 x i16]* %tmp228 to i8* 198 call void @llvm.memset.p0i8.i64(i8* %tmp229, i8 0, i64 0, i32 2, i1 false) 199 unreachable 200} 201 202declare void @llvm.memset.i64(i8* nocapture, i8, i64, i32) nounwind 203 204 205; PR4146 - i1 handling 206%wrapper = type { i1 } 207define void @test10() { 208entry: 209 %w = alloca %wrapper, align 8 ; <%wrapper*> [#uses=1] 210 %0 = getelementptr %wrapper, %wrapper* %w, i64 0, i32 0 ; <i1*> 211 store i1 true, i1* %0 212 ret void 213} 214 215 216 %struct.singlebool = type <{ i8 }> 217; PR4286 218define zeroext i8 @test11() nounwind { 219entry: 220 %a = alloca %struct.singlebool, align 1 ; <%struct.singlebool*> [#uses=2] 221 %storetmp.i = bitcast %struct.singlebool* %a to i1* ; <i1*> [#uses=1] 222 store i1 true, i1* %storetmp.i 223 %tmp = getelementptr %struct.singlebool, %struct.singlebool* %a, i64 0, i32 0 ; <i8*> [#uses=1] 224 %tmp1 = load i8, i8* %tmp ; <i8> [#uses=1] 225 ret i8 %tmp1 226} 227 228 229 %struct.Item = type { [4 x i16], %struct.rule* } 230 %struct.rule = type { [4 x i16], i32, i32, i32, %struct.nonterminal*, %struct.pattern*, i8 } 231 %struct.nonterminal = type { i8*, i32, i32, i32, %struct.plankMap*, %struct.rule* } 232 %struct.plankMap = type { %struct.list*, i32, %struct.stateMap* } 233 %struct.list = type { i8*, %struct.list* } 234 %struct.stateMap = type { i8*, %struct.plank*, i32, i16* } 235 %struct.plank = type { i8*, %struct.list*, i32 } 236 %struct.pattern = type { %struct.nonterminal*, %struct.operator*, [2 x %struct.nonterminal*] } 237 %struct.operator = type { i8*, i8, i32, i32, i32, i32, %struct.table* } 238 %struct.table = type { %struct.operator*, %struct.list*, i16*, [2 x %struct.dimension*], %struct.item_set** } 239 %struct.dimension = type { i16*, %struct.Index_Map, %struct.mapping*, i32, %struct.plankMap* } 240 %struct.Index_Map = type { i32, %struct.item_set** } 241 %struct.item_set = type { i32, i32, %struct.operator*, [2 x %struct.item_set*], %struct.item_set*, i16*, %struct.Item*, %struct.Item* } 242 %struct.mapping = type { %struct.list**, i32, i32, i32, %struct.item_set** } 243 244; VLAs. 245define void @test12() { 246bb4.i: 247 %malloccall = tail call i8* @malloc(i32 0) 248 %0 = bitcast i8* %malloccall to [0 x %struct.Item]* 249 %.sub.i.c.i = getelementptr [0 x %struct.Item], [0 x %struct.Item]* %0, i32 0, i32 0 ; <%struct.Item*> [#uses=0] 250 unreachable 251} 252declare noalias i8* @malloc(i32) 253 254; PR8680 255define void @test13() nounwind { 256entry: 257 %memtmp = alloca i32, align 4 258 %0 = bitcast i32* %memtmp to void ()* 259 call void %0() nounwind 260 ret void 261} 262 263; rdar://11861001 - The dynamic GEP here was incorrectly making all accesses 264; to the alloca think they were also dynamic. Inserts and extracts created to 265; access the vector were all being based from the dynamic access, even in BBs 266; not dominated by the GEP. 267define fastcc void @test() optsize inlinehint ssp align 2 { 268entry: 269 %alloc.0.0 = alloca <4 x float>, align 16 270 %bitcast = bitcast <4 x float>* %alloc.0.0 to [4 x float]* 271 %idx3 = getelementptr inbounds [4 x float], [4 x float]* %bitcast, i32 0, i32 3 272 store float 0.000000e+00, float* %idx3, align 4 273 br label %for.body10 274 275for.body10: ; preds = %for.body10, %entry 276 %loopidx = phi i32 [ 0, %entry ], [ undef, %for.body10 ] 277 %unusedidx = getelementptr inbounds <4 x float>, <4 x float>* %alloc.0.0, i32 0, i32 %loopidx 278 br i1 undef, label %for.end, label %for.body10 279 280for.end: ; preds = %for.body10 281 store <4 x float> <float -1.000000e+00, float -1.000000e+00, float -1.000000e+00, float 0.000000e+00>, <4 x float>* %alloc.0.0, align 16 282 ret void 283} 284 285declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind 286declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind 287