Bob Wilson | 41a0456 | 2009-11-18 23:30:38 +0000 | [diff] [blame] | 1 | ; RUN: llc < %s -mtriple=arm-apple-darwin -mcpu=cortex-a8 -asm-verbose=false | FileCheck %s |
Bob Wilson | 60f34b9 | 2009-11-18 22:52:37 +0000 | [diff] [blame] | 2 | |
| 3 | declare void @bar(i32) |
| 4 | declare void @car(i32) |
| 5 | declare void @dar(i32) |
| 6 | declare void @ear(i32) |
| 7 | declare void @far(i32) |
| 8 | declare i1 @qux() |
| 9 | |
| 10 | @GHJK = global i32 0 |
| 11 | |
Dan Gohman | aceba31 | 2010-01-05 17:55:26 +0000 | [diff] [blame] | 12 | declare i8* @choose(i8*, i8*) |
Bob Wilson | 60f34b9 | 2009-11-18 22:52:37 +0000 | [diff] [blame] | 13 | |
| 14 | ; BranchFolding should tail-duplicate the indirect jump to avoid |
| 15 | ; redundant branching. |
| 16 | |
| 17 | ; CHECK: tail_duplicate_me: |
| 18 | ; CHECK: qux |
| 19 | ; CHECK: qux |
| 20 | ; CHECK: ldr r{{.}}, LCPI |
| 21 | ; CHECK: str r |
| 22 | ; CHECK-NEXT: bx r |
| 23 | ; CHECK: ldr r{{.}}, LCPI |
| 24 | ; CHECK: str r |
| 25 | ; CHECK-NEXT: bx r |
| 26 | ; CHECK: ldr r{{.}}, LCPI |
| 27 | ; CHECK: str r |
| 28 | ; CHECK-NEXT: bx r |
| 29 | |
| 30 | define void @tail_duplicate_me() nounwind { |
| 31 | entry: |
| 32 | %a = call i1 @qux() |
| 33 | %c = call i8* @choose(i8* blockaddress(@tail_duplicate_me, %return), |
| 34 | i8* blockaddress(@tail_duplicate_me, %altret)) |
| 35 | br i1 %a, label %A, label %next |
| 36 | next: |
| 37 | %b = call i1 @qux() |
| 38 | br i1 %b, label %B, label %C |
| 39 | |
| 40 | A: |
| 41 | call void @bar(i32 0) |
| 42 | store i32 0, i32* @GHJK |
| 43 | br label %M |
| 44 | |
| 45 | B: |
| 46 | call void @car(i32 1) |
| 47 | store i32 0, i32* @GHJK |
| 48 | br label %M |
| 49 | |
| 50 | C: |
| 51 | call void @dar(i32 2) |
| 52 | store i32 0, i32* @GHJK |
| 53 | br label %M |
| 54 | |
| 55 | M: |
| 56 | indirectbr i8* %c, [label %return, label %altret] |
| 57 | |
| 58 | return: |
| 59 | call void @ear(i32 1000) |
| 60 | ret void |
| 61 | altret: |
| 62 | call void @far(i32 1001) |
| 63 | ret void |
| 64 | } |