ARM: Add GPR register class excluding LR for use with the ADR instruction.
[oota-llvm.git] / test / CodeGen / ARM / 2013-09-04-Thumb2JumpTable.ll
1 ; RUN: llc < %s -march=thumb -mattr=+thumb2 |  FileCheck %s
2
3 define i32 @foo(i32 %n, i32* nocapture %inp) #0 {
4 ; CHECK: foo
5 ; CHECK-NOT: mov pc, lr
6 .split:
7   %0 = icmp sgt i32 %n, 1
8   %1 = add nsw i32 %n, -1
9   %loop_guard = icmp sgt i32 %1, 0
10   %or.cond = and i1 %0, %loop_guard
11   br i1 %or.cond, label %stmt.preheader, label %loop_exit
12
13 stmt.preheader:                            ; preds = %.split
14   %adjust_ub = add i32 %n, -2
15   %scevgep6.gep = getelementptr i32* %inp, i32 1
16   %2 = icmp sgt i32 %adjust_ub, 0
17   %adjust_ub.op = add i32 %n, -1
18   %3 = select i1 %2, i32 %adjust_ub.op, i32 1
19   %xtraiter = and i32 %3, 3
20   switch i32 %xtraiter, label %stmt.unr [
21     i32 0, label %stmt.
22     i32 1, label %stmt.unr30
23     i32 2, label %stmt.unr16
24     i32 3, label %stmt.unr8
25   ]
26
27 stmt.unr:                                  ; preds = %stmt.preheader
28   %scevgep6.inc.unr = getelementptr i32* %inp, i32 2
29   br label %stmt.unr8
30
31 stmt.unr8:                                 ; preds = %stmt.preheader, %stmt.unr
32   %imax.03.reg2mem.0.unr = phi i32 [ 1, %stmt.unr ], [ 0, %stmt.preheader ]
33   %scevgep6.phi.unr = phi i32* [ %scevgep6.inc.unr, %stmt.unr ], [ %scevgep6.gep, %stmt.preheader ]
34   %scevgep6.inc.unr15 = getelementptr i32* %scevgep6.phi.unr, i32 1
35   br label %stmt.unr16
36
37 stmt.unr16:                                ; preds = %stmt.preheader, %stmt.unr8
38   %imax.03.reg2mem.0.unr17 = phi i32 [ 0, %stmt.unr8 ], [ 0, %stmt.preheader ]
39   %selv.lcssa.reg2mem.1.unr18 = phi i32 [ 0, %stmt.unr8 ], [ undef, %stmt.preheader ]
40   %scevgep6.phi.unr19 = phi i32* [ %scevgep6.inc.unr15, %stmt.unr8 ], [ %scevgep6.gep, %stmt.preheader ]
41   %indvar.unr20 = phi i32 [ 1, %stmt.unr8 ], [ 0, %stmt.preheader ]
42   %scevgep6.inc.unr27 = getelementptr i32* %scevgep6.phi.unr19, i32 1
43   br label %stmt.unr30
44
45 stmt.unr30:                                ; preds = %stmt.preheader, %stmt.unr16
46   %imax.03.reg2mem.0.unr31 = phi i32 [ 1, %stmt.unr16 ], [ 0, %stmt.preheader ]
47   %selv.lcssa.reg2mem.1.unr32 = phi i32 [ 0, %stmt.unr16 ], [ undef, %stmt.preheader ]
48   %scevgep6.phi.unr33 = phi i32* [ %scevgep6.inc.unr27, %stmt.unr16 ], [ %scevgep6.gep, %stmt.preheader ]
49   %indvar.unr34 = phi i32 [ 0, %stmt.unr16 ], [ 1, %stmt.preheader ]
50   %_p_scalar_.unr36 = load i32* %scevgep6.phi.unr33, align 4
51   %p_.unr37 = icmp sgt i32 %_p_scalar_.unr36, %imax.03.reg2mem.0.unr31
52   %scevgep6.inc.unr41 = getelementptr i32* %scevgep6.phi.unr33, i32 1
53   %4 = icmp ugt i32 %3, 4
54   br i1 %4, label %stmt., label %loop_exit
55
56
57 loop_exit:                                  ; preds = %stmt.unr30, %stmt., %.split
58   %itemp.0.lcssa.reg2mem.0 = phi i32 [ undef, %.split ], [ 1, %stmt.unr30 ], [0, %stmt. ]
59   ret i32 %itemp.0.lcssa.reg2mem.0
60
61 stmt.:                                      ; preds = %stmt.preheader, %stmt.unr30, %stmt.
62   %imax.03.reg2mem.0 = phi i32 [ %p_selv2.3, %stmt. ], [ 1, %stmt.unr30 ], [ 0, %stmt.preheader ]
63   %selv.lcssa.reg2mem.1 = phi i32 [ 0, %stmt. ], [ 1, %stmt.unr30 ], [ undef, %stmt.preheader ]
64   %scevgep6.phi = phi i32* [ %scevgep6.inc.3, %stmt. ], [ %scevgep6.inc.unr41, %stmt.unr30 ], [ %scevgep6.gep, %stmt.preheader ]
65   %indvar = phi i32 [ %scevgep.sum.3, %stmt. ], [ 1, %stmt.unr30 ], [ 0, %stmt.preheader ]
66   %scevgep.sum = add i32 %indvar, 1
67   %_p_scalar_ = load i32* %scevgep6.phi, align 4
68   %p_ = icmp sgt i32 %_p_scalar_, %imax.03.reg2mem.0
69   %p_selv = select i1 %p_, i32 %scevgep.sum, i32 %selv.lcssa.reg2mem.1
70   %scevgep.sum.3 = add i32 %indvar, 4
71   %p_selv2.3 = select i1 %p_, i32 %_p_scalar_, i32 %p_selv
72   %scevgep6.inc.3 = getelementptr i32* %scevgep6.phi, i32 4
73   %loop_cond.4 = icmp slt i32 %scevgep.sum.3, %adjust_ub
74   br i1 %loop_cond.4, label %stmt., label %loop_exit
75 }
76