Change the fast-isel-abort option from bool to int to enable "levels"
[oota-llvm.git] / test / CodeGen / Mips / Fast-ISel / icmpa.ll
1 ; RUN: llc -march=mipsel -relocation-model=pic -O0 -mips-fast-isel -fast-isel-abort=1 -mcpu=mips32r2 \
2 ; RUN:     < %s | FileCheck %s
3 ; RUN: llc -march=mipsel -relocation-model=pic -O0 -mips-fast-isel -fast-isel-abort=1 -mcpu=mips32 \
4 ; RUN:     < %s | FileCheck %s
5
6 @c = global i32 4, align 4
7 @d = global i32 9, align 4
8 @uc = global i32 4, align 4
9 @ud = global i32 9, align 4
10 @b1 = common global i32 0, align 4
11
12 ; Function Attrs: nounwind
13 define void @eq()  {
14 entry:
15 ; CHECK-LABEL:  .ent  eq
16
17   %0 = load i32* @c, align 4
18   %1 = load i32* @d, align 4
19   %cmp = icmp eq i32 %0, %1
20   %conv = zext i1 %cmp to i32
21 ; CHECK-DAG:  lw        $[[REG_D_GOT:[0-9+]]], %got(d)(${{[0-9]+}})
22 ; CHECK-DAG:  lw        $[[REG_C_GOT:[0-9+]]], %got(c)(${{[0-9]+}})
23 ; CHECK-DAG:  lw        $[[REG_D:[0-9]+]], 0($[[REG_D_GOT]])
24 ; CHECK-DAG:  lw        $[[REG_C:[0-9]+]], 0($[[REG_C_GOT]])
25 ; CHECK:  xor  $[[REG1:[0-9]+]], $[[REG_C]], $[[REG_D]]
26 ; CHECK:  sltiu  $[[REG2:[0-9]+]], $[[REG1]], 1
27 ; FIXME: This instruction is redundant. The sltiu can only produce 0 and 1.
28 ; CHECK:  andi  ${{[0-9]+}}, $[[REG2]], 1
29
30   store i32 %conv, i32* @b1, align 4
31   ret void
32 }
33
34 ; Function Attrs: nounwind
35 define void @ne()  {
36 entry:
37 ; CHECK-LABEL:  .ent  ne
38   %0 = load i32* @c, align 4
39   %1 = load i32* @d, align 4
40   %cmp = icmp ne i32 %0, %1
41   %conv = zext i1 %cmp to i32
42 ; CHECK-DAG:  lw        $[[REG_D_GOT:[0-9+]]], %got(d)(${{[0-9]+}})
43 ; CHECK-DAG:  lw        $[[REG_C_GOT:[0-9+]]], %got(c)(${{[0-9]+}})
44 ; CHECK-DAG:  lw        $[[REG_D:[0-9]+]], 0($[[REG_D_GOT]])
45 ; CHECK-DAG:  lw        $[[REG_C:[0-9]+]], 0($[[REG_C_GOT]])
46 ; CHECK:  xor  $[[REG1:[0-9]+]], $[[REG_C]], $[[REG_D]]
47 ; CHECK:  sltu  $[[REG2:[0-9]+]], $zero, $[[REG1]]
48 ; FIXME: This instruction is redundant. The sltu can only produce 0 and 1.
49 ; CHECK:  andi  ${{[0-9]+}}, $[[REG2]], 1
50
51   store i32 %conv, i32* @b1, align 4
52   ret void
53 }
54
55 ; Function Attrs: nounwind
56 define void @ugt()  {
57 entry:
58 ; CHECK-LABEL:  .ent  ugt
59   %0 = load i32* @uc, align 4
60   %1 = load i32* @ud, align 4
61   %cmp = icmp ugt i32 %0, %1
62   %conv = zext i1 %cmp to i32
63 ; CHECK-DAG:  lw        $[[REG_UD_GOT:[0-9+]]], %got(ud)(${{[0-9]+}})
64 ; CHECK-DAG:  lw        $[[REG_UC_GOT:[0-9+]]], %got(uc)(${{[0-9]+}})
65 ; CHECK-DAG:  lw        $[[REG_UD:[0-9]+]], 0($[[REG_UD_GOT]])
66 ; CHECK-DAG:  lw        $[[REG_UC:[0-9]+]], 0($[[REG_UC_GOT]])
67 ; CHECK:  sltu  $[[REG1:[0-9]+]], $[[REG_UD]], $[[REG_UC]]
68 ; FIXME: This instruction is redundant. The sltu can only produce 0 and 1.
69 ; CHECK:  andi  ${{[0-9]+}}, $[[REG1]], 1
70
71   store i32 %conv, i32* @b1, align 4
72   ret void
73 }
74
75 ; Function Attrs: nounwind
76 define void @ult()  {
77 entry:
78 ; CHECK-LABEL:  .ent  ult
79   %0 = load i32* @uc, align 4
80   %1 = load i32* @ud, align 4
81   %cmp = icmp ult i32 %0, %1
82   %conv = zext i1 %cmp to i32
83 ; CHECK-DAG:  lw        $[[REG_UD_GOT:[0-9+]]], %got(ud)(${{[0-9]+}})
84 ; CHECK-DAG:  lw        $[[REG_UC_GOT:[0-9+]]], %got(uc)(${{[0-9]+}})
85 ; CHECK-DAG:  lw        $[[REG_UD:[0-9]+]], 0($[[REG_UD_GOT]])
86 ; CHECK-DAG:  lw        $[[REG_UC:[0-9]+]], 0($[[REG_UC_GOT]])
87 ; CHECK:  sltu  $[[REG1:[0-9]+]], $[[REG_UC]], $[[REG_UD]]
88 ; FIXME: This instruction is redundant. The sltu can only produce 0 and 1.
89 ; CHECK:  andi  ${{[0-9]+}}, $[[REG1]], 1
90   store i32 %conv, i32* @b1, align 4
91   ret void
92 }
93
94 ; Function Attrs: nounwind
95 define void @uge()  {
96 entry:
97 ; CHECK-LABEL:  .ent  uge
98   %0 = load i32* @uc, align 4
99   %1 = load i32* @ud, align 4
100   %cmp = icmp uge i32 %0, %1
101   %conv = zext i1 %cmp to i32
102 ; CHECK-DAG:  lw        $[[REG_UD_GOT:[0-9+]]], %got(ud)(${{[0-9]+}})
103 ; CHECK-DAG:  lw        $[[REG_UC_GOT:[0-9+]]], %got(uc)(${{[0-9]+}})
104 ; CHECK-DAG:  lw        $[[REG_UD:[0-9]+]], 0($[[REG_UD_GOT]])
105 ; CHECK-DAG:  lw        $[[REG_UC:[0-9]+]], 0($[[REG_UC_GOT]])
106 ; CHECK:  sltu  $[[REG1:[0-9]+]], $[[REG_UC]], $[[REG_UD]]
107 ; CHECK:  xori  $[[REG2:[0-9]+]], $[[REG1]], 1
108 ; FIXME: This instruction is redundant. The sltu can only produce 0 and 1.
109 ; CHECK:  andi  ${{[0-9]+}}, $[[REG2]], 1
110   store i32 %conv, i32* @b1, align 4
111   ret void
112 }
113
114 ; Function Attrs: nounwind
115 define void @ule()  {
116 entry:
117 ; CHECK-LABEL:  .ent  ule
118   %0 = load i32* @uc, align 4
119   %1 = load i32* @ud, align 4
120   %cmp = icmp ule i32 %0, %1
121   %conv = zext i1 %cmp to i32
122 ; CHECK-DAG:  lw        $[[REG_UD_GOT:[0-9+]]], %got(ud)(${{[0-9]+}})
123 ; CHECK-DAG:  lw        $[[REG_UC_GOT:[0-9+]]], %got(uc)(${{[0-9]+}})
124 ; CHECK-DAG:  lw        $[[REG_UD:[0-9]+]], 0($[[REG_UD_GOT]])
125 ; CHECK-DAG:  lw        $[[REG_UC:[0-9]+]], 0($[[REG_UC_GOT]])
126 ; CHECK:  sltu  $[[REG1:[0-9]+]], $[[REG_UD]], $[[REG_UC]]
127 ; CHECK:  xori  $[[REG2:[0-9]+]], $[[REG1]], 1
128 ; FIXME: This instruction is redundant. The sltu can only produce 0 and 1.
129 ; CHECK:  andi  ${{[0-9]+}}, $[[REG2]], 1
130   store i32 %conv, i32* @b1, align 4
131   ret void
132 }
133
134 ; Function Attrs: nounwind
135 define void @sgt()  {
136 entry:
137 ; CHECK-LABEL:  .ent sgt
138   %0 = load i32* @c, align 4
139   %1 = load i32* @d, align 4
140   %cmp = icmp sgt i32 %0, %1
141   %conv = zext i1 %cmp to i32
142 ; CHECK-DAG:  lw        $[[REG_D_GOT:[0-9+]]], %got(d)(${{[0-9]+}})
143 ; CHECK-DAG:  lw        $[[REG_C_GOT:[0-9+]]], %got(c)(${{[0-9]+}})
144 ; CHECK-DAG:  lw        $[[REG_D:[0-9]+]], 0($[[REG_D_GOT]])
145 ; CHECK-DAG:  lw        $[[REG_C:[0-9]+]], 0($[[REG_C_GOT]])
146 ; CHECK:  slt  $[[REG1:[0-9]+]], $[[REG_D]], $[[REG_C]]
147 ; FIXME: This instruction is redundant. The slt can only produce 0 and 1.
148 ; CHECK:  andi  ${{[0-9]+}}, $[[REG1]], 1
149   store i32 %conv, i32* @b1, align 4
150   ret void
151 }
152
153 ; Function Attrs: nounwind
154 define void @slt()  {
155 entry:
156 ; CHECK-LABEL:  .ent slt
157   %0 = load i32* @c, align 4
158   %1 = load i32* @d, align 4
159   %cmp = icmp slt i32 %0, %1
160   %conv = zext i1 %cmp to i32
161 ; CHECK-DAG:  lw        $[[REG_D_GOT:[0-9+]]], %got(d)(${{[0-9]+}})
162 ; CHECK-DAG:  lw        $[[REG_C_GOT:[0-9+]]], %got(c)(${{[0-9]+}})
163 ; CHECK-DAG:  lw        $[[REG_D:[0-9]+]], 0($[[REG_D_GOT]])
164 ; CHECK-DAG:  lw        $[[REG_C:[0-9]+]], 0($[[REG_C_GOT]])
165 ; CHECK:  slt  $[[REG1:[0-9]+]], $[[REG_C]], $[[REG_D]]
166 ; FIXME: This instruction is redundant. The slt can only produce 0 and 1.
167 ; CHECK:  andi  ${{[0-9]+}}, $[[REG1]], 1
168   store i32 %conv, i32* @b1, align 4
169   ret void
170 }
171
172 ; Function Attrs: nounwind
173 define void @sge()  {
174 entry:
175 ; CHECK-LABEL:  .ent sge
176   %0 = load i32* @c, align 4
177   %1 = load i32* @d, align 4
178   %cmp = icmp sge i32 %0, %1
179   %conv = zext i1 %cmp to i32
180   store i32 %conv, i32* @b1, align 4
181 ; CHECK-DAG:  lw        $[[REG_D_GOT:[0-9+]]], %got(d)(${{[0-9]+}})
182 ; CHECK-DAG:  lw        $[[REG_C_GOT:[0-9+]]], %got(c)(${{[0-9]+}})
183 ; CHECK-DAG:  lw        $[[REG_D:[0-9]+]], 0($[[REG_D_GOT]])
184 ; CHECK-DAG:  lw        $[[REG_C:[0-9]+]], 0($[[REG_C_GOT]])
185 ; CHECK:  slt  $[[REG1:[0-9]+]], $[[REG_C]], $[[REG_D]]
186 ; CHECK:  xori  $[[REG2:[0-9]+]], $[[REG1]], 1
187 ; FIXME: This instruction is redundant. The slt can only produce 0 and 1.
188 ; CHECK:  andi  ${{[0-9]+}}, $[[REG2]], 1
189   ret void
190 }
191
192 ; Function Attrs: nounwind
193 define void @sle()  {
194 entry:
195 ; CHECK-LABEL:  .ent sle
196   %0 = load i32* @c, align 4
197   %1 = load i32* @d, align 4
198   %cmp = icmp sle i32 %0, %1
199   %conv = zext i1 %cmp to i32
200 ; CHECK-DAG:  lw        $[[REG_D_GOT:[0-9+]]], %got(d)(${{[0-9]+}})
201 ; CHECK-DAG:  lw        $[[REG_C_GOT:[0-9+]]], %got(c)(${{[0-9]+}})
202 ; CHECK-DAG:  lw        $[[REG_D:[0-9]+]], 0($[[REG_D_GOT]])
203 ; CHECK-DAG:  lw        $[[REG_C:[0-9]+]], 0($[[REG_C_GOT]])
204 ; CHECK:        slt     $[[REG1:[0-9]+]], $[[REG_D]], $[[REG_C]]
205 ; CHECK:        xori    $[[REG2:[0-9]+]], $[[REG1]], 1
206 ; FIXME: This instruction is redundant. The slt can only produce 0 and 1.
207 ; CHECK:        andi    ${{[0-9]+}}, $[[REG2]], 1
208   store i32 %conv, i32* @b1, align 4
209   ret void
210 }