File tree Expand file tree Collapse file tree 2 files changed +40
-1
lines changed Expand file tree Collapse file tree 2 files changed +40
-1
lines changed Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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+ }
You can’t perform that action at this time.
0 commit comments