| ; RUN: opt -passes=strip-convergence-intrinsics -S < %s | FileCheck %s |
| |
| ; Verify that convergence intrinsics and convergencectrl operand bundles are |
| ; stripped by the pass. |
| |
| define void @entry_and_call() convergent { |
| ; CHECK-LABEL: define void @entry_and_call() |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: call void @convergent_callee() |
| ; CHECK-NOT: convergence |
| ; CHECK-NEXT: ret void |
| entry: |
| %0 = call token @llvm.experimental.convergence.entry() |
| call void @convergent_callee() [ "convergencectrl"(token %0) ] |
| ret void |
| } |
| |
| define void @loop_with_token() convergent { |
| ; CHECK-LABEL: define void @loop_with_token() |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label %loop |
| ; CHECK: loop: |
| ; CHECK-NEXT: call void @convergent_callee() |
| ; CHECK-NOT: convergence |
| ; CHECK-NEXT: br i1 |
| entry: |
| %0 = call token @llvm.experimental.convergence.entry() |
| br label %loop |
| |
| loop: |
| %1 = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %0) ] |
| call void @convergent_callee() [ "convergencectrl"(token %1) ] |
| br i1 true, label %exit, label %loop |
| |
| exit: |
| ret void |
| } |
| |
| define void @anchor_token() convergent { |
| ; CHECK-LABEL: define void @anchor_token() |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: call void @convergent_callee() |
| ; CHECK-NOT: convergence |
| ; CHECK-NEXT: ret void |
| entry: |
| %0 = call token @llvm.experimental.convergence.anchor() |
| call void @convergent_callee() [ "convergencectrl"(token %0) ] |
| ret void |
| } |
| |
| ; This ensures that when the use of a token is defined before the call that |
| ; creates the token, we are still able to strip them as expected. |
| define void @reversed_block_order() convergent { |
| ; CHECK-LABEL: define void @reversed_block_order() |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label %[[B:.*]] |
| ; CHECK: [[A:.*]]: |
| ; CHECK-NEXT: call void @convergent_callee() |
| ; CHECK-NEXT: ret void |
| ; CHECK: [[B]]: |
| ; CHECK-NEXT: br label %[[A]] |
| entry: |
| br label %B |
| A: |
| call void @convergent_callee() [ "convergencectrl"(token %tok) ] |
| ret void |
| B: |
| %tok = call token @llvm.experimental.convergence.anchor() |
| br label %A |
| } |
| |
| ; Declarations may remain but should have no uses in function bodies. |
| ; CHECK-LABEL: declare void @convergent_callee |
| |
| declare void @convergent_callee() convergent |
| |
| declare token @llvm.experimental.convergence.entry() |
| declare token @llvm.experimental.convergence.loop() |
| declare token @llvm.experimental.convergence.anchor() |