File tree 2 files changed +40
-1
lines changed
2 files changed +40
-1
lines changed Original file line number Diff line number Diff line change @@ -3510,7 +3510,7 @@ class AddressAssignment {
3510
3510
auto it = valueToAddressMap.find (v);
3511
3511
3512
3512
// This can happen if we deem a container type small but a contained type
3513
- // big.
3513
+ // big or we have an undef operand .
3514
3514
if (it == valueToAddressMap.end ()) {
3515
3515
if (auto *sv = dyn_cast<SingleValueInstruction>(v)) {
3516
3516
auto addr = createAllocStack (v->getType ());
@@ -3520,6 +3520,12 @@ class AddressAssignment {
3520
3520
mapValueToAddress (v, addr);
3521
3521
return addr;
3522
3522
}
3523
+ if (isa<SILUndef>(v)) {
3524
+ auto undefAddr = createAllocStack (v->getType ());
3525
+ mapValueToAddress (v, undefAddr);
3526
+ return undefAddr;
3527
+ }
3528
+
3523
3529
}
3524
3530
assert (it != valueToAddressMap.end ());
3525
3531
Original file line number Diff line number Diff line change @@ -364,3 +364,36 @@ bb0(%0 : $*X):
364
364
dealloc_stack %1 : $*X
365
365
throw %3 : $X
366
366
}
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