99 lines · plain
1; RUN: llvm-as < %s -disable-output 2>&1 | FileCheck %s -allow-empty2 3; RUN: llvm-as < %s | llvm-dis > %t1.ll4; RUN: llvm-as %t1.ll -o - | llvm-dis > %t2.ll5; RUN: diff %t1.ll %t2.ll6 7; RUN: llvm-as < %t1.ll -disable-output 2>&1 | FileCheck %s -allow-empty8 9; CHECK-NOT: error10; CHECK-NOT: warning11 12define void @mixed1() {13 call void @g() ; not convergent14 call void @f() ; uncontrolled convergent15 call void @g() ; not convergent16 ret void17}18 19define void @mixed2() {20 call void @g() ; not convergent21 %t1_tok1 = call token @llvm.experimental.convergence.anchor()22 call void @f() [ "convergencectrl"(token %t1_tok1) ]23 call void @g() ; not convergent24 ret void25}26 27; convergence control token can be used on non-convergent calls,28; but it has no effect.29define void @mixed3() {30 %t05_tok1 = call token @llvm.experimental.convergence.anchor()31 call void @g() [ "convergencectrl"(token %t05_tok1) ]32 ret void33}34 35define void @region_nesting1(i1 %arg) convergent {36A:37 %tok1 = call token @llvm.experimental.convergence.entry()38 %tok2 = call token @llvm.experimental.convergence.anchor()39 br label %B40 41B:42 br i1 %arg, label %C, label %D43 44C:45 call void @f() [ "convergencectrl"(token %tok1) ]46 ret void47 48D:49 call void @f() [ "convergencectrl"(token %tok2) ]50 ret void51}52 53; Mirror image of @region_nesting154define void @region_nesting2(i1 %arg) {55A:56 %tok1 = call token @llvm.experimental.convergence.anchor()57 %tok2 = call token @llvm.experimental.convergence.anchor()58 br label %B59 60B:61 br i1 %arg, label %C, label %D62 63C:64 call void @f() [ "convergencectrl"(token %tok2) ]65 ret void66 67D:68 call void @f() [ "convergencectrl"(token %tok1) ]69 ret void70}71 72define void @loop_nesting(i1 %arg) convergent {73A:74 %a = call token @llvm.experimental.convergence.entry()75 br label %B76 77B:78 %b = call token @llvm.experimental.convergence.anchor()79 br i1 %arg, label %C, label %D80 81C:82 %c = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %b) ]83 call void @f() [ "convergencectrl"(token %c) ]84 br label %B85 86D:87 call void @f() [ "convergencectrl"(token %b) ]88 br i1 %arg, label %B, label %E89 90E:91 ret void92}93declare void @f() convergent94declare void @g()95 96declare token @llvm.experimental.convergence.entry()97declare token @llvm.experimental.convergence.anchor()98declare token @llvm.experimental.convergence.loop()99