| ; RUN: llc -mtriple=x86_64-linux -o - %s | FileCheck %s |
| |
| %0 = type { %1, %3* } |
| %1 = type { %2* } |
| %2 = type { %2*, i8* } |
| %3 = type { i32, i32 (i32, i32)* } |
| |
| |
| declare i32 @Up(...) |
| declare i32 @f(i32, i32) |
| |
| ; check loop block_14 is not merged with block_21 |
| ; check loop block_11 is not merged with block_18, block_25 |
| define i32 @foo(%0* nocapture readonly, i32, i1 %c, i8* %p1, %2** %p2) { |
| ; CHECK-LABEL: foo: |
| ; CHECK: # %block_11 |
| ; CHECK-NEXT: movq (%r14), %rax |
| ; CHECK-NEXT: testq %rax, %rax |
| ; CHECK-NEXT: je |
| ; CHECK-NEXT:# %block_14 |
| ; CHECK-NEXT: cmpq $0, 8(%rax) |
| ; CHECK-NEXT: jne |
| ; CHECK-NEXT:# %block_18 |
| ; CHECK-NEXT: movq (%r14), %rax |
| ; CHECK-NEXT: testq %rax, %rax |
| ; CHECK-NEXT: je |
| ; CHECK-NEXT:# %block_21 |
| ; CHECK-NEXT:# =>This Inner Loop Header |
| ; CHECK-NEXT: cmpq $0, 8(%rax) |
| ; CHECK-NEXT: jne |
| ; CHECK-NEXT:# %block_25 |
| ; CHECK-NEXT:# in Loop |
| ; CHECK-NEXT: movq (%r14), %rax |
| ; CHECK-NEXT: testq %rax, %rax |
| ; CHECK-NEXT: jne |
| br i1 %c, label %block_34, label %block_3 |
| |
| block_3: ; preds = %2 |
| br i1 %c, label %block_7, label %block_4 |
| |
| block_4: ; preds = %block_3 |
| %a5 = tail call i32 @f(i32 undef, i32 undef) |
| %a6 = icmp eq i32 %a5, 0 |
| br i1 %a6, label %block_7, label %block_34 |
| |
| block_7: ; preds = %block_4, %block_3 |
| %a8 = icmp eq %2* null, null |
| br i1 %a8, label %block_34, label %block_9 |
| |
| block_9: ; preds = %block_7 |
| %a10 = icmp eq i8* %p1, null |
| br i1 %a10, label %block_11, label %block_32 |
| |
| block_11: ; preds = %block_9 |
| %a12 = load %2*, %2** %p2, align 8 |
| %a13 = icmp eq %2* %a12, null |
| br i1 %a13, label %block_34, label %block_14 |
| |
| block_14: ; preds = %block_11 |
| %a15 = getelementptr inbounds %2, %2* %a12, i64 0, i32 1 |
| %a16 = load i8*, i8** %a15, align 8 |
| %a17 = icmp eq i8* %a16, null |
| br i1 %a17, label %block_18, label %block_32 |
| |
| block_18: ; preds = %block_14 |
| %a19 = load %2*, %2** %p2, align 8 |
| %a20 = icmp eq %2* %a19, null |
| br i1 %a20, label %block_34, label %block_21 |
| |
| block_21: ; preds = %block_18 |
| %a22 = getelementptr inbounds %2, %2* %a19, i64 0, i32 1 |
| %a23 = load i8*, i8** %a22, align 8 |
| %a24 = icmp eq i8* %a23, null |
| br i1 %a24, label %block_25, label %block_32 |
| |
| block_25: ; preds = %block_28, %block_21 |
| %a26 = load %2*, %2** %p2, align 8 |
| %a27 = icmp eq %2* %a26, null |
| br i1 %a27, label %block_34, label %block_28 |
| |
| block_28: ; preds = %block_25 |
| %a29 = getelementptr inbounds %2, %2* %a26, i64 0, i32 1 |
| %a30 = load i8*, i8** %a29, align 8 |
| %a31 = icmp eq i8* %a30, null |
| br i1 %a31, label %block_25, label %block_32 |
| |
| block_32: ; preds = %block_28, %block_21, %block_14, %block_9 |
| %a33 = tail call i32 (...) @Up() |
| br label %block_34 |
| |
| block_34: ; preds = %block_32, %block_25, %block_18, %block_11, %block_7, %block_4, %2 |
| %a35 = phi i32 [ 0, %2 ], [ %a5, %block_4 ], [ 0, %block_7 ], [ 0, %block_11 ], [ 0, %block_32 ], [ 0, %block_18 ], [ 0, %block_25 ] |
| ret i32 %a35 |
| } |