| ; RUN: llc -mtriple=x86_64-unknown-linux < %s | FileCheck %s |
| |
| @g = external global i8 |
| |
| declare void @f0() |
| declare void @f1() |
| declare void @f2() |
| declare void @f3() |
| declare void @f4() |
| declare void @f5() |
| declare void @f6() |
| declare void @f7() |
| declare void @f8() |
| declare void @f9() |
| |
| declare void @llvm.icall.branch.funnel(...) |
| |
| define void @jt2(i8* nest, ...) { |
| ; CHECK: jt2: |
| ; CHECK: leaq g+1(%rip), %r11 |
| ; CHECK-NEXT: cmpq %r11, %r10 |
| ; CHECK-NEXT: jae .LBB0_1 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: jmp f0 |
| ; CHECK-NEXT: .LBB0_1: |
| ; CHECK-NEXT: jmp f1 |
| musttail call void (...) @llvm.icall.branch.funnel( |
| i8* %0, |
| i8* getelementptr (i8, i8* @g, i64 0), void ()* @f0, |
| i8* getelementptr (i8, i8* @g, i64 1), void ()* @f1, |
| ... |
| ) |
| ret void |
| } |
| |
| define void @jt3(i8* nest, ...) { |
| ; CHECK: jt3: |
| ; CHECK: leaq g+1(%rip), %r11 |
| ; CHECK-NEXT: cmpq %r11, %r10 |
| ; CHECK-NEXT: jae .LBB1_1 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: jmp f0 |
| ; CHECK-NEXT: .LBB1_1: |
| ; CHECK-NEXT: jne .LBB1_2 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: jmp f1 |
| ; CHECK-NEXT: .LBB1_2: |
| ; CHECK-NEXT: jmp f2 |
| musttail call void (...) @llvm.icall.branch.funnel( |
| i8* %0, |
| i8* getelementptr (i8, i8* @g, i64 0), void ()* @f0, |
| i8* getelementptr (i8, i8* @g, i64 2), void ()* @f2, |
| i8* getelementptr (i8, i8* @g, i64 1), void ()* @f1, |
| ... |
| ) |
| ret void |
| } |
| |
| define void @jt7(i8* nest, ...) { |
| ; CHECK: jt7: |
| ; CHECK: leaq g+3(%rip), %r11 |
| ; CHECK-NEXT: cmpq %r11, %r10 |
| ; CHECK-NEXT: jae .LBB2_1 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: leaq g+1(%rip), %r11 |
| ; CHECK-NEXT: cmpq %r11, %r10 |
| ; CHECK-NEXT: jae .LBB2_6 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: jmp f0 |
| ; CHECK-NEXT: .LBB2_1: |
| ; CHECK-NEXT: jne .LBB2_2 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: jmp f3 |
| ; CHECK-NEXT: .LBB2_6: |
| ; CHECK-NEXT: jne .LBB2_7 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: jmp f1 |
| ; CHECK-NEXT: .LBB2_2: |
| ; CHECK-NEXT: leaq g+5(%rip), %r11 |
| ; CHECK-NEXT: cmpq %r11, %r10 |
| ; CHECK-NEXT: jae .LBB2_3 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: jmp f4 |
| ; CHECK-NEXT: .LBB2_7: |
| ; CHECK-NEXT: jmp f2 |
| ; CHECK-NEXT: .LBB2_3: |
| ; CHECK-NEXT: jne .LBB2_4 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: jmp f5 |
| ; CHECK-NEXT: .LBB2_4: |
| ; CHECK-NEXT: jmp f6 |
| musttail call void (...) @llvm.icall.branch.funnel( |
| i8* %0, |
| i8* getelementptr (i8, i8* @g, i64 0), void ()* @f0, |
| i8* getelementptr (i8, i8* @g, i64 1), void ()* @f1, |
| i8* getelementptr (i8, i8* @g, i64 2), void ()* @f2, |
| i8* getelementptr (i8, i8* @g, i64 3), void ()* @f3, |
| i8* getelementptr (i8, i8* @g, i64 4), void ()* @f4, |
| i8* getelementptr (i8, i8* @g, i64 5), void ()* @f5, |
| i8* getelementptr (i8, i8* @g, i64 6), void ()* @f6, |
| ... |
| ) |
| ret void |
| } |
| |
| define void @jt10(i8* nest, ...) { |
| ; CHECK: jt10: |
| ; CHECK: leaq g+5(%rip), %r11 |
| ; CHECK-NEXT: cmpq %r11, %r10 |
| ; CHECK-NEXT: jae .LBB3_1 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: leaq g+1(%rip), %r11 |
| ; CHECK-NEXT: cmpq %r11, %r10 |
| ; CHECK-NEXT: jae .LBB3_7 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: jmp f0 |
| ; CHECK-NEXT: .LBB3_1: |
| ; CHECK-NEXT: jne .LBB3_2 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: jmp f5 |
| ; CHECK-NEXT: .LBB3_7: |
| ; CHECK-NEXT: jne .LBB3_8 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: jmp f1 |
| ; CHECK-NEXT: .LBB3_2: |
| ; CHECK-NEXT: leaq g+7(%rip), %r11 |
| ; CHECK-NEXT: cmpq %r11, %r10 |
| ; CHECK-NEXT: jae .LBB3_3 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: jmp f6 |
| ; CHECK-NEXT: .LBB3_8: |
| ; CHECK-NEXT: leaq g+3(%rip), %r11 |
| ; CHECK-NEXT: cmpq %r11, %r10 |
| ; CHECK-NEXT: jae .LBB3_9 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: jmp f2 |
| ; CHECK-NEXT: .LBB3_3: |
| ; CHECK-NEXT: jne .LBB3_4 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: jmp f7 |
| ; CHECK-NEXT: .LBB3_9: |
| ; CHECK-NEXT: jne .LBB3_10 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: jmp f3 |
| ; CHECK-NEXT: .LBB3_4: |
| ; CHECK-NEXT: leaq g+9(%rip), %r11 |
| ; CHECK-NEXT: cmpq %r11, %r10 |
| ; CHECK-NEXT: jae .LBB3_5 |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: jmp f8 |
| ; CHECK-NEXT: .LBB3_10: |
| ; CHECK-NEXT: jmp f4 |
| ; CHECK-NEXT: .LBB3_5: |
| ; CHECK-NEXT: jmp f9 |
| musttail call void (...) @llvm.icall.branch.funnel( |
| i8* %0, |
| i8* getelementptr (i8, i8* @g, i64 0), void ()* @f0, |
| i8* getelementptr (i8, i8* @g, i64 1), void ()* @f1, |
| i8* getelementptr (i8, i8* @g, i64 2), void ()* @f2, |
| i8* getelementptr (i8, i8* @g, i64 3), void ()* @f3, |
| i8* getelementptr (i8, i8* @g, i64 4), void ()* @f4, |
| i8* getelementptr (i8, i8* @g, i64 5), void ()* @f5, |
| i8* getelementptr (i8, i8* @g, i64 6), void ()* @f6, |
| i8* getelementptr (i8, i8* @g, i64 7), void ()* @f7, |
| i8* getelementptr (i8, i8* @g, i64 8), void ()* @f8, |
| i8* getelementptr (i8, i8* @g, i64 9), void ()* @f9, |
| ... |
| ) |
| ret void |
| } |