xref: /llvm-project/llvm/test/Transforms/CodeGenPrepare/X86/tailcall-assume-xbb.ll (revision f1ec0d12bb0843f0deab83ef2b5cf1339cbc4f0b)
1; RUN: opt -passes='require<profile-summary>,function(codegenprepare)' -S -mtriple=x86_64-linux < %s | FileCheck %s
2
3; The ret instruction can be duplicated into BB case2 even though there is an
4; intermediate BB exit1 and call to llvm.assume.
5
6@ptr = external global ptr, align 8
7
8; CHECK:       %ret1 = tail call ptr @qux()
9; CHECK-NEXT:  ret ptr %ret1
10
11; CHECK:       %ret2 = tail call ptr @bar()
12; CHECK-NEXT:  ret ptr %ret2
13
14define ptr @foo(i64 %size, i64 %v1, i64 %v2) {
15entry:
16  %a = alloca i8
17  call void @llvm.lifetime.start.p0(i64 -1, ptr %a) nounwind
18  %cmp1 = icmp ult i64 %size, 1025
19  br i1 %cmp1, label %if.end, label %case1
20
21case1:
22  %ret1 = tail call ptr @qux()
23  br label %exit2
24
25if.end:
26  %cmp2 = icmp ult i64 %v1, %v2
27  br i1 %cmp2, label %case3, label %case2
28
29case2:
30  %ret2 = tail call ptr @bar()
31  br label %exit1
32
33case3:
34  %ret3 = load ptr, ptr @ptr, align 8
35  br label %exit1
36
37exit1:
38  %retval1 = phi ptr [ %ret2, %case2 ], [ %ret3, %case3 ]
39  %cmp3 = icmp ne ptr %retval1, null
40  tail call void @llvm.assume(i1 %cmp3)
41  br label %exit2
42
43exit2:
44  %retval2 = phi ptr [ %ret1, %case1 ], [ %retval1, %exit1 ]
45  call void @llvm.lifetime.end.p0(i64 -1, ptr %a) nounwind
46  ret ptr %retval2
47}
48
49declare void @llvm.assume(i1)
50declare ptr @qux()
51declare ptr @bar()
52declare void @llvm.lifetime.start.p0(i64, ptr nocapture) nounwind
53declare void @llvm.lifetime.end.p0(i64, ptr nocapture) nounwind
54