]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/Thumb/branchless-cmp.ll
Vendor import of llvm trunk r338150:
[FreeBSD/FreeBSD.git] / test / CodeGen / Thumb / branchless-cmp.ll
1 ; RUN: llc -mtriple=thumb-eabi -mcpu=cortex-m0 %s -verify-machineinstrs -o - | FileCheck %s
2
3 define i32 @test1a(i32 %a, i32 %b) {
4 entry:
5   %cmp = icmp ne i32 %a, %b
6   %cond = zext i1 %cmp to i32
7   ret i32 %cond
8 ; CHECK-LABEL: test1a:
9 ; CHECK-NOT: b{{(ne)|(eq)}}
10 ; CHECK:       subs r0, r0, r1
11 ; CHECK-NEXT:  subs r1, r0, #1
12 ; CHECK-NEXT:  sbcs r0, r1
13 }
14
15 define i32 @test1b(i32 %a, i32 %b) {
16 entry:
17   %cmp = icmp eq i32 %a, %b
18   %cond = zext i1 %cmp to i32
19   ret i32 %cond
20 ; CHECK-LABEL: test1b:
21 ; CHECK-NOT: b{{(ne)|(eq)}}
22 ; CHECK:       subs    r1, r0, r1
23 ; CHECK-NEXT:  movs    r0, #0
24 ; CHECK-NEXT:  subs    r0, r0, r1
25 ; CHECK-NEXT:  adcs    r0, r1
26 }
27
28 define i32 @test2a(i32 %a, i32 %b) {
29 entry:
30   %cmp = icmp eq i32 %a, %b
31   %cond = zext i1 %cmp to i32
32   ret i32 %cond
33 ; CHECK-LABEL: test2a:
34 ; CHECK-NOT: b{{(ne)|(eq)}}
35 ; CHECK:       subs    r1, r0, r1
36 ; CHECK-NEXT:  movs    r0, #0
37 ; CHECK-NEXT:  subs    r0, r0, r1
38 ; CHECK-NEXT:  adcs    r0, r1
39 }
40
41 define i32 @test2b(i32 %a, i32 %b) {
42 entry:
43   %cmp = icmp ne i32 %a, %b
44   %cond = zext i1 %cmp to i32
45   ret i32 %cond
46 ; CHECK-LABEL: test2b:
47 ; CHECK-NOT: b{{(ne)|(eq)}}
48 ; CHECK:       subs    r0, r0, r1
49 ; CHECK-NEXT:  subs    r1, r0, #1
50 ; CHECK-NEXT:  sbcs    r0, r1
51 }
52
53 define i32 @test3a(i32 %a, i32 %b) {
54 entry:
55   %cmp = icmp eq i32 %a, %b
56   %cond = select i1 %cmp, i32 0, i32 4
57   ret i32 %cond
58 ; CHECK-LABEL: test3a:
59 ; CHECK-NOT: b{{(ne)|(eq)}}
60 ; CHECK:       subs    r0, r0, r1
61 ; CHECK-NEXT:  subs    r1, r0, #1
62 ; CHECK-NEXT:  sbcs    r0, r1
63 ; CHECK-NEXT:  lsls    r0, r0, #2
64 }
65
66 define i32 @test3b(i32 %a, i32 %b) {
67 entry:
68   %cmp = icmp eq i32 %a, %b
69   %cond = select i1 %cmp, i32 4, i32 0
70   ret i32 %cond
71 ; CHECK-LABEL: test3b:
72 ; CHECK-NOT: b{{(ne)|(eq)}}
73 ; CHECK:      subs      r0, r0, r1
74 ; CHECK-NEXT: movs      r1, #0
75 ; CHECK-NEXT: subs      r1, r1, r0
76 ; CHECK-NEXT: adcs      r1, r0
77 ; CHECK-NEXT: lsls      r0, r1, #2
78 }
79
80 ; FIXME: This one hasn't changed actually
81 ; but could look like test3b
82 define i32 @test4a(i32 %a, i32 %b) {
83 entry:
84   %cmp = icmp ne i32 %a, %b
85   %cond = select i1 %cmp, i32 0, i32 4
86   ret i32 %cond
87 ; CHECK-LABEL: test4a:
88 ; CHECK-NOT: b{{(ne)|(eq)}}
89 ; CHECK:       mov     r2, r0
90 ; CHECK-NEXT:  movs    r0, #0
91 ; CHECK-NEXT:  movs    r3, #4
92 ; CHECK-NEXT:  cmp     r2, r1
93 ; CHECK-NEXT:  bne     .[[BRANCH:[A-Z0-9_]+]]
94 ; CHECK:       mov     r0, r3
95 ; CHECK:       .[[BRANCH]]:
96 }
97
98 define i32 @test4b(i32 %a, i32 %b) {
99 entry:
100   %cmp = icmp ne i32 %a, %b
101   %cond = select i1 %cmp, i32 4, i32 0
102   ret i32 %cond
103 ; CHECK-LABEL: test4b:
104 ; CHECK-NOT: b{{(ne)|(eq)}}
105 ; CHECK:       subs  r0, r0, r1
106 ; CHECK-NEXT:  subs  r1, r0, #1
107 ; CHECK-NEXT:  sbcs  r0, r1
108 ; CHECK-NEXT:  lsls  r0, r0, #2
109 }