394 lines · plain
1; RUN: llc -mtriple=i686 -O0 < %s | FileCheck %s2; RUN: llc -mtriple=x86_64 -O0 < %s | FileCheck %s3 4; CHECK-LABEL: in_bounds:5; CHECK-NOT: __stack_chk_guard6define i32 @in_bounds() #0 {7 %var = alloca i32, align 48 store i32 0, ptr %var, align 49 %ret = load i32, ptr %var, align 410 ret i32 %ret11}12 13; CHECK-LABEL: constant_out_of_bounds:14; CHECK: __stack_chk_guard15define i32 @constant_out_of_bounds() #0 {16 %var = alloca i32, align 417 store i32 0, ptr %var, align 418 %gep = getelementptr inbounds i32, ptr %var, i32 119 %ret = load i32, ptr %gep, align 420 ret i32 %ret21}22 23; CHECK-LABEL: nonconstant_out_of_bounds:24; CHECK: __stack_chk_guard25define i32 @nonconstant_out_of_bounds(i32 %n) #0 {26 %var = alloca i32, align 427 store i32 0, ptr %var, align 428 %gep = getelementptr inbounds i32, ptr %var, i32 %n29 %ret = load i32, ptr %gep, align 430 ret i32 %ret31}32 33; CHECK-LABEL: phi_before_gep_in_bounds:34; CHECK-NOT: __stack_chk_guard35define i32 @phi_before_gep_in_bounds(i32 %k) #0 {36entry:37 %var1 = alloca i32, align 438 %var2 = alloca i32, align 439 store i32 0, ptr %var1, align 440 store i32 0, ptr %var2, align 441 %cmp = icmp ne i32 %k, 042 br i1 %cmp, label %if, label %then43 44if:45 br label %then46 47then:48 %ptr = phi ptr [ %var1, %entry ], [ %var2, %if ]49 %ret = load i32, ptr %ptr, align 450 ret i32 %ret51}52 53; CHECK-LABEL: phi_before_gep_constant_out_of_bounds:54; CHECK: __stack_chk_guard55define i32 @phi_before_gep_constant_out_of_bounds(i32 %k) #0 {56entry:57 %var1 = alloca i32, align 458 %var2 = alloca i32, align 459 store i32 0, ptr %var1, align 460 store i32 0, ptr %var2, align 461 %cmp = icmp ne i32 %k, 062 br i1 %cmp, label %if, label %then63 64if:65 br label %then66 67then:68 %ptr = phi ptr [ %var1, %entry ], [ %var2, %if ]69 %gep = getelementptr inbounds i32, ptr %ptr, i32 170 %ret = load i32, ptr %gep, align 471 ret i32 %ret72}73 74; CHECK-LABEL: phi_before_gep_nonconstant_out_of_bounds:75; CHECK: __stack_chk_guard76define i32 @phi_before_gep_nonconstant_out_of_bounds(i32 %k, i32 %n) #0 {77entry:78 %var1 = alloca i32, align 479 %var2 = alloca i32, align 480 store i32 0, ptr %var1, align 481 store i32 0, ptr %var2, align 482 %cmp = icmp ne i32 %k, 083 br i1 %cmp, label %if, label %then84 85if:86 br label %then87 88then:89 %ptr = phi ptr [ %var1, %entry ], [ %var2, %if ]90 %gep = getelementptr inbounds i32, ptr %ptr, i32 %n91 %ret = load i32, ptr %gep, align 492 ret i32 %ret93}94 95; CHECK-LABEL: phi_after_gep_in_bounds:96; CHECK-NOT: __stack_chk_guard97define i32 @phi_after_gep_in_bounds(i32 %k) #0 {98entry:99 %var1 = alloca i32, align 4100 %var2 = alloca i32, align 4101 store i32 0, ptr %var1, align 4102 store i32 0, ptr %var2, align 4103 %cmp = icmp ne i32 %k, 0104 br i1 %cmp, label %if, label %else105 106if:107 br label %then108 109else:110 br label %then111 112then:113 %ptr = phi ptr [ %var1, %if ], [ %var2, %else ]114 %ret = load i32, ptr %ptr, align 4115 ret i32 %ret116}117 118; CHECK-LABEL: phi_after_gep_constant_out_of_bounds_a:119; CHECK: __stack_chk_guard120define i32 @phi_after_gep_constant_out_of_bounds_a(i32 %k) #0 {121entry:122 %var1 = alloca i32, align 4123 %var2 = alloca i32, align 4124 store i32 0, ptr %var1, align 4125 store i32 0, ptr %var2, align 4126 %cmp = icmp ne i32 %k, 0127 br i1 %cmp, label %if, label %else128 129if:130 br label %then131 132else:133 %gep2 = getelementptr inbounds i32, ptr %var2, i32 1134 br label %then135 136then:137 %ptr = phi ptr [ %var1, %if ], [ %gep2, %else ]138 %ret = load i32, ptr %ptr, align 4139 ret i32 %ret140}141 142; CHECK-LABEL: phi_after_gep_constant_out_of_bounds_b:143; CHECK: __stack_chk_guard144define i32 @phi_after_gep_constant_out_of_bounds_b(i32 %k) #0 {145entry:146 %var1 = alloca i32, align 4147 %var2 = alloca i32, align 4148 store i32 0, ptr %var1, align 4149 store i32 0, ptr %var2, align 4150 %cmp = icmp ne i32 %k, 0151 br i1 %cmp, label %if, label %else152 153if:154 %gep1 = getelementptr inbounds i32, ptr %var1, i32 1155 br label %then156 157else:158 br label %then159 160then:161 %ptr = phi ptr [ %gep1, %if ], [ %var2, %else ]162 %ret = load i32, ptr %ptr, align 4163 ret i32 %ret164}165 166; CHECK-LABEL: phi_different_types_a:167; CHECK: __stack_chk_guard168define i64 @phi_different_types_a(i32 %k) #0 {169entry:170 %var1 = alloca i64, align 4171 %var2 = alloca i32, align 4172 store i64 0, ptr %var1, align 4173 store i32 0, ptr %var2, align 4174 %cmp = icmp ne i32 %k, 0175 br i1 %cmp, label %if, label %then176 177if:178 br label %then179 180then:181 %ptr = phi ptr [ %var1, %entry ], [ %var2, %if ]182 %ret = load i64, ptr %ptr, align 4183 ret i64 %ret184}185 186; CHECK-LABEL: phi_different_types_b:187; CHECK: __stack_chk_guard188define i64 @phi_different_types_b(i32 %k) #0 {189entry:190 %var1 = alloca i32, align 4191 %var2 = alloca i64, align 4192 store i32 0, ptr %var1, align 4193 store i64 0, ptr %var2, align 4194 %cmp = icmp ne i32 %k, 0195 br i1 %cmp, label %if, label %then196 197if:198 br label %then199 200then:201 %ptr = phi ptr [ %var2, %entry ], [ %var1, %if ]202 %ret = load i64, ptr %ptr, align 4203 ret i64 %ret204}205 206; CHECK-LABEL: phi_after_gep_nonconstant_out_of_bounds_a:207; CHECK: __stack_chk_guard208define i32 @phi_after_gep_nonconstant_out_of_bounds_a(i32 %k, i32 %n) #0 {209entry:210 %var1 = alloca i32, align 4211 %var2 = alloca i32, align 4212 store i32 0, ptr %var1, align 4213 store i32 0, ptr %var2, align 4214 %cmp = icmp ne i32 %k, 0215 br i1 %cmp, label %if, label %else216 217if:218 br label %then219 220else:221 %gep2 = getelementptr inbounds i32, ptr %var2, i32 %n222 br label %then223 224then:225 %ptr = phi ptr [ %var1, %if ], [ %gep2, %else ]226 %ret = load i32, ptr %ptr, align 4227 ret i32 %ret228}229 230; CHECK-LABEL: phi_after_gep_nonconstant_out_of_bounds_b:231; CHECK: __stack_chk_guard232define i32 @phi_after_gep_nonconstant_out_of_bounds_b(i32 %k, i32 %n) #0 {233entry:234 %var1 = alloca i32, align 4235 %var2 = alloca i32, align 4236 store i32 0, ptr %var1, align 4237 store i32 0, ptr %var2, align 4238 %cmp = icmp ne i32 %k, 0239 br i1 %cmp, label %if, label %else240 241if:242 %gep1 = getelementptr inbounds i32, ptr %var1, i32 %n243 br label %then244 245else:246 br label %then247 248then:249 %ptr = phi ptr [ %gep1, %if ], [ %var2, %else ]250 %ret = load i32, ptr %ptr, align 4251 ret i32 %ret252}253 254%struct.outer = type { %struct.inner, %struct.inner }255%struct.inner = type { i32, i32 }256 257; CHECK-LABEL: struct_in_bounds:258; CHECK-NOT: __stack_chk_guard259define void @struct_in_bounds() #0 {260 %var = alloca %struct.outer, align 4261 %outergep = getelementptr inbounds %struct.outer, ptr %var, i32 0, i32 1262 %innergep = getelementptr inbounds %struct.inner, ptr %outergep, i32 0, i32 1263 store i32 0, ptr %innergep, align 4264 ret void265}266 267; CHECK-LABEL: struct_constant_out_of_bounds_a:268; CHECK: __stack_chk_guard269define void @struct_constant_out_of_bounds_a() #0 {270 %var = alloca %struct.outer, align 4271 %outergep = getelementptr inbounds %struct.outer, ptr %var, i32 1, i32 0272 store i32 0, ptr %outergep, align 4273 ret void274}275 276; CHECK-LABEL: struct_constant_out_of_bounds_b:277; Here the offset is out-of-bounds of the addressed struct.inner member, but278; still within bounds of the outer struct so no stack guard is needed.279; CHECK-NOT: __stack_chk_guard280define void @struct_constant_out_of_bounds_b() #0 {281 %var = alloca %struct.outer, align 4282 %innergep = getelementptr inbounds %struct.inner, ptr %var, i32 1, i32 0283 store i32 0, ptr %innergep, align 4284 ret void285}286 287; CHECK-LABEL: struct_constant_out_of_bounds_c:288; Here we are out-of-bounds of both the inner and outer struct.289; CHECK: __stack_chk_guard290define void @struct_constant_out_of_bounds_c() #0 {291 %var = alloca %struct.outer, align 4292 %outergep = getelementptr inbounds %struct.outer, ptr %var, i32 0, i32 1293 %innergep = getelementptr inbounds %struct.inner, ptr %outergep, i32 1, i32 0294 store i32 0, ptr %innergep, align 4295 ret void296}297 298; CHECK-LABEL: struct_nonconstant_out_of_bounds_a:299; CHECK: __stack_chk_guard300define void @struct_nonconstant_out_of_bounds_a(i32 %n) #0 {301 %var = alloca %struct.outer, align 4302 %outergep = getelementptr inbounds %struct.outer, ptr %var, i32 %n, i32 0303 store i32 0, ptr %outergep, align 4304 ret void305}306 307; CHECK-LABEL: struct_nonconstant_out_of_bounds_b:308; CHECK: __stack_chk_guard309define void @struct_nonconstant_out_of_bounds_b(i32 %n) #0 {310 %var = alloca %struct.outer, align 4311 %innergep = getelementptr inbounds %struct.inner, ptr %var, i32 %n, i32 0312 store i32 0, ptr %innergep, align 4313 ret void314}315 316; CHECK-LABEL: bitcast_smaller_load317; CHECK-NOT: __stack_chk_guard318define i32 @bitcast_smaller_load() #0 {319 %var = alloca i64, align 4320 store i64 0, ptr %var, align 4321 %ret = load i32, ptr %var, align 4322 ret i32 %ret323}324 325; CHECK-LABEL: bitcast_same_size_load326; CHECK-NOT: __stack_chk_guard327define i32 @bitcast_same_size_load() #0 {328 %var = alloca i64, align 4329 store i64 0, ptr %var, align 4330 %gep = getelementptr inbounds %struct.inner, ptr %var, i32 0, i32 1331 %ret = load i32, ptr %gep, align 4332 ret i32 %ret333}334 335; CHECK-LABEL: bitcast_larger_load336; CHECK: __stack_chk_guard337define i64 @bitcast_larger_load() #0 {338 %var = alloca i32, align 4339 store i32 0, ptr %var, align 4340 %ret = load i64, ptr %var, align 4341 ret i64 %ret342}343 344; CHECK-LABEL: bitcast_larger_store345; CHECK: __stack_chk_guard346define i32 @bitcast_larger_store() #0 {347 %var = alloca i32, align 4348 store i64 0, ptr %var, align 4349 %ret = load i32, ptr %var, align 4350 ret i32 %ret351}352 353; CHECK-LABEL: bitcast_larger_cmpxchg354; CHECK: __stack_chk_guard355define i64 @bitcast_larger_cmpxchg(i64 %desired, i64 %new) #0 {356 %var = alloca i32, align 4357 %pair = cmpxchg ptr %var, i64 %desired, i64 %new seq_cst monotonic358 %ret = extractvalue { i64, i1 } %pair, 0359 ret i64 %ret360}361 362; CHECK-LABEL: bitcast_larger_atomic_rmw363; CHECK: __stack_chk_guard364define i64 @bitcast_larger_atomic_rmw() #0 {365 %var = alloca i32, align 4366 %ret = atomicrmw add ptr %var, i64 1 monotonic367 ret i64 %ret368}369 370%struct.packed = type <{ i16, i32 }>371 372; CHECK-LABEL: bitcast_overlap373; CHECK: __stack_chk_guard374define i32 @bitcast_overlap() #0 {375 %var = alloca i32, align 4376 %gep = getelementptr inbounds %struct.packed, ptr %var, i32 0, i32 1377 %ret = load i32, ptr %gep, align 2378 ret i32 %ret379}380 381%struct.multi_dimensional = type { [10 x [10 x i32]], i32 }382 383; CHECK-LABEL: multi_dimensional_array384; CHECK: __stack_chk_guard385define i32 @multi_dimensional_array() #0 {386 %var = alloca %struct.multi_dimensional, align 4387 %gep2 = getelementptr inbounds [10 x [10 x i32]], ptr %var, i32 0, i32 10388 %gep3 = getelementptr inbounds [10 x i32], ptr %gep2, i32 0, i32 5389 %ret = load i32, ptr %gep3, align 4390 ret i32 %ret391}392 393attributes #0 = { sspstrong }394