@@ -447,7 +447,7 @@ define void @test12_memset_other_store_in_between(i8* %ptr) {
447
447
ret void
448
448
}
449
449
450
- declare i8* @__memset_chk (i8* writeonly , i32 , i64 , i64 ) argmemonly
450
+ declare i8* @__memset_chk (i8* writeonly , i32 , i64 , i64 ) argmemonly writeonly nofree nounwind
451
451
452
452
define void @test12_memset_chk_other_store_in_between (i8* %ptr ) {
453
453
; CHECK-LABEL: @test12_memset_chk_other_store_in_between(
@@ -466,6 +466,60 @@ define void @test12_memset_chk_other_store_in_between(i8* %ptr) {
466
466
ret void
467
467
}
468
468
469
+ declare void @use (i8* )
470
+
471
+ define void @test12_memset_chk_other_store_in_between_stack_obj_escape_after (i64 %n ) {
472
+ ; CHECK-LABEL: @test12_memset_chk_other_store_in_between_stack_obj_escape_after(
473
+ ; CHECK-NEXT: [[OBJ:%.*]] = alloca [200 x i8], align 1
474
+ ; CHECK-NEXT: [[PTR:%.*]] = bitcast [200 x i8]* [[OBJ]] to i8*
475
+ ; CHECK-NEXT: [[CALL:%.*]] = tail call i8* @__memset_chk(i8* [[PTR]], i32 0, i64 10, i64 [[N:%.*]])
476
+ ; CHECK-NEXT: [[PTR_4:%.*]] = getelementptr i8, i8* [[PTR]], i64 4
477
+ ; CHECK-NEXT: store i8 8, i8* [[PTR_4]], align 1
478
+ ; CHECK-NEXT: [[PTR_5:%.*]] = getelementptr i8, i8* [[PTR]], i64 5
479
+ ; CHECK-NEXT: store i8 0, i8* [[PTR_5]], align 1
480
+ ; CHECK-NEXT: call void @use(i8* [[PTR]])
481
+ ; CHECK-NEXT: ret void
482
+ ;
483
+ %obj = alloca [200 x i8 ]
484
+ %ptr = bitcast [200 x i8 ]* %obj to i8*
485
+ %call = tail call i8* @__memset_chk (i8* %ptr , i32 0 , i64 10 , i64 %n )
486
+ %ptr.4 = getelementptr i8 , i8* %ptr , i64 4
487
+ store i8 8 , i8* %ptr.4
488
+ %ptr.5 = getelementptr i8 , i8* %ptr , i64 5
489
+ store i8 0 , i8* %ptr.5
490
+ call void @use (i8* %ptr )
491
+ ret void
492
+ }
493
+
494
+ define void @test12_memset_chk_other_store_in_between_stack_obj_escape_before (i64 %n ) {
495
+ ; CHECK-LABEL: @test12_memset_chk_other_store_in_between_stack_obj_escape_before(
496
+ ; CHECK-NEXT: [[OBJ:%.*]] = alloca [200 x i8], align 1
497
+ ; CHECK-NEXT: [[PTR:%.*]] = bitcast [200 x i8]* [[OBJ]] to i8*
498
+ ; CHECK-NEXT: call void @use(i8* [[PTR]])
499
+ ; CHECK-NEXT: [[CALL:%.*]] = tail call i8* @__memset_chk(i8* [[PTR]], i32 0, i64 10, i64 [[N:%.*]])
500
+ ; CHECK-NEXT: [[PTR_4:%.*]] = getelementptr i8, i8* [[PTR]], i64 4
501
+ ; CHECK-NEXT: store i8 8, i8* [[PTR_4]], align 1
502
+ ; CHECK-NEXT: [[PTR_5:%.*]] = getelementptr i8, i8* [[PTR]], i64 5
503
+ ; CHECK-NEXT: store i8 0, i8* [[PTR_5]], align 1
504
+ ; CHECK-NEXT: [[PTR_10:%.*]] = getelementptr i8, i8* [[PTR]], i64 10
505
+ ; CHECK-NEXT: store i8 0, i8* [[PTR_10]], align 1
506
+ ; CHECK-NEXT: call void @use(i8* [[PTR]])
507
+ ; CHECK-NEXT: ret void
508
+ ;
509
+ %obj = alloca [200 x i8 ]
510
+ %ptr = bitcast [200 x i8 ]* %obj to i8*
511
+ call void @use (i8* %ptr )
512
+ %call = tail call i8* @__memset_chk (i8* %ptr , i32 0 , i64 10 , i64 %n )
513
+ %ptr.4 = getelementptr i8 , i8* %ptr , i64 4
514
+ store i8 8 , i8* %ptr.4
515
+ %ptr.5 = getelementptr i8 , i8* %ptr , i64 5
516
+ store i8 0 , i8* %ptr.5
517
+ %ptr.10 = getelementptr i8 , i8* %ptr , i64 10
518
+ store i8 0 , i8* %ptr.10
519
+ call void @use (i8* %ptr )
520
+ ret void
521
+ }
522
+
469
523
define void @test12_memset_other_store_in_between_partial_overlap (i8* %ptr ) {
470
524
; CHECK-LABEL: @test12_memset_other_store_in_between_partial_overlap(
471
525
; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[PTR:%.*]], i8 0, i64 10, i1 false)
0 commit comments