@@ -38,8 +38,9 @@ define void @noaliasdst(ptr %src, ptr noalias %dst) {
3838
3939define void @destroysrc (ptr %src , ptr %dst ) {
4040; CHECK-LABEL: @destroysrc(
41- ; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[SRC:%.*]], i8 0, i64 16, i1 false)
42- ; CHECK-NEXT: call void @llvm.memmove.p0.p0.i64(ptr align 8 [[DST:%.*]], ptr align 8 [[SRC]], i64 16, i1 false)
41+ ; CHECK-NEXT: [[TMP1:%.*]] = load [[S:%.*]], ptr [[SRC:%.*]], align 8
42+ ; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[SRC]], i8 0, i64 16, i1 false)
43+ ; CHECK-NEXT: store [[S]] [[TMP1]], ptr [[DST:%.*]], align 8
4344; CHECK-NEXT: ret void
4445;
4546 %1 = load %S , ptr %src
@@ -50,8 +51,8 @@ define void @destroysrc(ptr %src, ptr %dst) {
5051
5152define void @destroynoaliassrc (ptr noalias %src , ptr %dst ) {
5253; CHECK-LABEL: @destroynoaliassrc(
53- ; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[DST:%.*]], ptr align 8 [[SRC:%.* ]], i64 16, i1 false)
54- ; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[SRC]], i8 0, i64 16, i1 false)
54+ ; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[DST:%.*]], ptr align 8 [[SRC]], i64 16, i1 false)
55+ ; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[SRC:%.* ]], i8 0, i64 16, i1 false)
5556; CHECK-NEXT: ret void
5657;
5758 %1 = load %S , ptr %src
@@ -62,8 +63,9 @@ define void @destroynoaliassrc(ptr noalias %src, ptr %dst) {
6263
6364define void @copyalias (ptr %src , ptr %dst ) {
6465; CHECK-LABEL: @copyalias(
65- ; CHECK-NEXT: call void @llvm.memmove.p0.p0.i64(ptr align 8 [[DST:%.*]], ptr align 8 [[SRC:%.*]], i64 16, i1 false)
66- ; CHECK-NEXT: call void @llvm.memmove.p0.p0.i64(ptr align 8 [[DST]], ptr align 8 [[SRC]], i64 16, i1 false)
66+ ; CHECK-NEXT: [[TMP1:%.*]] = load [[S:%.*]], ptr [[SRC:%.*]], align 8
67+ ; CHECK-NEXT: call void @llvm.memmove.p0.p0.i64(ptr align 8 [[DST:%.*]], ptr align 8 [[SRC]], i64 16, i1 false)
68+ ; CHECK-NEXT: store [[S]] [[TMP1]], ptr [[DST]], align 8
6769; CHECK-NEXT: ret void
6870;
6971 %1 = load %S , ptr %src
@@ -77,9 +79,9 @@ define void @copyalias(ptr %src, ptr %dst) {
7779; sure we lift the computation as well if needed and possible.
7880define void @addrproducer (ptr %src , ptr %dst ) {
7981; CHECK-LABEL: @addrproducer(
80- ; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[DST:%.*]], i8 undef, i64 16, i1 false)
8182; CHECK-NEXT: [[DST2:%.*]] = getelementptr [[S:%.*]], ptr [[DST]], i64 1
8283; CHECK-NEXT: call void @llvm.memmove.p0.p0.i64(ptr align 8 [[DST2]], ptr align 8 [[SRC:%.*]], i64 16, i1 false)
84+ ; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[DST:%.*]], i8 undef, i64 16, i1 false)
8385; CHECK-NEXT: ret void
8486;
8587 %1 = load %S , ptr %src
@@ -91,10 +93,11 @@ define void @addrproducer(ptr %src, ptr %dst) {
9193
9294define void @aliasaddrproducer (ptr %src , ptr %dst , ptr %dstidptr ) {
9395; CHECK-LABEL: @aliasaddrproducer(
96+ ; CHECK-NEXT: [[TMP1:%.*]] = load [[S:%.*]], ptr [[SRC:%.*]], align 8
9497; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[DST:%.*]], i8 undef, i64 16, i1 false)
9598; CHECK-NEXT: [[DSTINDEX:%.*]] = load i32, ptr [[DSTIDPTR:%.*]], align 4
96- ; CHECK-NEXT: [[DST2:%.*]] = getelementptr [[S:%.* ]], ptr [[DST]], i32 [[DSTINDEX]]
97- ; CHECK-NEXT: call void @llvm.memmove.p0.p0.i64(ptr align 8 [[DST2 ]], ptr align 8 [[SRC:%.* ]], i64 16, i1 false)
99+ ; CHECK-NEXT: [[DST2:%.*]] = getelementptr [[S]], ptr [[DST]], i32 [[DSTINDEX]]
100+ ; CHECK-NEXT: store [[S]] [[TMP1 ]], ptr [[DST2 ]], align 8
98101; CHECK-NEXT: ret void
99102;
100103 %1 = load %S , ptr %src
@@ -107,11 +110,11 @@ define void @aliasaddrproducer(ptr %src, ptr %dst, ptr %dstidptr) {
107110
108111define void @noaliasaddrproducer (ptr %src , ptr noalias %dst , ptr noalias %dstidptr ) {
109112; CHECK-LABEL: @noaliasaddrproducer(
110- ; CHECK-NEXT: [[TMP1 :%.*]] = load i32, ptr [[DSTIDPTR:%.*]], align 4
111- ; CHECK-NEXT: [[DSTINDEX:%.*]] = or i32 [[TMP1 ]], 1
113+ ; CHECK-NEXT: [[TMP2 :%.*]] = load i32, ptr [[DSTIDPTR:%.*]], align 4
114+ ; CHECK-NEXT: [[DSTINDEX:%.*]] = or i32 [[TMP2 ]], 1
112115; CHECK-NEXT: [[DST2:%.*]] = getelementptr [[S:%.*]], ptr [[DST:%.*]], i32 [[DSTINDEX]]
113- ; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[DST2]], ptr align 8 [[SRC:%.* ]], i64 16, i1 false)
114- ; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[SRC]], i8 undef, i64 16, i1 false)
116+ ; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[DST2]], ptr align 8 [[SRC]], i64 16, i1 false)
117+ ; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[SRC:%.* ]], i8 undef, i64 16, i1 false)
115118; CHECK-NEXT: ret void
116119;
117120 %1 = load %S , ptr %src
@@ -127,7 +130,7 @@ define void @throwing_call(ptr noalias %src, ptr %dst) {
127130; CHECK-LABEL: @throwing_call(
128131; CHECK-NEXT: [[TMP1:%.*]] = load [[S:%.*]], ptr [[SRC:%.*]], align 8
129132; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[SRC]], i8 0, i64 16, i1 false)
130- ; CHECK-NEXT: call void @call() # [[ATTR2:[0-9]+ ]]
133+ ; CHECK-NEXT: call void @call() [[ATTR2:#.* ]]
131134; CHECK-NEXT: store [[S]] [[TMP1]], ptr [[DST:%.*]], align 8
132135; CHECK-NEXT: ret void
133136;
0 commit comments