Skip to content

Commit 95ae4a9

Browse files
dschuffgithub-actions[bot]
authored andcommitted
Automerge: [WebAssembly] Optimize lowering of constant-sized memcpy and memset (#163294)
We currently emit a check that the size operand isn't zero, to avoid executing the wasm memory.copy instruction when it would trap. But this isn't necessary if the operand is a constant. Fixes #163245
2 parents 60fb1c9 + 19a58a5 commit 95ae4a9

File tree

3 files changed

+128
-105
lines changed

3 files changed

+128
-105
lines changed

llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,29 @@ static MachineBasicBlock *LowerMemcpy(MachineInstr &MI, DebugLoc DL,
601601
MachineOperand Src = MI.getOperand(3);
602602
MachineOperand Len = MI.getOperand(4);
603603

604+
// If the length is a constant, we don't actually need the check.
605+
if (MachineInstr *Def = MRI.getVRegDef(Len.getReg())) {
606+
if (Def->getOpcode() == WebAssembly::CONST_I32 ||
607+
Def->getOpcode() == WebAssembly::CONST_I64) {
608+
if (Def->getOperand(1).getImm() == 0) {
609+
// A zero-length memcpy is a no-op.
610+
MI.eraseFromParent();
611+
return BB;
612+
}
613+
// A non-zero-length memcpy doesn't need a zero check.
614+
unsigned MemoryCopy =
615+
Int64 ? WebAssembly::MEMORY_COPY_A64 : WebAssembly::MEMORY_COPY_A32;
616+
BuildMI(*BB, MI, DL, TII.get(MemoryCopy))
617+
.add(DstMem)
618+
.add(SrcMem)
619+
.add(Dst)
620+
.add(Src)
621+
.add(Len);
622+
MI.eraseFromParent();
623+
return BB;
624+
}
625+
}
626+
604627
// We're going to add an extra use to `Len` to test if it's zero; that
605628
// use shouldn't be a kill, even if the original use is.
606629
MachineOperand NoKillLen = Len;
@@ -669,6 +692,28 @@ static MachineBasicBlock *LowerMemset(MachineInstr &MI, DebugLoc DL,
669692
MachineOperand Val = MI.getOperand(2);
670693
MachineOperand Len = MI.getOperand(3);
671694

695+
// If the length is a constant, we don't actually need the check.
696+
if (MachineInstr *Def = MRI.getVRegDef(Len.getReg())) {
697+
if (Def->getOpcode() == WebAssembly::CONST_I32 ||
698+
Def->getOpcode() == WebAssembly::CONST_I64) {
699+
if (Def->getOperand(1).getImm() == 0) {
700+
// A zero-length memset is a no-op.
701+
MI.eraseFromParent();
702+
return BB;
703+
}
704+
// A non-zero-length memset doesn't need a zero check.
705+
unsigned MemoryFill =
706+
Int64 ? WebAssembly::MEMORY_FILL_A64 : WebAssembly::MEMORY_FILL_A32;
707+
BuildMI(*BB, MI, DL, TII.get(MemoryFill))
708+
.add(Mem)
709+
.add(Dst)
710+
.add(Val)
711+
.add(Len);
712+
MI.eraseFromParent();
713+
return BB;
714+
}
715+
}
716+
672717
// We're going to add an extra use to `Len` to test if it's zero; that
673718
// use shouldn't be a kill, even if the original use is.
674719
MachineOperand NoKillLen = Len;

llvm/test/CodeGen/WebAssembly/bulk-memory.ll

Lines changed: 43 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,31 @@ define void @memset_i32(ptr %dest, i8 %val, i32 %len) {
104104
ret void
105105
}
106106

107+
; CHECK-LABEL: memcpy_0:
108+
; CHECK-NEXT: .functype memcpy_0 (i32, i32) -> ()
109+
; CHECK-NEXT: return
110+
define void @memcpy_0(ptr %dest, ptr %src) {
111+
call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr %src, i32 0, i1 0)
112+
ret void
113+
}
114+
115+
; CHECK-LABEL: memmove_0:
116+
; CHECK-NEXT: .functype memmove_0 (i32, i32) -> ()
117+
; CHECK-NEXT: return
118+
define void @memmove_0(ptr %dest, ptr %src) {
119+
call void @llvm.memmove.p0.p0.i32(ptr %dest, ptr %src, i32 0, i1 0)
120+
ret void
121+
}
122+
123+
; CHECK-LABEL: memset_0:
124+
; NO-BULK-MEM-NOT: memory.fill
125+
; BULK-MEM-NEXT: .functype memset_0 (i32, i32) -> ()
126+
; BULK-MEM-NEXT: return
127+
define void @memset_0(ptr %dest, i8 %val) {
128+
call void @llvm.memset.p0.i32(ptr %dest, i8 %val, i32 0, i1 0)
129+
ret void
130+
}
131+
107132
; CHECK-LABEL: memcpy_1:
108133
; CHECK-NEXT: .functype memcpy_1 (i32, i32) -> ()
109134
; CHECK-NEXT: i32.load8_u $push[[L0:[0-9]+]]=, 0($1)
@@ -137,14 +162,8 @@ define void @memset_1(ptr %dest, i8 %val) {
137162
; CHECK-LABEL: memcpy_1024:
138163
; NO-BULK-MEM-NOT: memory.copy
139164
; BULK-MEM-NEXT: .functype memcpy_1024 (i32, i32) -> ()
140-
; BULK-MEM-NEXT: block
141165
; BULK-MEM-NEXT: i32.const $push[[L0:[0-9]+]]=, 1024
142-
; BULK-MEM-NEXT: i32.eqz $push[[L1:[0-9]+]]=, $pop[[L0]]
143-
; BULK-MEM-NEXT: br_if 0, $pop[[L1]]
144-
; BULK-MEM-NEXT: i32.const $push[[L2:[0-9]+]]=, 1024
145-
; BULK-MEM-NEXT: memory.copy 0, 0, $0, $1, $pop[[L2]]
146-
; BULK-MEM-NEXT: .LBB{{.*}}:
147-
; BULK-MEM-NEXT: end_block
166+
; BULK-MEM-NEXT: memory.copy 0, 0, $0, $1, $pop[[L0]]
148167
; BULK-MEM-NEXT: return
149168
define void @memcpy_1024(ptr %dest, ptr %src) {
150169
call void @llvm.memcpy.p0.p0.i32(ptr %dest, ptr %src, i32 1024, i1 0)
@@ -154,14 +173,8 @@ define void @memcpy_1024(ptr %dest, ptr %src) {
154173
; CHECK-LABEL: memmove_1024:
155174
; NO-BULK-MEM-NOT: memory.copy
156175
; BULK-MEM-NEXT: .functype memmove_1024 (i32, i32) -> ()
157-
; BULK-MEM-NEXT: block
158176
; BULK-MEM-NEXT: i32.const $push[[L0:[0-9]+]]=, 1024
159-
; BULK-MEM-NEXT: i32.eqz $push[[L1:[0-9]+]]=, $pop[[L0]]
160-
; BULK-MEM-NEXT: br_if 0, $pop[[L1]]
161-
; BULK-MEM-NEXT: i32.const $push[[L2:[0-9]+]]=, 1024
162-
; BULK-MEM-NEXT: memory.copy 0, 0, $0, $1, $pop[[L2]]
163-
; BULK-MEM-NEXT: .LBB{{.*}}:
164-
; BULK-MEM-NEXT: end_block
177+
; BULK-MEM-NEXT: memory.copy 0, 0, $0, $1, $pop[[L0]]
165178
; BULK-MEM-NEXT: return
166179
define void @memmove_1024(ptr %dest, ptr %src) {
167180
call void @llvm.memmove.p0.p0.i32(ptr %dest, ptr %src, i32 1024, i1 0)
@@ -171,14 +184,8 @@ define void @memmove_1024(ptr %dest, ptr %src) {
171184
; CHECK-LABEL: memset_1024:
172185
; NO-BULK-MEM-NOT: memory.fill
173186
; BULK-MEM-NEXT: .functype memset_1024 (i32, i32) -> ()
174-
; BULK-MEM-NEXT: block
175187
; BULK-MEM-NEXT: i32.const $push[[L0:[0-9]+]]=, 1024
176-
; BULK-MEM-NEXT: i32.eqz $push[[L1:[0-9]+]]=, $pop[[L0]]
177-
; BULK-MEM-NEXT: br_if 0, $pop[[L1]]
178-
; BULK-MEM-NEXT: i32.const $push[[L2:[0-9]+]]=, 1024
179-
; BULK-MEM-NEXT: memory.fill 0, $0, $1, $pop[[L2]]
180-
; BULK-MEM-NEXT: .LBB{{.*}}:
181-
; BULK-MEM-NEXT: end_block
188+
; BULK-MEM-NEXT: memory.fill 0, $0, $1, $pop[[L0]]
182189
; BULK-MEM-NEXT: return
183190
define void @memset_1024(ptr %dest, i8 %val) {
184191
call void @llvm.memset.p0.i32(ptr %dest, i8 %val, i32 1024, i1 0)
@@ -201,17 +208,11 @@ define void @memset_1024(ptr %dest, i8 %val) {
201208
; BULK-MEM-NEXT: .functype memcpy_alloca_src (i32) -> ()
202209
; BULK-MEM-NEXT: global.get $push[[L0:[0-9]+]]=, __stack_pointer
203210
; BULK-MEM-NEXT: i32.const $push[[L1:[0-9]+]]=, 112
204-
; BULK-MEM-NEXT: i32.sub $[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]]
205-
; BULK-MEM-NEXT: block
206-
; BULK-MEM-NEXT: i32.const $push[[L3:[0-9]+]]=, 100
207-
; BULK-MEM-NEXT: i32.eqz $push[[L4:[0-9]+]]=, $pop[[L3]]
208-
; BULK-MEM-NEXT: br_if 0, $pop[[L4]]
209-
; BULK-MEM-NEXT: i32.const $push[[L5:[0-9]+]]=, 12
210-
; BULK-MEM-NEXT: i32.add $push[[L6:[0-9]+]]=, $[[L2]], $pop[[L5]]
211-
; BULK-MEM-NEXT: i32.const $push[[L7:[0-9]+]]=, 100
212-
; BULK-MEM-NEXT: memory.copy 0, 0, $0, $pop[[L6]], $pop[[L7]]
213-
; BULK-MEM-NEXT: .LBB{{.*}}:
214-
; BULK-MEM-NEXT: end_block
211+
; BULK-MEM-NEXT: i32.sub $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]]
212+
; BULK-MEM-NEXT: i32.const $push[[L3:[0-9]+]]=, 12
213+
; BULK-MEM-NEXT: i32.add $push[[L4:[0-9]+]]=, $pop[[L2]], $pop[[L3]]
214+
; BULK-MEM-NEXT: i32.const $push[[L5:[0-9]+]]=, 100
215+
; BULK-MEM-NEXT: memory.copy 0, 0, $0, $pop[[L4]], $pop[[L5]]
215216
; BULK-MEM-NEXT: return
216217
define void @memcpy_alloca_src(ptr %dst) {
217218
%a = alloca [100 x i8]
@@ -224,17 +225,11 @@ define void @memcpy_alloca_src(ptr %dst) {
224225
; BULK-MEM-NEXT: .functype memcpy_alloca_dst (i32) -> ()
225226
; BULK-MEM-NEXT: global.get $push[[L0:[0-9]+]]=, __stack_pointer
226227
; BULK-MEM-NEXT: i32.const $push[[L1:[0-9]+]]=, 112
227-
; BULK-MEM-NEXT: i32.sub $[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]]
228-
; BULK-MEM-NEXT: block
229-
; BULK-MEM-NEXT: i32.const $push[[L3:[0-9]+]]=, 100
230-
; BULK-MEM-NEXT: i32.eqz $push[[L4:[0-9]+]]=, $pop[[L3]]
231-
; BULK-MEM-NEXT: br_if 0, $pop[[L4]]
232-
; BULK-MEM-NEXT: i32.const $push[[L5:[0-9]+]]=, 12
233-
; BULK-MEM-NEXT: i32.add $push[[L6:[0-9]+]]=, $[[L2]], $pop[[L5]]
234-
; BULK-MEM-NEXT: i32.const $push[[L7:[0-9]+]]=, 100
235-
; BULK-MEM-NEXT: memory.copy 0, 0, $pop[[L6]], $0, $pop[[L7]]
236-
; BULK-MEM-NEXT: .LBB{{.*}}:
237-
; BULK-MEM-NEXT: end_block
228+
; BULK-MEM-NEXT: i32.sub $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]]
229+
; BULK-MEM-NEXT: i32.const $push[[L3:[0-9]+]]=, 12
230+
; BULK-MEM-NEXT: i32.add $push[[L4:[0-9]+]]=, $pop[[L2]], $pop[[L3]]
231+
; BULK-MEM-NEXT: i32.const $push[[L5:[0-9]+]]=, 100
232+
; BULK-MEM-NEXT: memory.copy 0, 0, $pop[[L4]], $0, $pop[[L5]]
238233
; BULK-MEM-NEXT: return
239234
define void @memcpy_alloca_dst(ptr %src) {
240235
%a = alloca [100 x i8]
@@ -247,17 +242,11 @@ define void @memcpy_alloca_dst(ptr %src) {
247242
; BULK-MEM-NEXT: .functype memset_alloca (i32) -> ()
248243
; BULK-MEM-NEXT: global.get $push[[L0:[0-9]+]]=, __stack_pointer
249244
; BULK-MEM-NEXT: i32.const $push[[L1:[0-9]+]]=, 112
250-
; BULK-MEM-NEXT: i32.sub $1=, $pop[[L0]], $pop[[L1]]
251-
; BULK-MEM-NEXT: block
252-
; BULK-MEM-NEXT: i32.const $push[[L2:[0-9]+]]=, 100
253-
; BULK-MEM-NEXT: i32.eqz $push[[L3:[0-9]+]]=, $pop[[L2]]
254-
; BULK-MEM-NEXT: br_if 0, $pop[[L3]]
255-
; BULK-MEM-NEXT: i32.const $push[[L4:[0-9]+]]=, 12
256-
; BULK-MEM-NEXT: i32.add $push[[L5:[0-9]+]]=, $1, $pop[[L4]]
257-
; BULK-MEM-NEXT: i32.const $push[[L6:[0-9]+]]=, 100
258-
; BULK-MEM-NEXT: memory.fill 0, $pop[[L5]], $0, $pop[[L6]]
259-
; BULK-MEM-NEXT: .LBB{{.*}}:
260-
; BULK-MEM-NEXT: end_block
245+
; BULK-MEM-NEXT: i32.sub $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]]
246+
; BULK-MEM-NEXT: i32.const $push[[L3:[0-9]+]]=, 12
247+
; BULK-MEM-NEXT: i32.add $push[[L4:[0-9]+]]=, $pop[[L2]], $pop[[L3]]
248+
; BULK-MEM-NEXT: i32.const $push[[L5:[0-9]+]]=, 100
249+
; BULK-MEM-NEXT: memory.fill 0, $pop[[L4]], $0, $pop[[L5]]
261250
; BULK-MEM-NEXT: return
262251
define void @memset_alloca(i8 %val) {
263252
%a = alloca [100 x i8]

llvm/test/CodeGen/WebAssembly/bulk-memory64.ll

Lines changed: 40 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,31 @@ define void @memset_i32(ptr %dest, i8 %val, i64 %len) {
110110
ret void
111111
}
112112

113+
; CHECK-LABEL: memcpy_0:
114+
; CHECK-NEXT: .functype memcpy_0 (i64, i64) -> ()
115+
; CHECK-NEXT: return
116+
define void @memcpy_0(ptr %dest, ptr %src) {
117+
call void @llvm.memcpy.p0.p0.i64(ptr %dest, ptr %src, i64 0, i1 0)
118+
ret void
119+
}
120+
121+
; CHECK-LABEL: memmove_0:
122+
; CHECK-NEXT: .functype memmove_0 (i64, i64) -> ()
123+
; CHECK-NEXT: return
124+
define void @memmove_0(ptr %dest, ptr %src) {
125+
call void @llvm.memmove.p0.p0.i64(ptr %dest, ptr %src, i64 0, i1 0)
126+
ret void
127+
}
128+
129+
; CHECK-LABEL: memset_0:
130+
; NO-BULK-MEM-NOT: memory.fill
131+
; BULK-MEM-NEXT: .functype memset_0 (i64, i32) -> ()
132+
; BULK-MEM-NEXT: return
133+
define void @memset_0(ptr %dest, i8 %val) {
134+
call void @llvm.memset.p0.i64(ptr %dest, i8 %val, i64 0, i1 0)
135+
ret void
136+
}
137+
113138
; CHECK-LABEL: memcpy_1:
114139
; CHECK-NEXT: .functype memcpy_1 (i64, i64) -> ()
115140
; CHECK-NEXT: i32.load8_u $push[[L0:[0-9]+]]=, 0($1)
@@ -143,14 +168,8 @@ define void @memset_1(ptr %dest, i8 %val) {
143168
; CHECK-LABEL: memcpy_1024:
144169
; NO-BULK-MEM-NOT: memory.copy
145170
; BULK-MEM-NEXT: .functype memcpy_1024 (i64, i64) -> ()
146-
; BULK-MEM-NEXT: block
147-
; BULK-MEM-NEXT: i64.const $push[[L1:[0-9]+]]=, 1024
148-
; BULK-MEM-NEXT: i64.eqz $push0=, $pop[[L1]]
149-
; BULK-MEM-NEXT: br_if 0, $pop0
150171
; BULK-MEM-NEXT: i64.const $push[[L0:[0-9]+]]=, 1024
151172
; BULK-MEM-NEXT: memory.copy 0, 0, $0, $1, $pop[[L0]]
152-
; BULK-MEM-NEXT: .LBB{{.*}}:
153-
; BULK-MEM-NEXT: end_block
154173
; BULK-MEM-NEXT: return
155174
define void @memcpy_1024(ptr %dest, ptr %src) {
156175
call void @llvm.memcpy.p0.p0.i64(ptr %dest, ptr %src, i64 1024, i1 0)
@@ -160,14 +179,8 @@ define void @memcpy_1024(ptr %dest, ptr %src) {
160179
; CHECK-LABEL: memmove_1024:
161180
; NO-BULK-MEM-NOT: memory.copy
162181
; BULK-MEM-NEXT: .functype memmove_1024 (i64, i64) -> ()
163-
; BULK-MEM-NEXT: block
164-
; BULK-MEM-NEXT: i64.const $push[[L1:[0-9]+]]=, 1024
165-
; BULK-MEM-NEXT: i64.eqz $push0=, $pop[[L1]]
166-
; BULK-MEM-NEXT: br_if 0, $pop0
167182
; BULK-MEM-NEXT: i64.const $push[[L0:[0-9]+]]=, 1024
168183
; BULK-MEM-NEXT: memory.copy 0, 0, $0, $1, $pop[[L0]]
169-
; BULK-MEM-NEXT: .LBB{{.*}}:
170-
; BULK-MEM-NEXT: end_block
171184
; BULK-MEM-NEXT: return
172185
define void @memmove_1024(ptr %dest, ptr %src) {
173186
call void @llvm.memmove.p0.p0.i64(ptr %dest, ptr %src, i64 1024, i1 0)
@@ -177,14 +190,8 @@ define void @memmove_1024(ptr %dest, ptr %src) {
177190
; CHECK-LABEL: memset_1024:
178191
; NO-BULK-MEM-NOT: memory.fill
179192
; BULK-MEM-NEXT: .functype memset_1024 (i64, i32) -> ()
180-
; BULK-MEM-NEXT: block
181-
; BULK-MEM-NEXT: i64.const $push[[L1:[0-9]+]]=, 1024
182-
; BULK-MEM-NEXT: i64.eqz $push0=, $pop[[L1]]
183-
; BULK-MEM-NEXT: br_if 0, $pop0
184193
; BULK-MEM-NEXT: i64.const $push[[L0:[0-9]+]]=, 1024
185194
; BULK-MEM-NEXT: memory.fill 0, $0, $1, $pop[[L0]]
186-
; BULK-MEM-NEXT: .LBB{{.*}}:
187-
; BULK-MEM-NEXT: end_block
188195
; BULK-MEM-NEXT: return
189196
define void @memset_1024(ptr %dest, i8 %val) {
190197
call void @llvm.memset.p0.i64(ptr %dest, i8 %val, i64 1024, i1 0)
@@ -207,17 +214,11 @@ define void @memset_1024(ptr %dest, i8 %val) {
207214
; BULK-MEM-NEXT: .functype memcpy_alloca_src (i64) -> ()
208215
; BULK-MEM-NEXT: global.get $push[[L1:[0-9]+]]=, __stack_pointer
209216
; BULK-MEM-NEXT: i64.const $push[[L0:[0-9]+]]=, 112
210-
; BULK-MEM-NEXT: i64.sub $[[L2:[0-9]+]]=, $pop[[L1]], $pop[[L0]]
211-
; BULK-MEM-NEXT: block
212-
; BULK-MEM-NEXT: i64.const $push[[L3:[0-9]+]]=, 100
213-
; BULK-MEM-NEXT: i64.eqz $push[[L4:[0-9]+]]=, $pop[[L3]]
214-
; BULK-MEM-NEXT: br_if 0, $pop[[L4]]
215-
; BULK-MEM-NEXT: i64.const $push[[L5:[0-9]+]]=, 12
216-
; BULK-MEM-NEXT: i64.add $push[[L6:[0-9]+]]=, $[[L2]], $pop[[L5]]
217-
; BULK-MEM-NEXT: i64.const $push[[L7:[0-9]+]]=, 100
218-
; BULK-MEM-NEXT: memory.copy 0, 0, $0, $pop[[L6]], $pop[[L7]]
219-
; BULK-MEM-NEXT: .LBB{{.*}}:
220-
; BULK-MEM-NEXT: end_block
217+
; BULK-MEM-NEXT: i64.sub $push[[L2:[0-9]+]]=, $pop[[L1]], $pop[[L0]]
218+
; BULK-MEM-NEXT: i64.const $push[[L3:[0-9]+]]=, 12
219+
; BULK-MEM-NEXT: i64.add $push[[L4:[0-9]+]]=, $pop[[L2]], $pop[[L3]]
220+
; BULK-MEM-NEXT: i64.const $push[[L5:[0-9]+]]=, 100
221+
; BULK-MEM-NEXT: memory.copy 0, 0, $0, $pop[[L4]], $pop[[L5]]
221222
; BULK-MEM-NEXT: return
222223
define void @memcpy_alloca_src(ptr %dst) {
223224
%a = alloca [100 x i8]
@@ -230,17 +231,11 @@ define void @memcpy_alloca_src(ptr %dst) {
230231
; BULK-MEM-NEXT: .functype memcpy_alloca_dst (i64) -> ()
231232
; BULK-MEM-NEXT: global.get $push[[L1:[0-9]+]]=, __stack_pointer
232233
; BULK-MEM-NEXT: i64.const $push[[L0:[0-9]+]]=, 112
233-
; BULK-MEM-NEXT: i64.sub $[[L2:[0-9]+]]=, $pop[[L1]], $pop[[L0]]
234-
; BULK-MEM-NEXT: block
235-
; BULK-MEM-NEXT: i64.const $push[[L3:[0-9]+]]=, 100
236-
; BULK-MEM-NEXT: i64.eqz $push[[L4:[0-9]+]]=, $pop[[L3]]
237-
; BULK-MEM-NEXT: br_if 0, $pop[[L4]]
238-
; BULK-MEM-NEXT: i64.const $push[[L5:[0-9]+]]=, 12
239-
; BULK-MEM-NEXT: i64.add $push[[L6:[0-9]+]]=, $[[L2]], $pop[[L5]]
240-
; BULK-MEM-NEXT: i64.const $push[[L7:[0-9]+]]=, 100
241-
; BULK-MEM-NEXT: memory.copy 0, 0, $pop[[L6]], $0, $pop[[L7]]
242-
; BULK-MEM-NEXT: .LBB{{.*}}:
243-
; BULK-MEM-NEXT: end_block
234+
; BULK-MEM-NEXT: i64.sub $push[[L2:[0-9]+]]=, $pop[[L1]], $pop[[L0]]
235+
; BULK-MEM-NEXT: i64.const $push[[L3:[0-9]+]]=, 12
236+
; BULK-MEM-NEXT: i64.add $push[[L4:[0-9]+]]=, $pop[[L2]], $pop[[L3]]
237+
; BULK-MEM-NEXT: i64.const $push[[L5:[0-9]+]]=, 100
238+
; BULK-MEM-NEXT: memory.copy 0, 0, $pop[[L4]], $0, $pop[[L5]]
244239
; BULK-MEM-NEXT: return
245240
define void @memcpy_alloca_dst(ptr %src) {
246241
%a = alloca [100 x i8]
@@ -253,17 +248,11 @@ define void @memcpy_alloca_dst(ptr %src) {
253248
; BULK-MEM-NEXT: .functype memset_alloca (i32) -> ()
254249
; BULK-MEM-NEXT: global.get $push[[L1:[0-9]+]]=, __stack_pointer
255250
; BULK-MEM-NEXT: i64.const $push[[L0:[0-9]+]]=, 112
256-
; BULK-MEM-NEXT: i64.sub $1=, $pop[[L1]], $pop[[L0]]
257-
; BULK-MEM-NEXT: block
258-
; BULK-MEM-NEXT: i64.const $push[[L2:[0-9]+]]=, 100
259-
; BULK-MEM-NEXT: i64.eqz $push[[L3:[0-9]+]]=, $pop[[L2]]
260-
; BULK-MEM-NEXT: br_if 0, $pop[[L3]]
261-
; BULK-MEM-NEXT: i64.const $push[[L4:[0-9]+]]=, 12
262-
; BULK-MEM-NEXT: i64.add $push[[L5:[0-9]+]]=, $1, $pop[[L4]]
263-
; BULK-MEM-NEXT: i64.const $push[[L6:[0-9]+]]=, 100
264-
; BULK-MEM-NEXT: memory.fill 0, $pop[[L5]], $0, $pop[[L6]]
265-
; BULK-MEM-NEXT: .LBB{{.*}}:
266-
; BULK-MEM-NEXT: end_block
251+
; BULK-MEM-NEXT: i64.sub $push[[L2:[0-9]+]]=, $pop[[L1]], $pop[[L0]]
252+
; BULK-MEM-NEXT: i64.const $push[[L3:[0-9]+]]=, 12
253+
; BULK-MEM-NEXT: i64.add $push[[L4:[0-9]+]]=, $pop[[L2]], $pop[[L3]]
254+
; BULK-MEM-NEXT: i64.const $push[[L5:[0-9]+]]=, 100
255+
; BULK-MEM-NEXT: memory.fill 0, $pop[[L4]], $0, $pop[[L5]]
267256
; BULK-MEM-NEXT: return
268257
define void @memset_alloca(i8 %val) {
269258
%a = alloca [100 x i8]

0 commit comments

Comments
 (0)