2016-01-10 15:13:33 +08:00
|
|
|
; RUN: opt -prune-eh -inline -jump-threading -S < %s | FileCheck %s
|
|
|
|
|
|
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
|
|
target triple = "x86_64-unknown-linux-gnu"
|
|
|
|
|
|
|
|
@d = external global i32*, align 8
|
|
|
|
|
|
|
|
define void @fn3(i1 %B) {
|
|
|
|
entry:
|
|
|
|
br i1 %B, label %if.end, label %if.then
|
|
|
|
|
|
|
|
if.then: ; preds = %entry
|
Avoid inlining call sites in unreachable-terminated block
Summary:
If the normal destination of the invoke or the parent block of the call site is unreachable-terminated, there is little point in inlining the call site unless there is literally zero cost. Unlike my previous change (D15289), this change specifically handle the call sites followed by unreachable in the same basic block for call or in the normal destination for the invoke. This change could be a reasonable first step to conservatively inline call sites leading to an unreachable-terminated block while BFI / BPI is not yet available in inliner.
Reviewers: manmanren, majnemer, hfinkel, davidxl, mcrosier, dblaikie, eraman
Subscribers: dblaikie, davidxl, mcrosier, llvm-commits
Differential Revision: http://reviews.llvm.org/D16616
llvm-svn: 259403
2016-02-02 04:55:11 +08:00
|
|
|
call void @fn2(i1 %B)
|
2016-01-10 15:13:33 +08:00
|
|
|
ret void
|
|
|
|
|
|
|
|
if.end: ; preds = %entry
|
Avoid inlining call sites in unreachable-terminated block
Summary:
If the normal destination of the invoke or the parent block of the call site is unreachable-terminated, there is little point in inlining the call site unless there is literally zero cost. Unlike my previous change (D15289), this change specifically handle the call sites followed by unreachable in the same basic block for call or in the normal destination for the invoke. This change could be a reasonable first step to conservatively inline call sites leading to an unreachable-terminated block while BFI / BPI is not yet available in inliner.
Reviewers: manmanren, majnemer, hfinkel, davidxl, mcrosier, dblaikie, eraman
Subscribers: dblaikie, davidxl, mcrosier, llvm-commits
Differential Revision: http://reviews.llvm.org/D16616
llvm-svn: 259403
2016-02-02 04:55:11 +08:00
|
|
|
call void @fn2(i1 %B)
|
2016-01-10 15:13:33 +08:00
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
Avoid inlining call sites in unreachable-terminated block
Summary:
If the normal destination of the invoke or the parent block of the call site is unreachable-terminated, there is little point in inlining the call site unless there is literally zero cost. Unlike my previous change (D15289), this change specifically handle the call sites followed by unreachable in the same basic block for call or in the normal destination for the invoke. This change could be a reasonable first step to conservatively inline call sites leading to an unreachable-terminated block while BFI / BPI is not yet available in inliner.
Reviewers: manmanren, majnemer, hfinkel, davidxl, mcrosier, dblaikie, eraman
Subscribers: dblaikie, davidxl, mcrosier, llvm-commits
Differential Revision: http://reviews.llvm.org/D16616
llvm-svn: 259403
2016-02-02 04:55:11 +08:00
|
|
|
define internal void @fn2(i1 %B) unnamed_addr {
|
2016-01-10 15:13:33 +08:00
|
|
|
entry:
|
|
|
|
call void @fn1()
|
|
|
|
call void @fn1()
|
|
|
|
call void @fn1()
|
Avoid inlining call sites in unreachable-terminated block
Summary:
If the normal destination of the invoke or the parent block of the call site is unreachable-terminated, there is little point in inlining the call site unless there is literally zero cost. Unlike my previous change (D15289), this change specifically handle the call sites followed by unreachable in the same basic block for call or in the normal destination for the invoke. This change could be a reasonable first step to conservatively inline call sites leading to an unreachable-terminated block while BFI / BPI is not yet available in inliner.
Reviewers: manmanren, majnemer, hfinkel, davidxl, mcrosier, dblaikie, eraman
Subscribers: dblaikie, davidxl, mcrosier, llvm-commits
Differential Revision: http://reviews.llvm.org/D16616
llvm-svn: 259403
2016-02-02 04:55:11 +08:00
|
|
|
br i1 %B, label %if.end, label %if.then
|
|
|
|
if.then:
|
|
|
|
unreachable
|
|
|
|
|
|
|
|
if.end:
|
2016-01-10 15:13:33 +08:00
|
|
|
unreachable
|
|
|
|
}
|
|
|
|
|
|
|
|
; CHECK-LABEL: define internal void @fn2(
|
|
|
|
; CHECK: %[[LOAD:.*]] = load i32*, i32** @d, align 8
|
|
|
|
; CHECK: %tobool1.i = icmp eq i32* %[[LOAD]], null
|
|
|
|
|
|
|
|
define internal void @fn1() unnamed_addr {
|
|
|
|
entry:
|
|
|
|
br label %for.body
|
|
|
|
|
|
|
|
for.body: ; preds = %entry
|
|
|
|
%0 = load i32*, i32** @d, align 8
|
|
|
|
%tobool1 = icmp eq i32* %0, null
|
|
|
|
br i1 %tobool1, label %cond.false, label %cond.end
|
|
|
|
|
|
|
|
cond.false: ; preds = %for.body
|
|
|
|
call void @__assert_fail(i8* null)
|
|
|
|
unreachable
|
|
|
|
|
|
|
|
cond.end: ; preds = %for.body
|
|
|
|
%1 = load i32*, i32** @d, align 8
|
|
|
|
%cmp = icmp eq i32* %1, null
|
|
|
|
br i1 %cmp, label %cond.end4, label %cond.false3
|
|
|
|
|
|
|
|
cond.false3: ; preds = %cond.end
|
|
|
|
call void @__assert_fail(i8* null)
|
|
|
|
unreachable
|
|
|
|
|
|
|
|
cond.end4: ; preds = %cond.end
|
|
|
|
call void @__assert_fail(i8* null)
|
|
|
|
unreachable
|
|
|
|
|
|
|
|
for.end: ; No predecessors!
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
|
|
|
declare void @__assert_fail(i8*)
|
|
|
|
|
|
|
|
; Function Attrs: noreturn nounwind
|
|
|
|
declare void @llvm.trap() #0
|
|
|
|
|
|
|
|
attributes #0 = { noreturn nounwind }
|