brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · d2107b2 Raw
120 lines · plain
1; RUN: llc < %s -mtriple=arm-apple-darwin -relocation-model=dynamic-no-pic -mcpu=cortex-a8 -asm-verbose=false | FileCheck %s2 3declare void @bar(i32)4declare void @car(i32)5declare void @dar(i32)6declare void @ear(i32)7declare void @far(i32)8declare i1 @qux()9 10@GHJK = global i32 011 12declare ptr @choose(ptr, ptr)13 14; BranchFolding should tail-duplicate the indirect jump to avoid15; redundant branching.16 17; CHECK-LABEL: tail_duplicate_me:18; CHECK:      qux19; CHECK:      movw r{{[0-9]+}}, :lower16:_GHJK20; CHECK:      movt r{{[0-9]+}}, :upper16:_GHJK21; CHECK:      str r22; CHECK-NEXT: bx r23; CHECK:      qux24; CHECK:      movw r{{[0-9]+}}, :lower16:_GHJK25; CHECK:      movt r{{[0-9]+}}, :upper16:_GHJK26; CHECK:      str r27; CHECK-NEXT: bx r28; CHECK:      movw r{{[0-9]+}}, :lower16:_GHJK29; CHECK:      movt r{{[0-9]+}}, :upper16:_GHJK30; CHECK:      str r31; CHECK-NEXT: bx r32 33define void @tail_duplicate_me() nounwind {34entry:35  %a = call i1 @qux()36  %c = call ptr @choose(ptr blockaddress(@tail_duplicate_me, %return),37                        ptr blockaddress(@tail_duplicate_me, %altret))38  br i1 %a, label %A, label %next39next:40  %b = call i1 @qux()41  br i1 %b, label %B, label %C42 43A:44  call void @bar(i32 0)45  store i32 0, ptr @GHJK46  br label %M47 48B:49  call void @car(i32 1)50  store i32 0, ptr @GHJK51  br label %M52 53C:54  call void @dar(i32 2)55  store i32 0, ptr @GHJK56  br label %M57 58M:59  indirectbr ptr %c, [label %return, label %altret]60 61return:62  call void @ear(i32 1000)63  ret void64altret:65  call void @far(i32 1001)66  ret void67}68 69; Use alternating abort functions so that the blocks we wish to merge are not70; layout successors during branch folding.71 72; CHECK-LABEL: merge_alternating_aborts:73; CHECK-NOT: _abort74; CHECK-NOT: _alt_abort75; CHECK: bxne lr76; CHECK-NOT: _abort77; CHECK-NOT: _alt_abort78; CHECK: LBB{{.*}}:79; CHECK: mov lr, pc80; CHECK: b _alt_abort81; CHECK-NOT: _abort82; CHECK-NOT: _alt_abort83; CHECK: LBB{{.*}}:84; CHECK: mov lr, pc85; CHECK: b _abort86; CHECK-NOT: _abort87; CHECK-NOT: _alt_abort88 89declare void @abort()90declare void @alt_abort()91 92define void @merge_alternating_aborts() {93entry:94  %c1 = call i1 @qux()95  br i1 %c1, label %cont1, label %abort196abort1:97  call void @abort()98  unreachable99cont1:100  %c2 = call i1 @qux()101  br i1 %c2, label %cont2, label %abort2102abort2:103  call void @alt_abort()104  unreachable105cont2:106  %c3 = call i1 @qux()107  br i1 %c3, label %cont3, label %abort3108abort3:109  call void @abort()110  unreachable111cont3:112  %c4 = call i1 @qux()113  br i1 %c4, label %cont4, label %abort4114abort4:115  call void @alt_abort()116  unreachable117cont4:118  ret void119}120