brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.2 KiB · 5b7ae83 Raw
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