[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / ARM / CGP / arm-cgp-switch.ll
blob29c35fbc96e001da000d00d392328ff718adacb4
1 ; RUN: llc -mtriple=thumbv7em %s -arm-disable-cgp=false -o - | FileCheck %s
2 ; RUN: llc -mtriple=thumbv7-linux-android %s -arm-disable-cgp=false -o - | FileCheck %s
4 ; CHECK-LABEL: truncate_source_phi_switch
5 ; CHECK: ldrb
6 ; CHECK: uxtb
7 define void @truncate_source_phi_switch(i8* %memblock, i8* %store, i16 %arg) {
8 entry:
9   %pre = load i8, i8* %memblock, align 1
10   %conv = trunc i16 %arg to i8
11   br label %header
13 header:
14   %phi.0 = phi i8 [ %pre, %entry ], [ %count, %latch ]
15   %phi.1 = phi i8 [ %conv, %entry ], [ %phi.3, %latch ]
16   %phi.2 = phi i8 [ 0, %entry], [ %count, %latch ]
17   switch i8 %phi.0, label %default [
18     i8 43, label %for.inc.i
19     i8 45, label %for.inc.i.i
20   ]
22 for.inc.i:
23   %xor = xor i8 %phi.1, 1
24   br label %latch
26 for.inc.i.i:
27   %and = and i8 %phi.1, 3
28   br label %latch
30 default:
31   %sub = sub i8 %phi.0, 1
32   %cmp2 = icmp ugt i8 %sub, 4
33   br i1 %cmp2, label %latch, label %exit
35 latch:
36   %phi.3 = phi i8 [ %xor, %for.inc.i ], [ %and, %for.inc.i.i ], [ %phi.2, %default ]
37   %count = add nuw i8 %phi.2, 1
38   store i8 %count, i8* %store, align 1
39   br label %header
41 exit:
42   ret void
45 ; CHECK-LABEL: icmp_switch_source:
46 ; CHECK-NOT: uxt
47 define i16 @icmp_switch_source(i16 zeroext %arg) {
48 entry:
49   %conv = add nuw i16 %arg, 15
50   %mul = mul nuw nsw i16 %conv, 3
51   switch i16 %arg, label %default [
52     i16 0, label %sw.bb
53     i16 1, label %sw.bb.i
54   ]
56 sw.bb:
57   %cmp0 = icmp ult i16 %mul, 127
58   %select = select i1 %cmp0, i16 %mul, i16 127
59   br label %exit
61 sw.bb.i:
62   %cmp1 = icmp ugt i16 %mul, 34
63   %select.i = select i1 %cmp1, i16 %mul, i16 34
64   br label %exit
66 default:
67   br label %exit
69 exit:
70   %res = phi i16 [ %select, %sw.bb ], [ %select.i, %sw.bb.i ], [ %mul, %default ]
71   ret i16 %res
74 ; CHECK-LABEL: icmp_switch_narrow_source:
75 ; CHECK-NOT: uxt
76 define i16 @icmp_switch_narrow_source(i8 zeroext %arg) {
77 entry:
78   %conv = zext i8 %arg to i16
79   %add = add nuw i16 %conv, 15
80   %mul = mul nuw nsw i16 %add, 3
81   switch i8 %arg, label %default [
82     i8 0, label %sw.bb
83     i8 1, label %sw.bb.i
84   ]
86 sw.bb:
87   %cmp0 = icmp ult i16 %mul, 127
88   %select = select i1 %cmp0, i16 %mul, i16 127
89   br label %exit
91 sw.bb.i:
92   %cmp1 = icmp ugt i16 %mul, 34
93   %select.i = select i1 %cmp1, i16 %mul, i16 34
94   br label %exit
96 default:
97   br label %exit
99 exit:
100   %res = phi i16 [ %select, %sw.bb ], [ %select.i, %sw.bb.i ], [ %mul, %default ]
101   ret i16 %res
104 ; CHECK-LABEL: icmp_switch_trunc:
105 ; CHECK-NOT: uxt
106 define i16 @icmp_switch_trunc(i16 zeroext %arg) {
107 entry:
108   %conv = add nuw i16 %arg, 15
109   %mul = mul nuw nsw i16 %conv, 3
110   %trunc = trunc i16 %arg to i3
111   switch i3 %trunc, label %default [
112     i3 0, label %sw.bb
113     i3 1, label %sw.bb.i
114   ]
116 sw.bb:
117   %cmp0 = icmp ult i16 %mul, 127
118   %select = select i1 %cmp0, i16 %mul, i16 127
119   br label %exit
121 sw.bb.i:
122   %cmp1 = icmp ugt i16 %mul, 34
123   %select.i = select i1 %cmp1, i16 %mul, i16 34
124   br label %exit
126 default:
127   br label %exit
129 exit:
130   %res = phi i16 [ %select, %sw.bb ], [ %select.i, %sw.bb.i ], [ %mul, %default ]
131   ret i16 %res
134 %class.ae = type { i8 }
135 %class.x = type { i8 }
136 %class.v = type { %class.q }
137 %class.q = type { i16 }
138 declare %class.x* @_ZNK2ae2afEv(%class.ae*) local_unnamed_addr
139 declare %class.v* @_ZN1x2acEv(%class.x*) local_unnamed_addr
141 ; CHECK-LABEL: trunc_i16_i9_switch
142 ; CHECK-NOT: uxt
143 define i32 @trunc_i16_i9_switch(%class.ae* %this) {
144 entry:
145   %call = tail call %class.x* @_ZNK2ae2afEv(%class.ae* %this)
146   %call2 = tail call %class.v* @_ZN1x2acEv(%class.x* %call)
147   %0 = getelementptr inbounds %class.v, %class.v* %call2, i32 0, i32 0, i32 0
148   %1 = load i16, i16* %0, align 2
149   %2 = trunc i16 %1 to i9
150   %trunc = and i9 %2, -64
151   switch i9 %trunc, label %cleanup.fold.split [
152     i9 0, label %cleanup
153     i9 -256, label %if.then7
154   ]
156 if.then7:
157   %3 = and i16 %1, 7
158   %tobool = icmp eq i16 %3, 0
159   %cond = select i1 %tobool, i32 2, i32 1
160   br label %cleanup
162 cleanup.fold.split:
163   br label %cleanup
165 cleanup:
166   %retval.0 = phi i32 [ %cond, %if.then7 ], [ 0, %entry ], [ 2, %cleanup.fold.split ]
167   ret i32 %retval.0