From: Fabian Wolff Date: Fri, 19 Nov 2021 16:01:36 +0000 (+0000) Subject: [DSE] Add additional strncpy tests. X-Git-Tag: upstream/15.0.7~25218 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ffe1741b5ccab07cbf45fe99033e4119688eb5a5;p=platform%2Fupstream%2Fllvm.git [DSE] Add additional strncpy tests. Test for PR#52062 and one of the remaining cases of PR#47644. --- diff --git a/llvm/test/Transforms/DeadStoreElimination/libcalls.ll b/llvm/test/Transforms/DeadStoreElimination/libcalls.ll index 48addc9..0639f95 100644 --- a/llvm/test/Transforms/DeadStoreElimination/libcalls.ll +++ b/llvm/test/Transforms/DeadStoreElimination/libcalls.ll @@ -427,3 +427,80 @@ define void @dse_strncat(i8* nocapture readonly %src) { declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) + +declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind + +; Test that strncpy/memset overwriting each other is optimized out + +; strncpy -> memset, full overwrite +define void @dse_strncpy_test1(i8* noalias %out, i8* noalias %in) { +; CHECK-LABEL: @dse_strncpy_test1( +; CHECK-NEXT: [[CALL:%.*]] = tail call i8* @strncpy(i8* [[OUT:%.*]], i8* [[IN:%.*]], i64 100) +; CHECK-NEXT: tail call void @llvm.memset.p0i8.i64(i8* [[OUT]], i8 42, i64 100, i1 false) +; CHECK-NEXT: ret void +; + %call = tail call i8* @strncpy(i8* %out, i8* %in, i64 100) + tail call void @llvm.memset.p0i8.i64(i8* %out, i8 42, i64 100, i1 false) + ret void +} + +; strncpy -> memset, partial overwrite +define void @dse_strncpy_test2(i8* noalias %out, i8* noalias %in) { +; CHECK-LABEL: @dse_strncpy_test2( +; CHECK-NEXT: [[CALL:%.*]] = tail call i8* @strncpy(i8* [[OUT:%.*]], i8* [[IN:%.*]], i64 100) +; CHECK-NEXT: tail call void @llvm.memset.p0i8.i64(i8* [[OUT]], i8 42, i64 99, i1 false) +; CHECK-NEXT: ret void +; + %call = tail call i8* @strncpy(i8* %out, i8* %in, i64 100) + tail call void @llvm.memset.p0i8.i64(i8* %out, i8 42, i64 99, i1 false) + ret void +} + +; strncpy -> memset, different destination +define void @dse_strncpy_test3(i8* noalias %out1, i8* noalias %out2, i8* noalias %in) { +; CHECK-LABEL: @dse_strncpy_test3( +; CHECK-NEXT: [[CALL:%.*]] = tail call i8* @strncpy(i8* [[OUT1:%.*]], i8* [[IN:%.*]], i64 100) +; CHECK-NEXT: tail call void @llvm.memset.p0i8.i64(i8* [[OUT2:%.*]], i8 42, i64 100, i1 false) +; CHECK-NEXT: ret void +; + %call = tail call i8* @strncpy(i8* %out1, i8* %in, i64 100) + tail call void @llvm.memset.p0i8.i64(i8* %out2, i8 42, i64 100, i1 false) + ret void +} + + +; memset -> strncpy, full overwrite +define void @dse_strncpy_test4(i8* noalias %out, i8* noalias %in) { +; CHECK-LABEL: @dse_strncpy_test4( +; CHECK-NEXT: tail call void @llvm.memset.p0i8.i64(i8* [[OUT:%.*]], i8 42, i64 100, i1 false) +; CHECK-NEXT: [[CALL:%.*]] = tail call i8* @strncpy(i8* [[OUT]], i8* [[IN:%.*]], i64 100) +; CHECK-NEXT: ret void +; + tail call void @llvm.memset.p0i8.i64(i8* %out, i8 42, i64 100, i1 false) + %call = tail call i8* @strncpy(i8* %out, i8* %in, i64 100) + ret void +} + +; memset -> strncpy, partial overwrite +define void @dse_strncpy_test5(i8* noalias %out, i8* noalias %in) { +; CHECK-LABEL: @dse_strncpy_test5( +; CHECK-NEXT: tail call void @llvm.memset.p0i8.i64(i8* [[OUT:%.*]], i8 42, i64 100, i1 false) +; CHECK-NEXT: [[CALL:%.*]] = tail call i8* @strncpy(i8* [[OUT]], i8* [[IN:%.*]], i64 99) +; CHECK-NEXT: ret void +; + tail call void @llvm.memset.p0i8.i64(i8* %out, i8 42, i64 100, i1 false) + %call = tail call i8* @strncpy(i8* %out, i8* %in, i64 99) + ret void +} + +; memset -> strncpy, different destination +define void @dse_strncpy_test6(i8* noalias %out1, i8* noalias %out2, i8* noalias %in) { +; CHECK-LABEL: @dse_strncpy_test6( +; CHECK-NEXT: tail call void @llvm.memset.p0i8.i64(i8* [[OUT1:%.*]], i8 42, i64 100, i1 false) +; CHECK-NEXT: [[CALL:%.*]] = tail call i8* @strncpy(i8* [[OUT2:%.*]], i8* [[IN:%.*]], i64 100) +; CHECK-NEXT: ret void +; + tail call void @llvm.memset.p0i8.i64(i8* %out1, i8 42, i64 100, i1 false) + %call = tail call i8* @strncpy(i8* %out2, i8* %in, i64 100) + ret void +}