Skip to content

Commit 9c929e6

Browse files
Merge pull request swiftlang#76686 from aschwaighofer/large_types_reg2mem_undef
LargeTypesReg2Mem: Map `undef` SIL values to an undefined address on the stack
2 parents b62de58 + e909720 commit 9c929e6

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

lib/IRGen/LoadableByAddress.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -3510,7 +3510,7 @@ class AddressAssignment {
35103510
auto it = valueToAddressMap.find(v);
35113511

35123512
// This can happen if we deem a container type small but a contained type
3513-
// big.
3513+
// big or we have an undef operand.
35143514
if (it == valueToAddressMap.end()) {
35153515
if (auto *sv = dyn_cast<SingleValueInstruction>(v)) {
35163516
auto addr = createAllocStack(v->getType());
@@ -3520,6 +3520,12 @@ class AddressAssignment {
35203520
mapValueToAddress(v, addr);
35213521
return addr;
35223522
}
3523+
if (isa<SILUndef>(v)) {
3524+
auto undefAddr = createAllocStack(v->getType());
3525+
mapValueToAddress(v, undefAddr);
3526+
return undefAddr;
3527+
}
3528+
35233529
}
35243530
assert(it != valueToAddressMap.end());
35253531

test/IRGen/loadable_by_address_reg2mem.sil

+33
Original file line numberDiff line numberDiff line change
@@ -364,3 +364,36 @@ bb0(%0 : $*X):
364364
dealloc_stack %1 : $*X
365365
throw %3 : $X
366366
}
367+
368+
// CHECK: sil @test15
369+
// CHECK: cond_br %1, bb1, bb2
370+
371+
// CHECK: bb1:
372+
// CHECK: copy_addr [take] {{.*}} to [init] [[PHI:%[0-9]+]] : $*X
373+
// CHECK: br bb3
374+
375+
// CHECK: bb2:
376+
// CHECK: [[UNDEF:%.*]] = alloc_stack $X
377+
// CHECK: copy_addr [take] [[UNDEF]] to [init] [[PHI]] : $*X
378+
// CHECK: dealloc_stack [[UNDEF]] : $*X
379+
// CHECK: br bb3
380+
// CHECK:} // end sil function 'test15'
381+
382+
sil @test15 : $@convention(thin) (X, Builtin.Int1) -> () {
383+
bb0(%0: $X, %1: $Builtin.Int1):
384+
%2 = alloc_stack $X
385+
cond_br %1, bb1, bb2
386+
387+
bb1:
388+
br bb3(%0 : $X)
389+
390+
bb2:
391+
br bb3(undef : $X)
392+
393+
bb3(%4 : $X):
394+
store %4 to %2: $*X
395+
396+
dealloc_stack %2 : $*X
397+
%t = tuple ()
398+
return %t : $()
399+
}

0 commit comments

Comments
 (0)