xref: /llvm-project/llvm/test/CodeGen/X86/add-cmov.ll (revision 2f448bf509432c1a19ec46ab8cbc7353c03c6280)
1028eb436SSanjay Patel; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2028eb436SSanjay Patel; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-- | FileCheck %s
3028eb436SSanjay Patel
4028eb436SSanjay Pateldefine i64 @select_consts_i64(i64 %offset, i32 %x) {
5028eb436SSanjay Patel; CHECK-LABEL: select_consts_i64:
6028eb436SSanjay Patel; CHECK:       # %bb.0:
7f060aa1cSSanjay Patel; CHECK-NEXT:    leaq 42(%rdi), %rax
8028eb436SSanjay Patel; CHECK-NEXT:    testl %esi, %esi
9f060aa1cSSanjay Patel; CHECK-NEXT:    cmovneq %rdi, %rax
10028eb436SSanjay Patel; CHECK-NEXT:    retq
11028eb436SSanjay Patel  %b = icmp eq i32 %x, 0
12028eb436SSanjay Patel  %s = select i1 %b, i64 42, i64 0
13028eb436SSanjay Patel  %r = add i64 %s, %offset
14028eb436SSanjay Patel  ret i64 %r
15028eb436SSanjay Patel}
16028eb436SSanjay Patel
17937e7c60SSanjay Pateldefine i64 @select_consts_big_i64(i64 %offset, i32 %x) {
18937e7c60SSanjay Patel; CHECK-LABEL: select_consts_big_i64:
19937e7c60SSanjay Patel; CHECK:       # %bb.0:
20937e7c60SSanjay Patel; CHECK-NEXT:    movabsq $42000000000, %rax # imm = 0x9C7652400
21937e7c60SSanjay Patel; CHECK-NEXT:    addq %rdi, %rax
22937e7c60SSanjay Patel; CHECK-NEXT:    testl %esi, %esi
23937e7c60SSanjay Patel; CHECK-NEXT:    cmovneq %rdi, %rax
24937e7c60SSanjay Patel; CHECK-NEXT:    retq
25937e7c60SSanjay Patel  %b = icmp eq i32 %x, 0
26937e7c60SSanjay Patel  %s = select i1 %b, i64 42000000000, i64 0
27937e7c60SSanjay Patel  %r = add i64 %s, %offset
28937e7c60SSanjay Patel  ret i64 %r
29937e7c60SSanjay Patel}
30937e7c60SSanjay Patel
31028eb436SSanjay Pateldefine i32 @select_consts_i32(i32 %offset, i64 %x) {
32028eb436SSanjay Patel; CHECK-LABEL: select_consts_i32:
33028eb436SSanjay Patel; CHECK:       # %bb.0:
34f060aa1cSSanjay Patel; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
35f060aa1cSSanjay Patel; CHECK-NEXT:    leal 43(%rdi), %eax
36028eb436SSanjay Patel; CHECK-NEXT:    cmpq $42, %rsi
37f060aa1cSSanjay Patel; CHECK-NEXT:    cmovgel %edi, %eax
38028eb436SSanjay Patel; CHECK-NEXT:    retq
39028eb436SSanjay Patel  %b = icmp sgt i64 %x, 41
40028eb436SSanjay Patel  %s = select i1 %b, i32 0, i32 43
41028eb436SSanjay Patel  %r = add i32 %offset, %s
42028eb436SSanjay Patel  ret i32 %r
43028eb436SSanjay Patel}
44028eb436SSanjay Patel
45028eb436SSanjay Pateldefine i16 @select_consts_i16(i16 %offset, i1 %b) {
46028eb436SSanjay Patel; CHECK-LABEL: select_consts_i16:
47028eb436SSanjay Patel; CHECK:       # %bb.0:
48f060aa1cSSanjay Patel; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
49f060aa1cSSanjay Patel; CHECK-NEXT:    leal 44(%rdi), %eax
50028eb436SSanjay Patel; CHECK-NEXT:    testb $1, %sil
51f060aa1cSSanjay Patel; CHECK-NEXT:    cmovel %edi, %eax
52028eb436SSanjay Patel; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
53028eb436SSanjay Patel; CHECK-NEXT:    retq
54028eb436SSanjay Patel  %s = select i1 %b, i16 44, i16 0
55028eb436SSanjay Patel  %r = add i16 %s, %offset
56028eb436SSanjay Patel  ret i16 %r
57028eb436SSanjay Patel}
58028eb436SSanjay Patel
59028eb436SSanjay Pateldefine i8 @select_consts_i8(i8 %offset, i1 %b) {
60028eb436SSanjay Patel; CHECK-LABEL: select_consts_i8:
61028eb436SSanjay Patel; CHECK:       # %bb.0:
62028eb436SSanjay Patel; CHECK-NEXT:    xorl %ecx, %ecx
63028eb436SSanjay Patel; CHECK-NEXT:    testb $1, %sil
64028eb436SSanjay Patel; CHECK-NEXT:    movl $45, %eax
65028eb436SSanjay Patel; CHECK-NEXT:    cmovnel %ecx, %eax
66028eb436SSanjay Patel; CHECK-NEXT:    addb %dil, %al
67028eb436SSanjay Patel; CHECK-NEXT:    # kill: def $al killed $al killed $eax
68028eb436SSanjay Patel; CHECK-NEXT:    retq
69028eb436SSanjay Patel  %s = select i1 %b, i8 0, i8 45
70028eb436SSanjay Patel  %r = add i8 %offset, %s
71028eb436SSanjay Patel  ret i8 %r
72028eb436SSanjay Patel}
73028eb436SSanjay Patel
74*2f448bf5SNikita Popovdefine i32 @select_consts_use_i32(i32 %offset, i64 %x, ptr %p) {
75028eb436SSanjay Patel; CHECK-LABEL: select_consts_use_i32:
76028eb436SSanjay Patel; CHECK:       # %bb.0:
77028eb436SSanjay Patel; CHECK-NEXT:    xorl %ecx, %ecx
78028eb436SSanjay Patel; CHECK-NEXT:    cmpq $42, %rsi
79028eb436SSanjay Patel; CHECK-NEXT:    movl $43, %eax
80028eb436SSanjay Patel; CHECK-NEXT:    cmovgel %ecx, %eax
81028eb436SSanjay Patel; CHECK-NEXT:    movl %eax, (%rdx)
82028eb436SSanjay Patel; CHECK-NEXT:    addl %edi, %eax
83028eb436SSanjay Patel; CHECK-NEXT:    retq
84028eb436SSanjay Patel  %b = icmp sgt i64 %x, 41
85028eb436SSanjay Patel  %s = select i1 %b, i32 0, i32 43
86*2f448bf5SNikita Popov  store i32 %s, ptr %p
87028eb436SSanjay Patel  %r = add i32 %offset, %s
88028eb436SSanjay Patel  ret i32 %r
89028eb436SSanjay Patel}
90028eb436SSanjay Patel
911ce05ad6SSanjay Patel; Special-case LEA hacks are done before we try to push the add into a CMOV.
921ce05ad6SSanjay Patel
93028eb436SSanjay Pateldefine i32 @select_40_43_i32(i32 %offset, i64 %x) {
94028eb436SSanjay Patel; CHECK-LABEL: select_40_43_i32:
95028eb436SSanjay Patel; CHECK:       # %bb.0:
96028eb436SSanjay Patel; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
97028eb436SSanjay Patel; CHECK-NEXT:    xorl %eax, %eax
98028eb436SSanjay Patel; CHECK-NEXT:    cmpq $42, %rsi
99028eb436SSanjay Patel; CHECK-NEXT:    setl %al
100028eb436SSanjay Patel; CHECK-NEXT:    leal (%rax,%rax,2), %eax
101028eb436SSanjay Patel; CHECK-NEXT:    leal 40(%rdi,%rax), %eax
102028eb436SSanjay Patel; CHECK-NEXT:    retq
103028eb436SSanjay Patel  %b = icmp sgt i64 %x, 41
104028eb436SSanjay Patel  %s = select i1 %b, i32 40, i32 43
105028eb436SSanjay Patel  %r = add i32 %offset, %s
106028eb436SSanjay Patel  ret i32 %r
107028eb436SSanjay Patel}
108028eb436SSanjay Patel
109028eb436SSanjay Pateldefine i32 @select_0_1_i32(i32 %offset, i64 %x) {
110028eb436SSanjay Patel; CHECK-LABEL: select_0_1_i32:
111028eb436SSanjay Patel; CHECK:       # %bb.0:
112028eb436SSanjay Patel; CHECK-NEXT:    movl %edi, %eax
113028eb436SSanjay Patel; CHECK-NEXT:    cmpq $42, %rsi
114028eb436SSanjay Patel; CHECK-NEXT:    adcl $0, %eax
115028eb436SSanjay Patel; CHECK-NEXT:    retq
116028eb436SSanjay Patel  %b = icmp ugt i64 %x, 41
117028eb436SSanjay Patel  %s = select i1 %b, i32 0, i32 1
118028eb436SSanjay Patel  %r = add i32 %offset, %s
119028eb436SSanjay Patel  ret i32 %r
120028eb436SSanjay Patel}
121028eb436SSanjay Patel
122028eb436SSanjay Pateldefine i32 @select_1_0_i32(i32 %offset, i64 %x) {
123028eb436SSanjay Patel; CHECK-LABEL: select_1_0_i32:
124028eb436SSanjay Patel; CHECK:       # %bb.0:
125028eb436SSanjay Patel; CHECK-NEXT:    movl %edi, %eax
126028eb436SSanjay Patel; CHECK-NEXT:    cmpq $42, %rsi
127028eb436SSanjay Patel; CHECK-NEXT:    sbbl $-1, %eax
128028eb436SSanjay Patel; CHECK-NEXT:    retq
129028eb436SSanjay Patel  %b = icmp ugt i64 %x, 41
130028eb436SSanjay Patel  %s = select i1 %b, i32 1, i32 0
131028eb436SSanjay Patel  %r = add i32 %offset, %s
132028eb436SSanjay Patel  ret i32 %r
133028eb436SSanjay Patel}
134937e7c60SSanjay Patel
135937e7c60SSanjay Pateldefine i64 @select_max32_2_i64(i64 %offset, i64 %x) {
136937e7c60SSanjay Patel; CHECK-LABEL: select_max32_2_i64:
137937e7c60SSanjay Patel; CHECK:       # %bb.0:
1381ce05ad6SSanjay Patel; CHECK-NEXT:    leaq 2(%rdi), %rax
1396766ece1SSanjay Patel; CHECK-NEXT:    leaq 2147483647(%rdi), %rcx
140937e7c60SSanjay Patel; CHECK-NEXT:    cmpq $41, %rsi
1416599961cSGuozhi Wei; CHECK-NEXT:    cmovneq %rcx, %rax
142937e7c60SSanjay Patel; CHECK-NEXT:    retq
143937e7c60SSanjay Patel  %b = icmp ne i64 %x, 41
144937e7c60SSanjay Patel  %s = select i1 %b, i64 2147483647, i64 2
145937e7c60SSanjay Patel  %r = add i64 %offset, %s
146937e7c60SSanjay Patel  ret i64 %r
147937e7c60SSanjay Patel}
148937e7c60SSanjay Patel
149937e7c60SSanjay Pateldefine i64 @select_42_min32_i64(i64 %offset, i1 %b) {
150937e7c60SSanjay Patel; CHECK-LABEL: select_42_min32_i64:
151937e7c60SSanjay Patel; CHECK:       # %bb.0:
152937e7c60SSanjay Patel; CHECK-NEXT:    testb $1, %sil
153937e7c60SSanjay Patel; CHECK-NEXT:    movl $42, %ecx
154937e7c60SSanjay Patel; CHECK-NEXT:    movl $2147483648, %eax # imm = 0x80000000
155937e7c60SSanjay Patel; CHECK-NEXT:    cmovneq %rcx, %rax
156937e7c60SSanjay Patel; CHECK-NEXT:    addq %rdi, %rax
157937e7c60SSanjay Patel; CHECK-NEXT:    retq
158937e7c60SSanjay Patel  %s = select i1 %b, i64 42, i64 2147483648
159937e7c60SSanjay Patel  %r = add i64 %offset, %s
160937e7c60SSanjay Patel  ret i64 %r
161937e7c60SSanjay Patel}
162937e7c60SSanjay Patel
163937e7c60SSanjay Pateldefine i64 @select_big_42_i64(i64 %offset, i64 %x) {
164937e7c60SSanjay Patel; CHECK-LABEL: select_big_42_i64:
165937e7c60SSanjay Patel; CHECK:       # %bb.0:
166937e7c60SSanjay Patel; CHECK-NEXT:    cmpq $41, %rsi
167937e7c60SSanjay Patel; CHECK-NEXT:    movl $2147483649, %ecx # imm = 0x80000001
168937e7c60SSanjay Patel; CHECK-NEXT:    movl $42, %eax
169937e7c60SSanjay Patel; CHECK-NEXT:    cmovneq %rcx, %rax
170937e7c60SSanjay Patel; CHECK-NEXT:    addq %rdi, %rax
171937e7c60SSanjay Patel; CHECK-NEXT:    retq
172937e7c60SSanjay Patel  %b = icmp ne i64 %x, 41
173937e7c60SSanjay Patel  %s = select i1 %b, i64 2147483649, i64 42
174937e7c60SSanjay Patel  %r = add i64 %s, %offset
175937e7c60SSanjay Patel  ret i64 %r
176937e7c60SSanjay Patel}
177937e7c60SSanjay Patel
178937e7c60SSanjay Pateldefine i64 @select_n42_big_i64(i64 %offset, i64 %x) {
179937e7c60SSanjay Patel; CHECK-LABEL: select_n42_big_i64:
180937e7c60SSanjay Patel; CHECK:       # %bb.0:
181937e7c60SSanjay Patel; CHECK-NEXT:    cmpq $41, %rsi
182937e7c60SSanjay Patel; CHECK-NEXT:    movq $-42, %rcx
183937e7c60SSanjay Patel; CHECK-NEXT:    movl $2147483649, %eax # imm = 0x80000001
184937e7c60SSanjay Patel; CHECK-NEXT:    cmovneq %rcx, %rax
185937e7c60SSanjay Patel; CHECK-NEXT:    addq %rdi, %rax
186937e7c60SSanjay Patel; CHECK-NEXT:    retq
187937e7c60SSanjay Patel  %b = icmp ne i64 %x, 41
188937e7c60SSanjay Patel  %s = select i1 %b, i64 -42, i64 2147483649
189937e7c60SSanjay Patel  %r = add i64 %s, %offset
190937e7c60SSanjay Patel  ret i64 %r
191937e7c60SSanjay Patel}
192937e7c60SSanjay Patel
193937e7c60SSanjay Pateldefine i64 @select_big_bigger_i64(i64 %offset, i64 %x) {
194937e7c60SSanjay Patel; CHECK-LABEL: select_big_bigger_i64:
195937e7c60SSanjay Patel; CHECK:       # %bb.0:
196937e7c60SSanjay Patel; CHECK-NEXT:    cmpq $41, %rsi
197937e7c60SSanjay Patel; CHECK-NEXT:    movl $2147483649, %ecx # imm = 0x80000001
198937e7c60SSanjay Patel; CHECK-NEXT:    movabsq $42000000000, %rax # imm = 0x9C7652400
199937e7c60SSanjay Patel; CHECK-NEXT:    cmovneq %rcx, %rax
200937e7c60SSanjay Patel; CHECK-NEXT:    addq %rdi, %rax
201937e7c60SSanjay Patel; CHECK-NEXT:    retq
202937e7c60SSanjay Patel  %b = icmp ne i64 %x, 41
203937e7c60SSanjay Patel  %s = select i1 %b, i64 2147483649, i64 42000000000
204937e7c60SSanjay Patel  %r = add i64 %s, %offset
205937e7c60SSanjay Patel  ret i64 %r
206937e7c60SSanjay Patel}
207937e7c60SSanjay Patel
208937e7c60SSanjay Pateldefine i32 @select_20_43_i32(i32 %offset, i64 %x) {
209937e7c60SSanjay Patel; CHECK-LABEL: select_20_43_i32:
210937e7c60SSanjay Patel; CHECK:       # %bb.0:
2111ce05ad6SSanjay Patel; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
2126599961cSGuozhi Wei; CHECK-NEXT:    leal 43(%rdi), %ecx
2136766ece1SSanjay Patel; CHECK-NEXT:    leal 20(%rdi), %eax
214937e7c60SSanjay Patel; CHECK-NEXT:    cmpq $42, %rsi
2156599961cSGuozhi Wei; CHECK-NEXT:    cmovll %ecx, %eax
216937e7c60SSanjay Patel; CHECK-NEXT:    retq
217937e7c60SSanjay Patel  %b = icmp sgt i64 %x, 41
218937e7c60SSanjay Patel  %s = select i1 %b, i32 20, i32 43
219937e7c60SSanjay Patel  %r = add i32 %offset, %s
220937e7c60SSanjay Patel  ret i32 %r
221937e7c60SSanjay Patel}
222937e7c60SSanjay Patel
223937e7c60SSanjay Pateldefine i16 @select_n2_17_i16(i16 %offset, i1 %b) {
224937e7c60SSanjay Patel; CHECK-LABEL: select_n2_17_i16:
225937e7c60SSanjay Patel; CHECK:       # %bb.0:
2261ce05ad6SSanjay Patel; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
2276599961cSGuozhi Wei; CHECK-NEXT:    leal 17(%rdi), %ecx
2286599961cSGuozhi Wei; CHECK-NEXT:    leal 65534(%rdi), %eax
229937e7c60SSanjay Patel; CHECK-NEXT:    testb $1, %sil
2306599961cSGuozhi Wei; CHECK-NEXT:    cmovel %ecx, %eax
231937e7c60SSanjay Patel; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
232937e7c60SSanjay Patel; CHECK-NEXT:    retq
233937e7c60SSanjay Patel  %s = select i1 %b, i16 -2, i16 17
234937e7c60SSanjay Patel  %r = add i16 %offset, %s
235937e7c60SSanjay Patel  ret i16 %r
236937e7c60SSanjay Patel}
237937e7c60SSanjay Patel
238*2f448bf5SNikita Popov%class.btAxis = type { %struct.btBroadphaseProxy.base, [3 x i16], [3 x i16], ptr }
239*2f448bf5SNikita Popov%struct.btBroadphaseProxy.base = type <{ ptr, i16, i16, [4 x i8], ptr, i32, [4 x float], [4 x float] }>
240*2f448bf5SNikita Popov%struct.btBroadphaseProxy = type <{ ptr, i16, i16, [4 x i8], ptr, i32, [4 x float], [4 x float], [4 x i8] }>
241937e7c60SSanjay Patel
242*2f448bf5SNikita Popovdefine ptr @bullet(i1 %b, ptr readnone %ptr, i64 %idx) {
243937e7c60SSanjay Patel; CHECK-LABEL: bullet:
244937e7c60SSanjay Patel; CHECK:       # %bb.0:
2451ce05ad6SSanjay Patel; CHECK-NEXT:    leaq (%rdx,%rdx,4), %rax
2461ce05ad6SSanjay Patel; CHECK-NEXT:    shlq $4, %rax
2471ce05ad6SSanjay Patel; CHECK-NEXT:    leaq 60(%rsi,%rax), %rcx
2481ce05ad6SSanjay Patel; CHECK-NEXT:    leaq 66(%rsi,%rax), %rax
249937e7c60SSanjay Patel; CHECK-NEXT:    testb $1, %dil
2501ce05ad6SSanjay Patel; CHECK-NEXT:    cmovneq %rcx, %rax
251937e7c60SSanjay Patel; CHECK-NEXT:    retq
252*2f448bf5SNikita Popov  %gep2 = getelementptr inbounds %class.btAxis, ptr %ptr, i64 %idx, i32 2, i64 0
253*2f448bf5SNikita Popov  %gep1 = getelementptr inbounds %class.btAxis, ptr %ptr, i64 %idx, i32 1, i64 0
254*2f448bf5SNikita Popov  %sel = select i1 %b, ptr %gep1, ptr %gep2
255*2f448bf5SNikita Popov  ret ptr %sel
256937e7c60SSanjay Patel}
2570b8d30b1SSanjay Patel
258*2f448bf5SNikita Popovdefine ptr @bullet_alt1(i1 %b, ptr readnone %ptr, i64 %idx) {
2590b8d30b1SSanjay Patel; CHECK-LABEL: bullet_alt1:
2600b8d30b1SSanjay Patel; CHECK:       # %bb.0:
2610b8d30b1SSanjay Patel; CHECK-NEXT:    leaq 60(%rsi), %rax
2620b8d30b1SSanjay Patel; CHECK-NEXT:    leaq 66(%rsi), %rcx
2630b8d30b1SSanjay Patel; CHECK-NEXT:    testb $1, %dil
2640b8d30b1SSanjay Patel; CHECK-NEXT:    cmovneq %rax, %rcx
2650b8d30b1SSanjay Patel; CHECK-NEXT:    leaq (%rdx,%rdx,4), %rax
2660b8d30b1SSanjay Patel; CHECK-NEXT:    shlq $4, %rax
2670b8d30b1SSanjay Patel; CHECK-NEXT:    addq %rcx, %rax
2680b8d30b1SSanjay Patel; CHECK-NEXT:    retq
2690b8d30b1SSanjay Patel  %idx40 = mul i64 %idx, 40
270*2f448bf5SNikita Popov  %gep2 = getelementptr inbounds i16, ptr %ptr, i64 33
271*2f448bf5SNikita Popov  %gep1 = getelementptr inbounds i16, ptr %ptr, i64 30
272*2f448bf5SNikita Popov  %sel = select i1 %b, ptr %gep1, ptr %gep2
273*2f448bf5SNikita Popov  %gep3 = getelementptr inbounds i16, ptr %sel, i64 %idx40
274*2f448bf5SNikita Popov  ret ptr %gep3
2750b8d30b1SSanjay Patel}
2760b8d30b1SSanjay Patel
277*2f448bf5SNikita Popovdefine void @bullet_load_store(i32 %x, i64 %y, ptr %p) {
2780b8d30b1SSanjay Patel; CHECK-LABEL: bullet_load_store:
2790b8d30b1SSanjay Patel; CHECK:       # %bb.0:
2800b8d30b1SSanjay Patel; CHECK-NEXT:    leaq (%rsi,%rsi,4), %rax
2810b8d30b1SSanjay Patel; CHECK-NEXT:    shlq $4, %rax
2824c41caa2SSanjay Patel; CHECK-NEXT:    leaq 66(%rdx), %rcx
2834c41caa2SSanjay Patel; CHECK-NEXT:    addq $60, %rdx
2840b8d30b1SSanjay Patel; CHECK-NEXT:    testb $1, %dil
2854c41caa2SSanjay Patel; CHECK-NEXT:    cmovneq %rcx, %rdx
2864c41caa2SSanjay Patel; CHECK-NEXT:    decw (%rdx,%rax)
2870b8d30b1SSanjay Patel; CHECK-NEXT:    retq
2880b8d30b1SSanjay Patel  %and = and i32 %x, 1
2890b8d30b1SSanjay Patel  %b = icmp eq i32 %and, 0
290*2f448bf5SNikita Popov  %gep2 = getelementptr inbounds %class.btAxis, ptr %p, i64 %y, i32 2, i64 0
291*2f448bf5SNikita Popov  %gep1 = getelementptr inbounds %class.btAxis, ptr %p, i64 %y, i32 1, i64 0
292*2f448bf5SNikita Popov  %sel = select i1 %b, ptr %gep1, ptr %gep2
293*2f448bf5SNikita Popov  %ld = load i16, ptr %sel, align 4
2940b8d30b1SSanjay Patel  %dec = add i16 %ld, -1
295*2f448bf5SNikita Popov  store i16 %dec, ptr %sel, align 4
2960b8d30b1SSanjay Patel  ret void
2970b8d30b1SSanjay Patel}
2980b8d30b1SSanjay Patel
299*2f448bf5SNikita Popovdefine void @complex_lea_alt1(i1 %b, ptr readnone %ptr, i64 %idx) {
3000b8d30b1SSanjay Patel; CHECK-LABEL: complex_lea_alt1:
3010b8d30b1SSanjay Patel; CHECK:       # %bb.0:
3024c41caa2SSanjay Patel; CHECK-NEXT:    leaq 60(%rdx), %rax
3034c41caa2SSanjay Patel; CHECK-NEXT:    addq $66, %rdx
3040b8d30b1SSanjay Patel; CHECK-NEXT:    testb $1, %dil
3054c41caa2SSanjay Patel; CHECK-NEXT:    cmovneq %rax, %rdx
3064c41caa2SSanjay Patel; CHECK-NEXT:    decw (%rdx,%rsi)
3070b8d30b1SSanjay Patel; CHECK-NEXT:    retq
308*2f448bf5SNikita Popov  %i = ptrtoint ptr %ptr to i64
3090b8d30b1SSanjay Patel  %sum = add i64 %idx, %i
310*2f448bf5SNikita Popov  %base = inttoptr i64 %sum to ptr
311*2f448bf5SNikita Popov  %gep2 = getelementptr inbounds i16, ptr %base, i64 33
312*2f448bf5SNikita Popov  %gep1 = getelementptr inbounds i16, ptr %base, i64 30
313*2f448bf5SNikita Popov  %sel = select i1 %b, ptr %gep1, ptr %gep2
314*2f448bf5SNikita Popov  %ld = load i16, ptr %sel, align 4
3150b8d30b1SSanjay Patel  %dec = add i16 %ld, -1
316*2f448bf5SNikita Popov  store i16 %dec, ptr %sel, align 4
3170b8d30b1SSanjay Patel  ret void
3180b8d30b1SSanjay Patel}
3190b8d30b1SSanjay Patel
320*2f448bf5SNikita Popovdefine void @complex_lea_alt2(i1 %b, ptr readnone %ptr, i64 %idx) {
3210b8d30b1SSanjay Patel; CHECK-LABEL: complex_lea_alt2:
3220b8d30b1SSanjay Patel; CHECK:       # %bb.0:
3234c41caa2SSanjay Patel; CHECK-NEXT:    leaq 60(%rsi), %rax
3244c41caa2SSanjay Patel; CHECK-NEXT:    addq $66, %rsi
3250b8d30b1SSanjay Patel; CHECK-NEXT:    testb $1, %dil
3264c41caa2SSanjay Patel; CHECK-NEXT:    cmovneq %rax, %rsi
3274c41caa2SSanjay Patel; CHECK-NEXT:    decw (%rsi,%rdx)
3280b8d30b1SSanjay Patel; CHECK-NEXT:    retq
329*2f448bf5SNikita Popov  %i = ptrtoint ptr %ptr to i64
3300b8d30b1SSanjay Patel  %sum = add i64 %i, %idx
331*2f448bf5SNikita Popov  %base = inttoptr i64 %sum to ptr
332*2f448bf5SNikita Popov  %gep2 = getelementptr inbounds i16, ptr %base, i64 33
333*2f448bf5SNikita Popov  %gep1 = getelementptr inbounds i16, ptr %base, i64 30
334*2f448bf5SNikita Popov  %sel = select i1 %b, ptr %gep1, ptr %gep2
335*2f448bf5SNikita Popov  %ld = load i16, ptr %sel, align 4
3360b8d30b1SSanjay Patel  %dec = add i16 %ld, -1
337*2f448bf5SNikita Popov  store i16 %dec, ptr %sel, align 4
3380b8d30b1SSanjay Patel  ret void
3390b8d30b1SSanjay Patel}
3400b8d30b1SSanjay Patel
341*2f448bf5SNikita Popovdefine void @complex_lea_alt3(i1 %b, ptr readnone %ptr, i64 %idx) {
3420b8d30b1SSanjay Patel; CHECK-LABEL: complex_lea_alt3:
3430b8d30b1SSanjay Patel; CHECK:       # %bb.0:
3440b8d30b1SSanjay Patel; CHECK-NEXT:    leaq 60(%rsi), %rax
3450b8d30b1SSanjay Patel; CHECK-NEXT:    addq $66, %rsi
3460b8d30b1SSanjay Patel; CHECK-NEXT:    testb $1, %dil
3470b8d30b1SSanjay Patel; CHECK-NEXT:    cmovneq %rax, %rsi
3480b8d30b1SSanjay Patel; CHECK-NEXT:    decw (%rsi,%rdx)
3490b8d30b1SSanjay Patel; CHECK-NEXT:    retq
350*2f448bf5SNikita Popov  %i = ptrtoint ptr %ptr to i64
3510b8d30b1SSanjay Patel  %i66 = add i64 %i, 66
3520b8d30b1SSanjay Patel  %i60 = add i64 %i, 60
3530b8d30b1SSanjay Patel  %o66 = add i64 %i66, %idx
3540b8d30b1SSanjay Patel  %o60 = add i64 %i60, %idx
355*2f448bf5SNikita Popov  %p66 = inttoptr i64 %o66 to ptr
356*2f448bf5SNikita Popov  %p60 = inttoptr i64 %o60 to ptr
357*2f448bf5SNikita Popov  %sel = select i1 %b, ptr %p60, ptr %p66
358*2f448bf5SNikita Popov  %ld = load i16, ptr %sel, align 4
3590b8d30b1SSanjay Patel  %dec = add i16 %ld, -1
360*2f448bf5SNikita Popov  store i16 %dec, ptr %sel, align 4
3610b8d30b1SSanjay Patel  ret void
3620b8d30b1SSanjay Patel}
3630b8d30b1SSanjay Patel
364*2f448bf5SNikita Popovdefine void @complex_lea_alt4(i1 %b, ptr readnone %ptr, i64 %idx) {
3650b8d30b1SSanjay Patel; CHECK-LABEL: complex_lea_alt4:
3660b8d30b1SSanjay Patel; CHECK:       # %bb.0:
3670b8d30b1SSanjay Patel; CHECK-NEXT:    leaq 60(%rsi), %rax
3680b8d30b1SSanjay Patel; CHECK-NEXT:    addq $66, %rsi
3690b8d30b1SSanjay Patel; CHECK-NEXT:    testb $1, %dil
3700b8d30b1SSanjay Patel; CHECK-NEXT:    cmovneq %rax, %rsi
3710b8d30b1SSanjay Patel; CHECK-NEXT:    decw (%rdx,%rsi)
3720b8d30b1SSanjay Patel; CHECK-NEXT:    retq
373*2f448bf5SNikita Popov  %i = ptrtoint ptr %ptr to i64
3740b8d30b1SSanjay Patel  %i66 = add i64 %i, 66
3750b8d30b1SSanjay Patel  %i60 = add i64 %i, 60
3760b8d30b1SSanjay Patel  %o66 = add i64 %idx, %i66
3770b8d30b1SSanjay Patel  %o60 = add i64 %idx, %i60
378*2f448bf5SNikita Popov  %p66 = inttoptr i64 %o66 to ptr
379*2f448bf5SNikita Popov  %p60 = inttoptr i64 %o60 to ptr
380*2f448bf5SNikita Popov  %sel = select i1 %b, ptr %p60, ptr %p66
381*2f448bf5SNikita Popov  %ld = load i16, ptr %sel, align 4
3820b8d30b1SSanjay Patel  %dec = add i16 %ld, -1
383*2f448bf5SNikita Popov  store i16 %dec, ptr %sel, align 4
3840b8d30b1SSanjay Patel  ret void
3850b8d30b1SSanjay Patel}
3860b8d30b1SSanjay Patel
387*2f448bf5SNikita Popovdefine void @complex_lea_alt5(i1 %b, ptr readnone %ptr, i64 %idx) {
3880b8d30b1SSanjay Patel; CHECK-LABEL: complex_lea_alt5:
3890b8d30b1SSanjay Patel; CHECK:       # %bb.0:
3900b8d30b1SSanjay Patel; CHECK-NEXT:    leaq 60(%rdx), %rax
3910b8d30b1SSanjay Patel; CHECK-NEXT:    addq $66, %rdx
3920b8d30b1SSanjay Patel; CHECK-NEXT:    testb $1, %dil
3930b8d30b1SSanjay Patel; CHECK-NEXT:    cmovneq %rax, %rdx
3940b8d30b1SSanjay Patel; CHECK-NEXT:    decw (%rdx,%rsi)
3950b8d30b1SSanjay Patel; CHECK-NEXT:    retq
396*2f448bf5SNikita Popov  %i = ptrtoint ptr %ptr to i64
3970b8d30b1SSanjay Patel  %i66 = add i64 %idx, 66
3980b8d30b1SSanjay Patel  %i60 = add i64 %idx, 60
3990b8d30b1SSanjay Patel  %o66 = add i64 %i66, %i
4000b8d30b1SSanjay Patel  %o60 = add i64 %i60, %i
401*2f448bf5SNikita Popov  %p66 = inttoptr i64 %o66 to ptr
402*2f448bf5SNikita Popov  %p60 = inttoptr i64 %o60 to ptr
403*2f448bf5SNikita Popov  %sel = select i1 %b, ptr %p60, ptr %p66
404*2f448bf5SNikita Popov  %ld = load i16, ptr %sel, align 4
4050b8d30b1SSanjay Patel  %dec = add i16 %ld, -1
406*2f448bf5SNikita Popov  store i16 %dec, ptr %sel, align 4
4070b8d30b1SSanjay Patel  ret void
4080b8d30b1SSanjay Patel}
4090b8d30b1SSanjay Patel
410*2f448bf5SNikita Popovdefine void @complex_lea_alt6(i1 %b, ptr readnone %ptr, i64 %idx) {
4110b8d30b1SSanjay Patel; CHECK-LABEL: complex_lea_alt6:
4120b8d30b1SSanjay Patel; CHECK:       # %bb.0:
4130b8d30b1SSanjay Patel; CHECK-NEXT:    leaq 60(%rdx), %rax
4140b8d30b1SSanjay Patel; CHECK-NEXT:    addq $66, %rdx
4150b8d30b1SSanjay Patel; CHECK-NEXT:    testb $1, %dil
4160b8d30b1SSanjay Patel; CHECK-NEXT:    cmovneq %rax, %rdx
4170b8d30b1SSanjay Patel; CHECK-NEXT:    decw (%rsi,%rdx)
4180b8d30b1SSanjay Patel; CHECK-NEXT:    retq
419*2f448bf5SNikita Popov  %i = ptrtoint ptr %ptr to i64
4200b8d30b1SSanjay Patel  %i66 = add i64 %idx, 66
4210b8d30b1SSanjay Patel  %i60 = add i64 %idx, 60
4220b8d30b1SSanjay Patel  %o66 = add i64 %i, %i66
4230b8d30b1SSanjay Patel  %o60 = add i64 %i, %i60
424*2f448bf5SNikita Popov  %p66 = inttoptr i64 %o66 to ptr
425*2f448bf5SNikita Popov  %p60 = inttoptr i64 %o60 to ptr
426*2f448bf5SNikita Popov  %sel = select i1 %b, ptr %p60, ptr %p66
427*2f448bf5SNikita Popov  %ld = load i16, ptr %sel, align 4
4280b8d30b1SSanjay Patel  %dec = add i16 %ld, -1
429*2f448bf5SNikita Popov  store i16 %dec, ptr %sel, align 4
4300b8d30b1SSanjay Patel  ret void
4310b8d30b1SSanjay Patel}
4320b8d30b1SSanjay Patel
433*2f448bf5SNikita Popovdefine void @complex_lea_alt7(i1 %b, ptr readnone %ptr, i64 %idx) {
4340b8d30b1SSanjay Patel; CHECK-LABEL: complex_lea_alt7:
4350b8d30b1SSanjay Patel; CHECK:       # %bb.0:
4364c41caa2SSanjay Patel; CHECK-NEXT:    leaq 60(%rdx), %rax
4374c41caa2SSanjay Patel; CHECK-NEXT:    addq $66, %rdx
4380b8d30b1SSanjay Patel; CHECK-NEXT:    testb $1, %dil
4394c41caa2SSanjay Patel; CHECK-NEXT:    cmovneq %rax, %rdx
4404c41caa2SSanjay Patel; CHECK-NEXT:    decw (%rdx,%rsi)
4410b8d30b1SSanjay Patel; CHECK-NEXT:    retq
442*2f448bf5SNikita Popov  %i = ptrtoint ptr %ptr to i64
4430b8d30b1SSanjay Patel  %o = add i64 %idx, %i
4440b8d30b1SSanjay Patel  %o66 = add i64 %o, 66
4450b8d30b1SSanjay Patel  %o60 = add i64 %o, 60
446*2f448bf5SNikita Popov  %p66 = inttoptr i64 %o66 to ptr
447*2f448bf5SNikita Popov  %p60 = inttoptr i64 %o60 to ptr
448*2f448bf5SNikita Popov  %sel = select i1 %b, ptr %p60, ptr %p66
449*2f448bf5SNikita Popov  %ld = load i16, ptr %sel, align 4
4500b8d30b1SSanjay Patel  %dec = add i16 %ld, -1
451*2f448bf5SNikita Popov  store i16 %dec, ptr %sel, align 4
4520b8d30b1SSanjay Patel  ret void
4530b8d30b1SSanjay Patel}
4540b8d30b1SSanjay Patel
455*2f448bf5SNikita Popovdefine void @complex_lea_alt8(i1 %b, ptr readnone %ptr, i64 %idx) {
4560b8d30b1SSanjay Patel; CHECK-LABEL: complex_lea_alt8:
4570b8d30b1SSanjay Patel; CHECK:       # %bb.0:
4584c41caa2SSanjay Patel; CHECK-NEXT:    leaq 60(%rsi), %rax
4594c41caa2SSanjay Patel; CHECK-NEXT:    addq $66, %rsi
4600b8d30b1SSanjay Patel; CHECK-NEXT:    testb $1, %dil
4614c41caa2SSanjay Patel; CHECK-NEXT:    cmovneq %rax, %rsi
4624c41caa2SSanjay Patel; CHECK-NEXT:    decw (%rsi,%rdx)
4630b8d30b1SSanjay Patel; CHECK-NEXT:    retq
464*2f448bf5SNikita Popov  %i = ptrtoint ptr %ptr to i64
4650b8d30b1SSanjay Patel  %o = add i64 %i, %idx
4660b8d30b1SSanjay Patel  %o66 = add i64 %o, 66
4670b8d30b1SSanjay Patel  %o60 = add i64 %o, 60
468*2f448bf5SNikita Popov  %p66 = inttoptr i64 %o66 to ptr
469*2f448bf5SNikita Popov  %p60 = inttoptr i64 %o60 to ptr
470*2f448bf5SNikita Popov  %sel = select i1 %b, ptr %p60, ptr %p66
471*2f448bf5SNikita Popov  %ld = load i16, ptr %sel, align 4
4720b8d30b1SSanjay Patel  %dec = add i16 %ld, -1
473*2f448bf5SNikita Popov  store i16 %dec, ptr %sel, align 4
4740b8d30b1SSanjay Patel  ret void
4750b8d30b1SSanjay Patel}
4766766ece1SSanjay Patel
477*2f448bf5SNikita Popovdefine i32 @loadfold_select_const_arms(ptr %x, i1 %y) {
4786766ece1SSanjay Patel; CHECK-LABEL: loadfold_select_const_arms:
4796766ece1SSanjay Patel; CHECK:       # %bb.0:
4806766ece1SSanjay Patel; CHECK-NEXT:    testb $1, %sil
481ad7214f2SSanjay Patel; CHECK-NEXT:    movl $10, %ecx
482ad7214f2SSanjay Patel; CHECK-NEXT:    movl $-10, %eax
483ad7214f2SSanjay Patel; CHECK-NEXT:    cmovnel %ecx, %eax
484ad7214f2SSanjay Patel; CHECK-NEXT:    addl (%rdi), %eax
4856766ece1SSanjay Patel; CHECK-NEXT:    retq
4866766ece1SSanjay Patel  %cond = select i1 %y, i32 10, i32 -10
487*2f448bf5SNikita Popov  %t0 = load i32, ptr %x, align 4
4886766ece1SSanjay Patel  %add = add nsw i32 %t0, %cond
4896766ece1SSanjay Patel  ret i32 %add
4906766ece1SSanjay Patel}
4916766ece1SSanjay Patel
492*2f448bf5SNikita Popovdefine void @rmw_add(ptr %x, i1 %y, i32 %z, i32 %w) {
4936766ece1SSanjay Patel; CHECK-LABEL: rmw_add:
4946766ece1SSanjay Patel; CHECK:       # %bb.0:
4956766ece1SSanjay Patel; CHECK-NEXT:    testb $1, %sil
4966766ece1SSanjay Patel; CHECK-NEXT:    cmovel %ecx, %edx
4976766ece1SSanjay Patel; CHECK-NEXT:    addl %edx, (%rdi)
4986766ece1SSanjay Patel; CHECK-NEXT:    retq
4996766ece1SSanjay Patel  %cond = select i1 %y, i32 %z, i32 %w
500*2f448bf5SNikita Popov  %t0 = load i32, ptr %x, align 4
5016766ece1SSanjay Patel  %add = add nsw i32 %t0, %cond
502*2f448bf5SNikita Popov  store i32 %add, ptr %x, align 4
5036766ece1SSanjay Patel  ret void
5046766ece1SSanjay Patel}
5056766ece1SSanjay Patel
506*2f448bf5SNikita Popovdefine void @rmw_add_select_const_arm(ptr %x, i1 %y, i32 %z) {
5076766ece1SSanjay Patel; CHECK-LABEL: rmw_add_select_const_arm:
5086766ece1SSanjay Patel; CHECK:       # %bb.0:
5096766ece1SSanjay Patel; CHECK-NEXT:    testb $1, %sil
5106766ece1SSanjay Patel; CHECK-NEXT:    movl $-10, %eax
5116766ece1SSanjay Patel; CHECK-NEXT:    cmovnel %edx, %eax
5126766ece1SSanjay Patel; CHECK-NEXT:    addl %eax, (%rdi)
5136766ece1SSanjay Patel; CHECK-NEXT:    retq
5146766ece1SSanjay Patel  %cond = select i1 %y, i32 %z, i32 -10
515*2f448bf5SNikita Popov  %t0 = load i32, ptr %x, align 4
5166766ece1SSanjay Patel  %add = add nsw i32 %t0, %cond
517*2f448bf5SNikita Popov  store i32 %add, ptr %x, align 4
5186766ece1SSanjay Patel  ret void
5196766ece1SSanjay Patel}
5206766ece1SSanjay Patel
521*2f448bf5SNikita Popovdefine void @rmw_select_const_arms(ptr %x, i1 %y) {
5226766ece1SSanjay Patel; CHECK-LABEL: rmw_select_const_arms:
5236766ece1SSanjay Patel; CHECK:       # %bb.0:
5246766ece1SSanjay Patel; CHECK-NEXT:    testb $1, %sil
525ad7214f2SSanjay Patel; CHECK-NEXT:    movl $10, %eax
526ad7214f2SSanjay Patel; CHECK-NEXT:    movl $-10, %ecx
527ad7214f2SSanjay Patel; CHECK-NEXT:    cmovnel %eax, %ecx
528ad7214f2SSanjay Patel; CHECK-NEXT:    addl %ecx, (%rdi)
5296766ece1SSanjay Patel; CHECK-NEXT:    retq
5306766ece1SSanjay Patel  %cond = select i1 %y, i32 10, i32 -10
531*2f448bf5SNikita Popov  %t0 = load i32, ptr %x, align 4
5326766ece1SSanjay Patel  %add = add nsw i32 %t0, %cond
533*2f448bf5SNikita Popov  store i32 %add, ptr %x, align 4
5346766ece1SSanjay Patel  ret void
5356766ece1SSanjay Patel}
5366766ece1SSanjay Patel
537*2f448bf5SNikita Popovdefine i32 @rmw_select_const_arms_extra_load_use(ptr %x, i1 %y) {
5386766ece1SSanjay Patel; CHECK-LABEL: rmw_select_const_arms_extra_load_use:
5396766ece1SSanjay Patel; CHECK:       # %bb.0:
5406766ece1SSanjay Patel; CHECK-NEXT:    movl (%rdi), %eax
5416766ece1SSanjay Patel; CHECK-NEXT:    leal -10(%rax), %ecx
5426766ece1SSanjay Patel; CHECK-NEXT:    leal 10(%rax), %edx
5436766ece1SSanjay Patel; CHECK-NEXT:    testb $1, %sil
5446766ece1SSanjay Patel; CHECK-NEXT:    cmovel %ecx, %edx
5456766ece1SSanjay Patel; CHECK-NEXT:    movl %edx, (%rdi)
5466766ece1SSanjay Patel; CHECK-NEXT:    # kill: def $eax killed $eax killed $rax
5476766ece1SSanjay Patel; CHECK-NEXT:    retq
5486766ece1SSanjay Patel  %cond = select i1 %y, i32 10, i32 -10
549*2f448bf5SNikita Popov  %t0 = load i32, ptr %x, align 4
5506766ece1SSanjay Patel  %add = add nsw i32 %t0, %cond
551*2f448bf5SNikita Popov  store i32 %add, ptr %x, align 4
5526766ece1SSanjay Patel  ret i32 %t0
5536766ece1SSanjay Patel}
5546766ece1SSanjay Patel
555*2f448bf5SNikita Popovdefine i32 @rmw_select_const_arms_extra_add_use(ptr %x, i1 %y) {
5566766ece1SSanjay Patel; CHECK-LABEL: rmw_select_const_arms_extra_add_use:
5576766ece1SSanjay Patel; CHECK:       # %bb.0:
5586766ece1SSanjay Patel; CHECK-NEXT:    testb $1, %sil
559ad7214f2SSanjay Patel; CHECK-NEXT:    movl $10, %ecx
560ad7214f2SSanjay Patel; CHECK-NEXT:    movl $-10, %eax
561ad7214f2SSanjay Patel; CHECK-NEXT:    cmovnel %ecx, %eax
562ad7214f2SSanjay Patel; CHECK-NEXT:    addl (%rdi), %eax
5636766ece1SSanjay Patel; CHECK-NEXT:    movl %eax, (%rdi)
5646766ece1SSanjay Patel; CHECK-NEXT:    retq
5656766ece1SSanjay Patel  %cond = select i1 %y, i32 10, i32 -10
566*2f448bf5SNikita Popov  %t0 = load i32, ptr %x, align 4
5676766ece1SSanjay Patel  %add = add nsw i32 %t0, %cond
568*2f448bf5SNikita Popov  store i32 %add, ptr %x, align 4
5696766ece1SSanjay Patel  ret i32 %add
5706766ece1SSanjay Patel}
571