Skip to content

Commit 7ab5253

Browse files
author
Johannes Doerfert
committed
[Attributor][Fix] Make sure we do not delete live code
Summary: Liveness needs to mark edges, not blocks as dead. Reviewers: sstefan1, uenoku Subscribers: hiraditya, bollu, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D67191 llvm-svn: 370975
1 parent d581dd5 commit 7ab5253

File tree

4 files changed

+78
-10
lines changed

4 files changed

+78
-10
lines changed

llvm/lib/Transforms/IPO/Attributor.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1883,8 +1883,20 @@ struct AAIsDeadImpl : public AAIsDead {
18831883
}
18841884
}
18851885

1886-
if (SplitPos == &NormalDestBB->front())
1887-
assumeLive(A, *NormalDestBB);
1886+
if (SplitPos == &NormalDestBB->front()) {
1887+
// If this is an invoke of a noreturn function the edge to the normal
1888+
// destination block is dead but not necessarily the block itself.
1889+
// TODO: We need to move to an edge based system during deduction and
1890+
// also manifest.
1891+
assert(!NormalDestBB->isLandingPad() &&
1892+
"Expected the normal destination not to be a landingpad!");
1893+
BasicBlock *SplitBB =
1894+
SplitBlockPredecessors(NormalDestBB, {BB}, ".dead");
1895+
// The split block is live even if it contains only an unreachable
1896+
// instruction at the end.
1897+
assumeLive(A, *SplitBB);
1898+
SplitPos = SplitBB->getTerminator();
1899+
}
18881900
}
18891901

18901902
BB = SplitPos->getParent();

llvm/test/Transforms/FunctionAttrs/liveness.ll

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ cond.true: ; preds = %entry
177177
%call = invoke i32 @foo_noreturn() to label %continue
178178
unwind label %cleanup
179179
; CHECK: %call = invoke i32 @foo_noreturn()
180-
; CHECK-NEXT: to label %continue unwind label %cleanup
180+
; CHECK-NEXT: to label %continue.dead unwind label %cleanup
181181

182182
cond.false: ; preds = %entry
183183
call void @normal_call()
@@ -189,7 +189,7 @@ cond.end: ; preds = %cond.false, %contin
189189
ret i32 %cond
190190

191191
continue:
192-
; CHECK: continue:
192+
; CHECK: continue.dead:
193193
; CHECK-NEXT: unreachable
194194
br label %cond.end
195195

@@ -663,3 +663,59 @@ define internal void @dead_e2() { ret void }
663663
; CHECK: Function Attrs: nofree nosync nounwind willreturn
664664
; CHECK-NEXT: define internal void @non_dead_d15()
665665
; CHECK-NOT: define internal void @dead_e
666+
667+
668+
declare void @blowup() noreturn
669+
define void @live_with_dead_entry() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
670+
; CHECK: define void @live_with_dead_entry(
671+
; CHECK-NEXT: entry:
672+
; CHECK-NEXT: invoke void @blowup()
673+
; CHECK-NEXT: to label %live_with_dead_entry.dead unwind label %lpad
674+
; CHECK: lpad: ; preds = %entry
675+
; CHECK-NEXT: %0 = landingpad { i8*, i32 }
676+
; CHECK-NEXT: catch i8* null
677+
; CHECK-NEXT: br label %live_with_dead_entry
678+
; CHECK: live_with_dead_entry.dead: ; preds = %entry
679+
; CHECK-NEXT: unreachable
680+
; CHECK: live_with_dead_entry: ; preds = %lpad
681+
; CHECK-NEXT: ret void
682+
entry:
683+
invoke void @blowup() to label %live_with_dead_entry unwind label %lpad
684+
lpad:
685+
%0 = landingpad { i8*, i32 } catch i8* null
686+
br label %live_with_dead_entry
687+
live_with_dead_entry:
688+
ret void
689+
}
690+
691+
define void @live_with_dead_entry_lp() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
692+
; CHECK: define void @live_with_dead_entry_lp(
693+
; CHECK-NEXT: entry:
694+
; CHECK-NEXT: invoke void @blowup()
695+
; CHECK-NEXT: to label %live_with_dead_entry.dead unwind label %lp1
696+
; CHECK: lp1: ; preds = %entry
697+
; CHECK-NEXT: %lp = landingpad { i8*, i32 }
698+
; CHECK-NEXT: catch i8* null
699+
; CHECK-NEXT: invoke void @blowup()
700+
; CHECK-NEXT: to label %live_with_dead_entry.dead1 unwind label %lp2
701+
; CHECK: lp2: ; preds = %lp1
702+
; CHECK-NEXT: %0 = landingpad { i8*, i32 }
703+
; CHECK-NEXT: catch i8* null
704+
; CHECK-NEXT: br label %live_with_dead_entry
705+
; CHECK: live_with_dead_entry.dead: ; preds = %entry
706+
; CHECK-NEXT: unreachable
707+
; CHECK: live_with_dead_entry.dead1: ; preds = %lp1
708+
; CHECK-NEXT: unreachable
709+
; CHECK: live_with_dead_entry: ; preds = %lp2
710+
; CHECK-NEXT: ret void
711+
entry:
712+
invoke void @blowup() to label %live_with_dead_entry unwind label %lp1
713+
lp1:
714+
%lp = landingpad { i8*, i32 } catch i8* null
715+
invoke void @blowup() to label %live_with_dead_entry unwind label %lp2
716+
lp2:
717+
%0 = landingpad { i8*, i32 } catch i8* null
718+
br label %live_with_dead_entry
719+
live_with_dead_entry:
720+
ret void
721+
}

llvm/test/Transforms/FunctionAttrs/noreturn_async.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@ entry:
4242
%retval = alloca i32, align 4
4343
%__exception_code = alloca i32, align 4
4444
; CHECK: invoke void @"?overflow@@YAXXZ"()
45-
; CHECK: to label %invoke.cont unwind label %catch.dispatch
45+
; CHECK: to label %invoke.cont.dead unwind label %catch.dispatch
4646
invoke void @"?overflow@@YAXXZ"()
4747
to label %invoke.cont unwind label %catch.dispatch
4848

4949
invoke.cont: ; preds = %entry
50-
; CHECK: invoke.cont:
50+
; CHECK: invoke.cont.dead:
5151
; CHECK-NEXT: unreachable
5252
br label %invoke.cont1
5353

@@ -101,12 +101,12 @@ entry:
101101
%retval = alloca i32, align 4
102102
%__exception_code = alloca i32, align 4
103103
; CHECK: invoke void @"?overflow@@YAXXZ_may_throw"()
104-
; CHECK: to label %invoke.cont unwind label %catch.dispatch
104+
; CHECK: to label %invoke.cont.dead unwind label %catch.dispatch
105105
invoke void @"?overflow@@YAXXZ_may_throw"()
106106
to label %invoke.cont unwind label %catch.dispatch
107107

108108
invoke.cont: ; preds = %entry
109-
; CHECK: invoke.cont:
109+
; CHECK: invoke.cont.dead:
110110
; CHECK-NEXT: unreachable
111111
br label %invoke.cont1
112112

llvm/test/Transforms/FunctionAttrs/noreturn_sync.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,12 @@ entry:
9797
%retval = alloca i32, align 4
9898
%__exception_code = alloca i32, align 4
9999
; CHECK: invoke void @"?overflow@@YAXXZ_may_throw"()
100-
; CHECK: to label %invoke.cont unwind label %catch.dispatch
100+
; CHECK: to label %invoke.cont.dead unwind label %catch.dispatch
101101
invoke void @"?overflow@@YAXXZ_may_throw"()
102102
to label %invoke.cont unwind label %catch.dispatch
103103

104104
invoke.cont: ; preds = %entry
105-
; CHECK: invoke.cont:
105+
; CHECK: invoke.cont.dead:
106106
; CHECK-NEXT: unreachable
107107
br label %invoke.cont1
108108

0 commit comments

Comments
 (0)