54 lines · plain
1; RUN: opt -passes='require<profile-summary>,function(codegenprepare)' -S -mtriple=x86_64-linux < %s | FileCheck %s2 3; The ret instruction can be duplicated into BB case2 even though there is an4; intermediate BB exit1 and call to llvm.assume.5 6@ptr = external global ptr, align 87 8; CHECK: %ret1 = tail call ptr @qux()9; CHECK-NEXT: ret ptr %ret110 11; CHECK: %ret2 = tail call ptr @bar()12; CHECK-NEXT: ret ptr %ret213 14define ptr @foo(i64 %size, i64 %v1, i64 %v2) {15entry:16 %a = alloca i817 call void @llvm.lifetime.start.p0(ptr %a) nounwind18 %cmp1 = icmp ult i64 %size, 102519 br i1 %cmp1, label %if.end, label %case120 21case1:22 %ret1 = tail call ptr @qux()23 br label %exit224 25if.end:26 %cmp2 = icmp ult i64 %v1, %v227 br i1 %cmp2, label %case3, label %case228 29case2:30 %ret2 = tail call ptr @bar()31 br label %exit132 33case3:34 %ret3 = load ptr, ptr @ptr, align 835 br label %exit136 37exit1:38 %retval1 = phi ptr [ %ret2, %case2 ], [ %ret3, %case3 ]39 %cmp3 = icmp ne ptr %retval1, null40 tail call void @llvm.assume(i1 %cmp3)41 br label %exit242 43exit2:44 %retval2 = phi ptr [ %ret1, %case1 ], [ %retval1, %exit1 ]45 call void @llvm.lifetime.end.p0(ptr %a) nounwind46 ret ptr %retval247}48 49declare void @llvm.assume(i1)50declare ptr @qux()51declare ptr @bar()52declare void @llvm.lifetime.start.p0(ptr nocapture) nounwind53declare void @llvm.lifetime.end.p0(ptr nocapture) nounwind54