1#RUN: llc -run-pass arm-cp-islands %s -o - | FileCheck %s
2
3--- |
4  ; ModuleID = 'test.ll'
5  source_filename = "test.c"
6  target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
7  target triple = "thumbv8r-arm-none-eabi"
8
9  define void @Func(i32 %i, i32* nocapture %p) local_unnamed_addr {
10  entry:
11    switch i32 %i, label %sw.epilog [
12      i32 0, label %sw.bb
13      i32 1, label %sw.bb1
14      i32 2, label %sw.epilog.sink.split
15      i32 4, label %sw.bb3
16    ]
17
18  sw.bb:                                            ; preds = %entry
19    br label %sw.epilog.sink.split
20
21  sw.bb1:                                           ; preds = %entry
22    store i32 0, i32* %p, align 4
23    br label %sw.epilog.sink.split
24
25  sw.bb3:                                           ; preds = %entry
26    br label %sw.epilog.sink.split
27
28  sw.epilog.sink.split:                             ; preds = %sw.bb3, %sw.bb1, %sw.bb, %entry
29    %.sink = phi i32 [ 2, %sw.bb3 ], [ 0, %sw.bb ], [ 1, %entry ], [ 1, %sw.bb1 ]
30    store i32 %.sink, i32* %p, align 4
31    br label %sw.epilog
32
33  sw.epilog:                                        ; preds = %sw.epilog.sink.split, %entry
34    ret void
35  }
36
37...
38---
39name:            Func
40alignment:       1
41exposesReturnsTwice: false
42legalized:       false
43regBankSelected: false
44selected:        false
45tracksRegLiveness: true
46liveins:
47  - { reg: '$r0' }
48  - { reg: '$r1' }
49frameInfo:
50  isFrameAddressTaken: false
51  isReturnAddressTaken: false
52  hasStackMap:     false
53  hasPatchPoint:   false
54  stackSize:       0
55  offsetAdjustment: 0
56  maxAlignment:    0
57  adjustsStack:    false
58  hasCalls:        false
59  maxCallFrameSize: 0
60  hasOpaqueSPAdjustment: false
61  hasVAStart:      false
62  hasMustTailInVarArgFunc: false
63jumpTable:
64  kind:            inline
65  entries:
66    - id:              0
67      blocks:          [ '%bb.2.sw.bb', '%bb.3.sw.bb1', '%bb.5.sw.epilog.sink.split',
68                         '%bb.6.sw.epilog', '%bb.4.sw.bb3' ]
69# The ADD should be deleted along with the LEA
70# CHECK-NOT: t2LEApcrelJT
71# CHECK-NOT: t2ADDrs
72# CHECK: tMOVi8
73# CHECK: t2TBB_JT
74
75body:             |
76  bb.0.entry:
77    successors: %bb.6.sw.epilog(0x0ccccccb), %bb.1.entry(0x73333335)
78    liveins: $r0, $r1
79
80    tCMPi8 $r0, 4, 14, $noreg, implicit-def $cpsr
81    t2Bcc %bb.6.sw.epilog, 8, killed $cpsr
82
83  bb.1.entry:
84    successors: %bb.2.sw.bb(0x1c71c71c), %bb.3.sw.bb1(0x1c71c71c), %bb.5.sw.epilog.sink.split(0x1c71c71c), %bb.6.sw.epilog(0x0e38e38e), %bb.4.sw.bb3(0x1c71c71c)
85  liveins: $r0, $r1
86
87    $r2 = t2LEApcrelJT %jump-table.0, 14, $noreg
88    $r3 = t2ADDrs killed $r2, $r0, 18, 14, $noreg, $noreg
89    $r2, dead $cpsr = tMOVi8 1, 14, $noreg
90    t2BR_JT killed $r3, killed $r0, %jump-table.0
91
92  bb.2.sw.bb:
93    successors: %bb.5.sw.epilog.sink.split(0x80000000)
94    liveins: $r1
95
96    $r2, dead $cpsr = tMOVi8 0, 14, $noreg
97    t2B %bb.5.sw.epilog.sink.split, 14, $noreg
98
99  bb.3.sw.bb1:
100    successors: %bb.5.sw.epilog.sink.split(0x80000000)
101    liveins: $r1
102
103    $r0, dead $cpsr = tMOVi8 0, 14, $noreg
104    $r2, dead $cpsr = tMOVi8 1, 14, $noreg
105    tSTRi killed $r0, $r1, 0, 14, $noreg :: (store 4 into %ir.p)
106    t2B %bb.5.sw.epilog.sink.split, 14, $noreg
107
108  bb.4.sw.bb3:
109    successors: %bb.5.sw.epilog.sink.split(0x80000000)
110    liveins: $r1
111
112    $r2, dead $cpsr = tMOVi8 2, 14, $noreg
113
114  bb.5.sw.epilog.sink.split:
115    successors: %bb.6.sw.epilog(0x80000000)
116    liveins: $r1, $r2
117
118    tSTRi killed $r2, killed $r1, 0, 14, $noreg :: (store 4 into %ir.p)
119
120  bb.6.sw.epilog:
121    tBX_RET 14, $noreg
122
123...
124