Skip to content

Commit 4a419ea

Browse files
committed
[DSE] Add additional memset_chk tests.
1 parent d64b3e4 commit 4a419ea

File tree

2 files changed

+112
-1
lines changed

2 files changed

+112
-1
lines changed

llvm/test/Transforms/DeadStoreElimination/libcalls.ll

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,63 @@ define void @dse_strncpy_memset_chk_test1(i8* noalias %out, i8* noalias %in, i64
477477
ret void
478478
}
479479

480+
declare void @use(i8*)
481+
482+
define void @dse_memset_chk_cannot_eliminates_store(i8* %out, i64 %n) {
483+
; CHECK-LABEL: @dse_memset_chk_cannot_eliminates_store(
484+
; CHECK-NEXT: store i8 10, i8* [[OUT:%.*]], align 1
485+
; CHECK-NEXT: [[CALL_2:%.*]] = tail call i8* @__memset_chk(i8* [[OUT]], i32 42, i64 100, i64 [[N:%.*]])
486+
; CHECK-NEXT: ret void
487+
;
488+
store i8 10, i8* %out
489+
%call.2 = tail call i8* @__memset_chk(i8* %out, i32 42, i64 100, i64 %n)
490+
ret void
491+
}
492+
493+
define void @dse_memset_chk_eliminates_store_local_object_escapes_after(i64 %n) {
494+
; CHECK-LABEL: @dse_memset_chk_eliminates_store_local_object_escapes_after(
495+
; CHECK-NEXT: [[A:%.*]] = alloca [200 x i8], align 1
496+
; CHECK-NEXT: [[OUT:%.*]] = bitcast [200 x i8]* [[A]] to i8*
497+
; CHECK-NEXT: store i8 10, i8* [[OUT]], align 1
498+
; CHECK-NEXT: [[OUT_100:%.*]] = getelementptr i8, i8* [[OUT]], i64 100
499+
; CHECK-NEXT: store i8 10, i8* [[OUT_100]], align 1
500+
; CHECK-NEXT: [[CALL_2:%.*]] = tail call i8* @__memset_chk(i8* [[OUT]], i32 42, i64 100, i64 [[N:%.*]])
501+
; CHECK-NEXT: call void @use(i8* [[OUT]])
502+
; CHECK-NEXT: ret void
503+
;
504+
%a = alloca [200 x i8]
505+
%out = bitcast [200 x i8]* %a to i8*
506+
store i8 10, i8* %out
507+
%out.100 = getelementptr i8, i8* %out, i64 100
508+
store i8 10, i8* %out.100
509+
%call.2 = tail call i8* @__memset_chk(i8* %out, i32 42, i64 100, i64 %n)
510+
call void @use(i8* %out)
511+
ret void
512+
}
513+
514+
define void @dse_memset_chk_eliminates_store_local_object_escapes_before(i64 %n) {
515+
; CHECK-LABEL: @dse_memset_chk_eliminates_store_local_object_escapes_before(
516+
; CHECK-NEXT: [[A:%.*]] = alloca [200 x i8], align 1
517+
; CHECK-NEXT: [[OUT:%.*]] = bitcast [200 x i8]* [[A]] to i8*
518+
; CHECK-NEXT: call void @use(i8* [[OUT]])
519+
; CHECK-NEXT: store i8 10, i8* [[OUT]], align 1
520+
; CHECK-NEXT: [[OUT_100:%.*]] = getelementptr i8, i8* [[OUT]], i64 100
521+
; CHECK-NEXT: store i8 0, i8* [[OUT_100]], align 1
522+
; CHECK-NEXT: [[CALL_2:%.*]] = tail call i8* @__memset_chk(i8* [[OUT]], i32 42, i64 100, i64 [[N:%.*]])
523+
; CHECK-NEXT: call void @use(i8* [[OUT]])
524+
; CHECK-NEXT: ret void
525+
;
526+
%a = alloca [200 x i8]
527+
%out = bitcast [200 x i8]* %a to i8*
528+
call void @use(i8* %out)
529+
store i8 10, i8* %out
530+
%out.100 = getelementptr i8, i8* %out, i64 100
531+
store i8 0, i8* %out.100
532+
%call.2 = tail call i8* @__memset_chk(i8* %out, i32 42, i64 100, i64 %n)
533+
call void @use(i8* %out)
534+
ret void
535+
}
536+
480537
; strncpy -> memset, partial overwrite
481538
define void @dse_strncpy_test2(i8* noalias %out, i8* noalias %in) {
482539
; CHECK-LABEL: @dse_strncpy_test2(

llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ define void @test12_memset_other_store_in_between(i8* %ptr) {
447447
ret void
448448
}
449449

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
451451

452452
define void @test12_memset_chk_other_store_in_between(i8* %ptr) {
453453
; CHECK-LABEL: @test12_memset_chk_other_store_in_between(
@@ -466,6 +466,60 @@ define void @test12_memset_chk_other_store_in_between(i8* %ptr) {
466466
ret void
467467
}
468468

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+
469523
define void @test12_memset_other_store_in_between_partial_overlap(i8* %ptr) {
470524
; CHECK-LABEL: @test12_memset_other_store_in_between_partial_overlap(
471525
; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[PTR:%.*]], i8 0, i64 10, i1 false)

0 commit comments

Comments
 (0)