69 lines · plain
1; Tests that some target (e.g. ppc) can support tail call under condition.2; RUN: opt < %s -passes='cgscc(coro-split),simplifycfg,early-cse' -S \3; RUN: -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 | FileCheck %s4; RUN: opt < %s -passes='cgscc(coro-split),simplifycfg,early-cse' -S \5; RUN: -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr10 --code-model=medium \6; RUN: | FileCheck %s7; RUN: opt < %s -passes='cgscc(coro-split),simplifycfg,early-cse' -S \8; RUN: -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr10 --code-model=medium -mattr=+longcall \9; RUN: | FileCheck %s10; RUN: opt < %s -passes='cgscc(coro-split),simplifycfg,early-cse' -S \11; RUN: -mtriple=ppc32-- | FileCheck %s12 13define void @f() #0 {14entry:15 %id = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null)16 %alloc = call ptr @malloc(i64 16) #317 %vFrame = call noalias nonnull ptr @llvm.coro.begin(token %id, ptr %alloc)18 19 %save = call token @llvm.coro.save(ptr null)20 %addr1 = call ptr @llvm.coro.subfn.addr(ptr null, i8 0)21 call fastcc void %addr1(ptr null)22 23 %suspend = call i8 @llvm.coro.suspend(token %save, i1 false)24 switch i8 %suspend, label %exit [25 i8 0, label %await.ready26 i8 1, label %exit27 ]28await.ready:29 %save2 = call token @llvm.coro.save(ptr null)30 %addr2 = call ptr @llvm.coro.subfn.addr(ptr null, i8 0)31 call fastcc void %addr2(ptr null)32 33 %suspend2 = call i8 @llvm.coro.suspend(token %save2, i1 false)34 switch i8 %suspend2, label %exit [35 i8 0, label %exit36 i8 1, label %exit37 ]38exit:39 call void @llvm.coro.end(ptr null, i1 false, token none)40 ret void41}42 43; Verify that in the initial function resume is not marked with musttail.44; CHECK-LABEL: @f(45; CHECK: %[[addr1:.+]] = call ptr @llvm.coro.subfn.addr(ptr null, i8 0)46; CHECK-NOT: musttail call fastcc void %[[addr1]](ptr null)47 48; Verify that ppc target not using PC-Relative addressing in the resume part resume call is not marked with musttail.49; CHECK-LABEL: @f.resume(50; CHECK: %[[addr2:.+]] = call ptr @llvm.coro.subfn.addr(ptr null, i8 0)51; CHECK-NEXT: call fastcc void %[[addr2]](ptr null)52 53declare token @llvm.coro.id(i32, ptr readnone, ptr nocapture readonly, ptr) #154declare i1 @llvm.coro.alloc(token) #255declare i64 @llvm.coro.size.i64() #356declare ptr @llvm.coro.begin(token, ptr writeonly) #257declare token @llvm.coro.save(ptr) #258declare ptr @llvm.coro.frame() #359declare i8 @llvm.coro.suspend(token, i1) #260declare ptr @llvm.coro.free(token, ptr nocapture readonly) #161declare void @llvm.coro.end(ptr, i1, token) #262declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #163declare ptr @malloc(i64)64 65attributes #0 = { presplitcoroutine }66attributes #1 = { argmemonly nounwind readonly }67attributes #2 = { nounwind }68attributes #3 = { nounwind readnone }69