llvm/test/Transforms/JumpThreading/pr26096.ll
Jun Bum Lim da7cbcd8d5 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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259403 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-01 20:55:11 +00:00

74 lines
1.8 KiB
LLVM

; 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
call void @fn2(i1 %B)
ret void
if.end: ; preds = %entry
call void @fn2(i1 %B)
ret void
}
define internal void @fn2(i1 %B) unnamed_addr {
entry:
call void @fn1()
call void @fn1()
call void @fn1()
br i1 %B, label %if.end, label %if.then
if.then:
unreachable
if.end:
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 }