xref: /llvm-project/llvm/test/CodeGen/X86/scheduler-backtracking.ll (revision 90e9895a9373b3d83eefe15b34d2dc83c7bcc88f)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=x86_64-- < %s -pre-RA-sched=list-ilp    | FileCheck %s --check-prefix=ILP
3; RUN: llc -mtriple=x86_64-- < %s -pre-RA-sched=list-hybrid | FileCheck %s --check-prefix=HYBRID
4; RUN: llc -mtriple=x86_64-- < %s -pre-RA-sched=list-burr   | FileCheck %s --check-prefix=BURR
5; RUN: llc -mtriple=x86_64-- < %s -pre-RA-sched=source      | FileCheck %s --check-prefix=SRC
6; FIXME: Fix machine verifier issues and remove -verify-machineinstrs=0. PR39452.
7; RUN: llc -mtriple=x86_64-- < %s -pre-RA-sched=linearize -verify-machineinstrs=0 | FileCheck %s --check-prefix=LIN
8
9; PR22304 https://llvm.org/bugs/show_bug.cgi?id=22304
10; Tests checking backtracking in source scheduler. llc used to crash on them.
11
12define i256 @test1(i256 %a) nounwind {
13; ILP-LABEL: test1:
14; ILP:       # %bb.0:
15; ILP-NEXT:    movq %rdi, %rax
16; ILP-NEXT:    xorps %xmm0, %xmm0
17; ILP-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
18; ILP-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
19; ILP-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
20; ILP-NEXT:    leal (%rsi,%rsi), %ecx
21; ILP-NEXT:    addb $3, %cl
22; ILP-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
23; ILP-NEXT:    movq $1, -{{[0-9]+}}(%rsp)
24; ILP-NEXT:    movl %ecx, %edx
25; ILP-NEXT:    shrb $3, %dl
26; ILP-NEXT:    andb $24, %dl
27; ILP-NEXT:    negb %dl
28; ILP-NEXT:    movsbq %dl, %rdx
29; ILP-NEXT:    movq -24(%rsp,%rdx), %rsi
30; ILP-NEXT:    movq -16(%rsp,%rdx), %rdi
31; ILP-NEXT:    shldq %cl, %rsi, %rdi
32; ILP-NEXT:    movq -40(%rsp,%rdx), %r8
33; ILP-NEXT:    movq -32(%rsp,%rdx), %rdx
34; ILP-NEXT:    movq %r8, %r9
35; ILP-NEXT:    shlq %cl, %r9
36; ILP-NEXT:    movq %rdx, %r10
37; ILP-NEXT:    shldq %cl, %r8, %r10
38; ILP-NEXT:    movq %rdi, 24(%rax)
39; ILP-NEXT:    movq %r10, 8(%rax)
40; ILP-NEXT:    movq %r9, (%rax)
41; ILP-NEXT:    shlq %cl, %rsi
42; ILP-NEXT:    notb %cl
43; ILP-NEXT:    shrq %rdx
44; ILP-NEXT:    # kill: def $cl killed $cl killed $ecx
45; ILP-NEXT:    shrq %cl, %rdx
46; ILP-NEXT:    orq %rsi, %rdx
47; ILP-NEXT:    movq %rdx, 16(%rax)
48; ILP-NEXT:    retq
49;
50; HYBRID-LABEL: test1:
51; HYBRID:       # %bb.0:
52; HYBRID-NEXT:    movq %rdi, %rax
53; HYBRID-NEXT:    xorps %xmm0, %xmm0
54; HYBRID-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
55; HYBRID-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
56; HYBRID-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
57; HYBRID-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
58; HYBRID-NEXT:    movq $1, -{{[0-9]+}}(%rsp)
59; HYBRID-NEXT:    leal (%rsi,%rsi), %ecx
60; HYBRID-NEXT:    addb $3, %cl
61; HYBRID-NEXT:    movl %ecx, %edx
62; HYBRID-NEXT:    shrb $3, %dl
63; HYBRID-NEXT:    andb $24, %dl
64; HYBRID-NEXT:    negb %dl
65; HYBRID-NEXT:    movsbq %dl, %rdx
66; HYBRID-NEXT:    movq -24(%rsp,%rdx), %rsi
67; HYBRID-NEXT:    movq -16(%rsp,%rdx), %rdi
68; HYBRID-NEXT:    shldq %cl, %rsi, %rdi
69; HYBRID-NEXT:    movq %rdi, 24(%rax)
70; HYBRID-NEXT:    movq -40(%rsp,%rdx), %rdi
71; HYBRID-NEXT:    movq -32(%rsp,%rdx), %rdx
72; HYBRID-NEXT:    movq %rdx, %r8
73; HYBRID-NEXT:    shldq %cl, %rdi, %r8
74; HYBRID-NEXT:    movq %r8, 8(%rax)
75; HYBRID-NEXT:    shlq %cl, %rdi
76; HYBRID-NEXT:    movq %rdi, (%rax)
77; HYBRID-NEXT:    shlq %cl, %rsi
78; HYBRID-NEXT:    notb %cl
79; HYBRID-NEXT:    shrq %rdx
80; HYBRID-NEXT:    # kill: def $cl killed $cl killed $ecx
81; HYBRID-NEXT:    shrq %cl, %rdx
82; HYBRID-NEXT:    orq %rsi, %rdx
83; HYBRID-NEXT:    movq %rdx, 16(%rax)
84; HYBRID-NEXT:    retq
85;
86; BURR-LABEL: test1:
87; BURR:       # %bb.0:
88; BURR-NEXT:    movq %rdi, %rax
89; BURR-NEXT:    xorps %xmm0, %xmm0
90; BURR-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
91; BURR-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
92; BURR-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
93; BURR-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
94; BURR-NEXT:    movq $1, -{{[0-9]+}}(%rsp)
95; BURR-NEXT:    leal (%rsi,%rsi), %ecx
96; BURR-NEXT:    addb $3, %cl
97; BURR-NEXT:    movl %ecx, %edx
98; BURR-NEXT:    shrb $3, %dl
99; BURR-NEXT:    andb $24, %dl
100; BURR-NEXT:    negb %dl
101; BURR-NEXT:    movsbq %dl, %rdx
102; BURR-NEXT:    movq -24(%rsp,%rdx), %rsi
103; BURR-NEXT:    movq -16(%rsp,%rdx), %rdi
104; BURR-NEXT:    shldq %cl, %rsi, %rdi
105; BURR-NEXT:    movq %rdi, 24(%rax)
106; BURR-NEXT:    movq -40(%rsp,%rdx), %rdi
107; BURR-NEXT:    movq -32(%rsp,%rdx), %rdx
108; BURR-NEXT:    movq %rdx, %r8
109; BURR-NEXT:    shldq %cl, %rdi, %r8
110; BURR-NEXT:    movq %r8, 8(%rax)
111; BURR-NEXT:    shlq %cl, %rdi
112; BURR-NEXT:    movq %rdi, (%rax)
113; BURR-NEXT:    shlq %cl, %rsi
114; BURR-NEXT:    notb %cl
115; BURR-NEXT:    shrq %rdx
116; BURR-NEXT:    # kill: def $cl killed $cl killed $ecx
117; BURR-NEXT:    shrq %cl, %rdx
118; BURR-NEXT:    orq %rsi, %rdx
119; BURR-NEXT:    movq %rdx, 16(%rax)
120; BURR-NEXT:    retq
121;
122; SRC-LABEL: test1:
123; SRC:       # %bb.0:
124; SRC-NEXT:    movq %rdi, %rax
125; SRC-NEXT:    leal (%rsi,%rsi), %edx
126; SRC-NEXT:    addb $3, %dl
127; SRC-NEXT:    xorps %xmm0, %xmm0
128; SRC-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
129; SRC-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
130; SRC-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
131; SRC-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
132; SRC-NEXT:    movq $1, -{{[0-9]+}}(%rsp)
133; SRC-NEXT:    movl %edx, %ecx
134; SRC-NEXT:    shrb $3, %cl
135; SRC-NEXT:    andb $24, %cl
136; SRC-NEXT:    negb %cl
137; SRC-NEXT:    movsbq %cl, %rsi
138; SRC-NEXT:    movq -24(%rsp,%rsi), %rdi
139; SRC-NEXT:    movq %rdi, %r8
140; SRC-NEXT:    movl %edx, %ecx
141; SRC-NEXT:    shlq %cl, %r8
142; SRC-NEXT:    notb %cl
143; SRC-NEXT:    movq -40(%rsp,%rsi), %r9
144; SRC-NEXT:    movq -32(%rsp,%rsi), %r10
145; SRC-NEXT:    movq %r10, %r11
146; SRC-NEXT:    shrq %r11
147; SRC-NEXT:    shrq %cl, %r11
148; SRC-NEXT:    orq %r8, %r11
149; SRC-NEXT:    movq -16(%rsp,%rsi), %rsi
150; SRC-NEXT:    movl %edx, %ecx
151; SRC-NEXT:    shldq %cl, %rdi, %rsi
152; SRC-NEXT:    movq %r9, %rdi
153; SRC-NEXT:    shlq %cl, %rdi
154; SRC-NEXT:    shldq %cl, %r9, %r10
155; SRC-NEXT:    movq %rsi, 24(%rax)
156; SRC-NEXT:    movq %r10, 8(%rax)
157; SRC-NEXT:    movq %rdi, (%rax)
158; SRC-NEXT:    movq %r11, 16(%rax)
159; SRC-NEXT:    retq
160;
161; LIN-LABEL: test1:
162; LIN:       # %bb.0:
163; LIN-NEXT:    movq %rdi, %rax
164; LIN-NEXT:    leal (%rsi,%rsi), %edx
165; LIN-NEXT:    addb $3, %dl
166; LIN-NEXT:    movl %edx, %ecx
167; LIN-NEXT:    shrb $3, %cl
168; LIN-NEXT:    andb $24, %cl
169; LIN-NEXT:    negb %cl
170; LIN-NEXT:    movsbq %cl, %rsi
171; LIN-NEXT:    xorps %xmm0, %xmm0
172; LIN-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
173; LIN-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
174; LIN-NEXT:    movq $1, -{{[0-9]+}}(%rsp)
175; LIN-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
176; LIN-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
177; LIN-NEXT:    movq -40(%rsp,%rsi), %rdi
178; LIN-NEXT:    movq %rdi, %r8
179; LIN-NEXT:    movl %edx, %ecx
180; LIN-NEXT:    shlq %cl, %r8
181; LIN-NEXT:    movq %r8, (%rax)
182; LIN-NEXT:    movq -32(%rsp,%rsi), %r8
183; LIN-NEXT:    movq %r8, %r9
184; LIN-NEXT:    shldq %cl, %rdi, %r9
185; LIN-NEXT:    movq %r9, 8(%rax)
186; LIN-NEXT:    movq -24(%rsp,%rsi), %rdi
187; LIN-NEXT:    movq %rdi, %r9
188; LIN-NEXT:    shlq %cl, %r9
189; LIN-NEXT:    shrq %r8
190; LIN-NEXT:    notb %cl
191; LIN-NEXT:    shrq %cl, %r8
192; LIN-NEXT:    orq %r9, %r8
193; LIN-NEXT:    movq %r8, 16(%rax)
194; LIN-NEXT:    movq -16(%rsp,%rsi), %rsi
195; LIN-NEXT:    movl %edx, %ecx
196; LIN-NEXT:    shldq %cl, %rdi, %rsi
197; LIN-NEXT:    movq %rsi, 24(%rax)
198; LIN-NEXT:    retq
199  %b = add i256 %a, 1
200  %m = shl i256 %b, 1
201  %p = add i256 %m, 1
202  %v = lshr i256 %b, %p
203  %t = trunc i256 %v to i1
204  %c = shl i256 1, %p
205  %f = select i1 %t, i256 undef, i256 %c
206  ret i256 %f
207}
208
209define i256 @test2(i256 %a) nounwind {
210; ILP-LABEL: test2:
211; ILP:       # %bb.0:
212; ILP-NEXT:    movq %rdi, %rax
213; ILP-NEXT:    xorps %xmm0, %xmm0
214; ILP-NEXT:    movaps %xmm0, 16(%rdi)
215; ILP-NEXT:    xorl %edi, %edi
216; ILP-NEXT:    movq %rsi, %r11
217; ILP-NEXT:    negq %r11
218; ILP-NEXT:    movl $0, %r10d
219; ILP-NEXT:    sbbq %rdx, %r10
220; ILP-NEXT:    movl $0, %r9d
221; ILP-NEXT:    sbbq %rcx, %r9
222; ILP-NEXT:    sbbq %r8, %rdi
223; ILP-NEXT:    andq %r8, %rdi
224; ILP-NEXT:    bsrq %rdi, %r8
225; ILP-NEXT:    andq %rdx, %r10
226; ILP-NEXT:    bsrq %r10, %rdx
227; ILP-NEXT:    xorq $63, %r8
228; ILP-NEXT:    andq %rcx, %r9
229; ILP-NEXT:    bsrq %r9, %rcx
230; ILP-NEXT:    xorq $63, %rcx
231; ILP-NEXT:    orq $64, %rcx
232; ILP-NEXT:    testq %rdi, %rdi
233; ILP-NEXT:    cmovneq %r8, %rcx
234; ILP-NEXT:    xorq $63, %rdx
235; ILP-NEXT:    andq %rsi, %r11
236; ILP-NEXT:    movl $127, %esi
237; ILP-NEXT:    bsrq %r11, %rsi
238; ILP-NEXT:    xorq $63, %rsi
239; ILP-NEXT:    addq $64, %rsi
240; ILP-NEXT:    testq %r10, %r10
241; ILP-NEXT:    cmovneq %rdx, %rsi
242; ILP-NEXT:    subq $-128, %rsi
243; ILP-NEXT:    orq %rdi, %r9
244; ILP-NEXT:    cmovneq %rcx, %rsi
245; ILP-NEXT:    movq %rsi, (%rax)
246; ILP-NEXT:    movq $0, 8(%rax)
247; ILP-NEXT:    retq
248;
249; HYBRID-LABEL: test2:
250; HYBRID:       # %bb.0:
251; HYBRID-NEXT:    movq %rdi, %rax
252; HYBRID-NEXT:    xorps %xmm0, %xmm0
253; HYBRID-NEXT:    movaps %xmm0, 16(%rdi)
254; HYBRID-NEXT:    xorl %edi, %edi
255; HYBRID-NEXT:    movq %rsi, %r11
256; HYBRID-NEXT:    negq %r11
257; HYBRID-NEXT:    movl $0, %r10d
258; HYBRID-NEXT:    sbbq %rdx, %r10
259; HYBRID-NEXT:    movl $0, %r9d
260; HYBRID-NEXT:    sbbq %rcx, %r9
261; HYBRID-NEXT:    sbbq %r8, %rdi
262; HYBRID-NEXT:    andq %r8, %rdi
263; HYBRID-NEXT:    bsrq %rdi, %r8
264; HYBRID-NEXT:    xorq $63, %r8
265; HYBRID-NEXT:    andq %rcx, %r9
266; HYBRID-NEXT:    bsrq %r9, %rcx
267; HYBRID-NEXT:    xorq $63, %rcx
268; HYBRID-NEXT:    orq $64, %rcx
269; HYBRID-NEXT:    testq %rdi, %rdi
270; HYBRID-NEXT:    cmovneq %r8, %rcx
271; HYBRID-NEXT:    andq %rdx, %r10
272; HYBRID-NEXT:    bsrq %r10, %rdx
273; HYBRID-NEXT:    xorq $63, %rdx
274; HYBRID-NEXT:    andq %rsi, %r11
275; HYBRID-NEXT:    movl $127, %esi
276; HYBRID-NEXT:    bsrq %r11, %rsi
277; HYBRID-NEXT:    xorq $63, %rsi
278; HYBRID-NEXT:    addq $64, %rsi
279; HYBRID-NEXT:    testq %r10, %r10
280; HYBRID-NEXT:    cmovneq %rdx, %rsi
281; HYBRID-NEXT:    subq $-128, %rsi
282; HYBRID-NEXT:    orq %rdi, %r9
283; HYBRID-NEXT:    cmovneq %rcx, %rsi
284; HYBRID-NEXT:    movq %rsi, (%rax)
285; HYBRID-NEXT:    movq $0, 8(%rax)
286; HYBRID-NEXT:    retq
287;
288; BURR-LABEL: test2:
289; BURR:       # %bb.0:
290; BURR-NEXT:    movq %rdi, %rax
291; BURR-NEXT:    xorps %xmm0, %xmm0
292; BURR-NEXT:    movaps %xmm0, 16(%rdi)
293; BURR-NEXT:    xorl %edi, %edi
294; BURR-NEXT:    movq %rsi, %r11
295; BURR-NEXT:    negq %r11
296; BURR-NEXT:    movl $0, %r10d
297; BURR-NEXT:    sbbq %rdx, %r10
298; BURR-NEXT:    movl $0, %r9d
299; BURR-NEXT:    sbbq %rcx, %r9
300; BURR-NEXT:    sbbq %r8, %rdi
301; BURR-NEXT:    andq %r8, %rdi
302; BURR-NEXT:    bsrq %rdi, %r8
303; BURR-NEXT:    xorq $63, %r8
304; BURR-NEXT:    andq %rcx, %r9
305; BURR-NEXT:    bsrq %r9, %rcx
306; BURR-NEXT:    xorq $63, %rcx
307; BURR-NEXT:    orq $64, %rcx
308; BURR-NEXT:    testq %rdi, %rdi
309; BURR-NEXT:    cmovneq %r8, %rcx
310; BURR-NEXT:    andq %rdx, %r10
311; BURR-NEXT:    bsrq %r10, %rdx
312; BURR-NEXT:    xorq $63, %rdx
313; BURR-NEXT:    andq %rsi, %r11
314; BURR-NEXT:    movl $127, %esi
315; BURR-NEXT:    bsrq %r11, %rsi
316; BURR-NEXT:    xorq $63, %rsi
317; BURR-NEXT:    addq $64, %rsi
318; BURR-NEXT:    testq %r10, %r10
319; BURR-NEXT:    cmovneq %rdx, %rsi
320; BURR-NEXT:    subq $-128, %rsi
321; BURR-NEXT:    orq %rdi, %r9
322; BURR-NEXT:    cmovneq %rcx, %rsi
323; BURR-NEXT:    movq %rsi, (%rax)
324; BURR-NEXT:    movq $0, 8(%rax)
325; BURR-NEXT:    retq
326;
327; SRC-LABEL: test2:
328; SRC:       # %bb.0:
329; SRC-NEXT:    movq %rdi, %rax
330; SRC-NEXT:    xorl %edi, %edi
331; SRC-NEXT:    movq %rsi, %r11
332; SRC-NEXT:    negq %r11
333; SRC-NEXT:    movl $0, %r10d
334; SRC-NEXT:    sbbq %rdx, %r10
335; SRC-NEXT:    movl $0, %r9d
336; SRC-NEXT:    sbbq %rcx, %r9
337; SRC-NEXT:    sbbq %r8, %rdi
338; SRC-NEXT:    andq %rdx, %r10
339; SRC-NEXT:    andq %rcx, %r9
340; SRC-NEXT:    andq %r8, %rdi
341; SRC-NEXT:    andq %rsi, %r11
342; SRC-NEXT:    bsrq %rdi, %rcx
343; SRC-NEXT:    xorq $63, %rcx
344; SRC-NEXT:    bsrq %r9, %rdx
345; SRC-NEXT:    xorq $63, %rdx
346; SRC-NEXT:    orq $64, %rdx
347; SRC-NEXT:    testq %rdi, %rdi
348; SRC-NEXT:    cmovneq %rcx, %rdx
349; SRC-NEXT:    bsrq %r10, %rcx
350; SRC-NEXT:    xorq $63, %rcx
351; SRC-NEXT:    movl $127, %esi
352; SRC-NEXT:    bsrq %r11, %rsi
353; SRC-NEXT:    xorq $63, %rsi
354; SRC-NEXT:    addq $64, %rsi
355; SRC-NEXT:    testq %r10, %r10
356; SRC-NEXT:    cmovneq %rcx, %rsi
357; SRC-NEXT:    subq $-128, %rsi
358; SRC-NEXT:    orq %r9, %rdi
359; SRC-NEXT:    cmovneq %rdx, %rsi
360; SRC-NEXT:    xorps %xmm0, %xmm0
361; SRC-NEXT:    movaps %xmm0, 16(%rax)
362; SRC-NEXT:    movq %rsi, (%rax)
363; SRC-NEXT:    movq $0, 8(%rax)
364; SRC-NEXT:    retq
365;
366; LIN-LABEL: test2:
367; LIN:       # %bb.0:
368; LIN-NEXT:    movq %rdi, %rax
369; LIN-NEXT:    xorps %xmm0, %xmm0
370; LIN-NEXT:    movaps %xmm0, 16(%rdi)
371; LIN-NEXT:    movl $127, %edi
372; LIN-NEXT:    movq %rsi, %r9
373; LIN-NEXT:    negq %r9
374; LIN-NEXT:    andq %rsi, %r9
375; LIN-NEXT:    bsrq %r9, %rdi
376; LIN-NEXT:    xorq $63, %rdi
377; LIN-NEXT:    addq $64, %rdi
378; LIN-NEXT:    xorl %esi, %esi
379; LIN-NEXT:    movl $0, %r9d
380; LIN-NEXT:    sbbq %rdx, %r9
381; LIN-NEXT:    andq %rdx, %r9
382; LIN-NEXT:    bsrq %r9, %rdx
383; LIN-NEXT:    xorq $63, %rdx
384; LIN-NEXT:    testq %r9, %r9
385; LIN-NEXT:    cmoveq %rdi, %rdx
386; LIN-NEXT:    subq $-128, %rdx
387; LIN-NEXT:    movl $0, %edi
388; LIN-NEXT:    sbbq %rcx, %rdi
389; LIN-NEXT:    andq %rcx, %rdi
390; LIN-NEXT:    bsrq %rdi, %rcx
391; LIN-NEXT:    xorq $63, %rcx
392; LIN-NEXT:    orq $64, %rcx
393; LIN-NEXT:    sbbq %r8, %rsi
394; LIN-NEXT:    andq %r8, %rsi
395; LIN-NEXT:    bsrq %rsi, %r8
396; LIN-NEXT:    xorq $63, %r8
397; LIN-NEXT:    testq %rsi, %rsi
398; LIN-NEXT:    cmoveq %rcx, %r8
399; LIN-NEXT:    orq %rdi, %rsi
400; LIN-NEXT:    cmoveq %rdx, %r8
401; LIN-NEXT:    movq %r8, (%rax)
402; LIN-NEXT:    movq $0, 8(%rax)
403; LIN-NEXT:    retq
404  %b = sub i256 0, %a
405  %c = and i256 %b, %a
406  %d = call i256 @llvm.ctlz.i256(i256 %c, i1 false)
407  ret i256 %d
408}
409
410define i256 @test3(i256 %n) nounwind {
411; ILP-LABEL: test3:
412; ILP:       # %bb.0:
413; ILP-NEXT:    movq %rdi, %rax
414; ILP-NEXT:    xorps %xmm0, %xmm0
415; ILP-NEXT:    movaps %xmm0, 16(%rdi)
416; ILP-NEXT:    xorl %r9d, %r9d
417; ILP-NEXT:    movq %rsi, %rdi
418; ILP-NEXT:    negq %rdi
419; ILP-NEXT:    movl $0, %r10d
420; ILP-NEXT:    sbbq %rdx, %r10
421; ILP-NEXT:    movl $0, %r11d
422; ILP-NEXT:    sbbq %rcx, %r11
423; ILP-NEXT:    sbbq %r8, %r9
424; ILP-NEXT:    notq %r8
425; ILP-NEXT:    andq %r9, %r8
426; ILP-NEXT:    bsrq %r8, %r9
427; ILP-NEXT:    notq %rdx
428; ILP-NEXT:    andq %r10, %rdx
429; ILP-NEXT:    bsrq %rdx, %r10
430; ILP-NEXT:    xorq $63, %r9
431; ILP-NEXT:    notq %rcx
432; ILP-NEXT:    andq %r11, %rcx
433; ILP-NEXT:    bsrq %rcx, %r11
434; ILP-NEXT:    xorq $63, %r11
435; ILP-NEXT:    orq $64, %r11
436; ILP-NEXT:    testq %r8, %r8
437; ILP-NEXT:    cmovneq %r9, %r11
438; ILP-NEXT:    xorq $63, %r10
439; ILP-NEXT:    notq %rsi
440; ILP-NEXT:    andq %rdi, %rsi
441; ILP-NEXT:    movl $127, %edi
442; ILP-NEXT:    bsrq %rsi, %rdi
443; ILP-NEXT:    xorq $63, %rdi
444; ILP-NEXT:    addq $64, %rdi
445; ILP-NEXT:    testq %rdx, %rdx
446; ILP-NEXT:    cmovneq %r10, %rdi
447; ILP-NEXT:    subq $-128, %rdi
448; ILP-NEXT:    orq %r8, %rcx
449; ILP-NEXT:    cmovneq %r11, %rdi
450; ILP-NEXT:    movq %rdi, (%rax)
451; ILP-NEXT:    movq $0, 8(%rax)
452; ILP-NEXT:    retq
453;
454; HYBRID-LABEL: test3:
455; HYBRID:       # %bb.0:
456; HYBRID-NEXT:    pushq %rbx
457; HYBRID-NEXT:    movq %rdi, %rax
458; HYBRID-NEXT:    xorps %xmm0, %xmm0
459; HYBRID-NEXT:    movaps %xmm0, 16(%rdi)
460; HYBRID-NEXT:    xorl %r9d, %r9d
461; HYBRID-NEXT:    movq %rsi, %rdi
462; HYBRID-NEXT:    negq %rdi
463; HYBRID-NEXT:    movl $0, %r10d
464; HYBRID-NEXT:    sbbq %rdx, %r10
465; HYBRID-NEXT:    movl $0, %r11d
466; HYBRID-NEXT:    sbbq %rcx, %r11
467; HYBRID-NEXT:    sbbq %r8, %r9
468; HYBRID-NEXT:    notq %r8
469; HYBRID-NEXT:    andq %r9, %r8
470; HYBRID-NEXT:    bsrq %r8, %rbx
471; HYBRID-NEXT:    xorq $63, %rbx
472; HYBRID-NEXT:    notq %rcx
473; HYBRID-NEXT:    andq %r11, %rcx
474; HYBRID-NEXT:    bsrq %rcx, %r9
475; HYBRID-NEXT:    xorq $63, %r9
476; HYBRID-NEXT:    orq $64, %r9
477; HYBRID-NEXT:    testq %r8, %r8
478; HYBRID-NEXT:    cmovneq %rbx, %r9
479; HYBRID-NEXT:    notq %rdx
480; HYBRID-NEXT:    andq %r10, %rdx
481; HYBRID-NEXT:    bsrq %rdx, %r10
482; HYBRID-NEXT:    xorq $63, %r10
483; HYBRID-NEXT:    notq %rsi
484; HYBRID-NEXT:    andq %rdi, %rsi
485; HYBRID-NEXT:    movl $127, %edi
486; HYBRID-NEXT:    bsrq %rsi, %rdi
487; HYBRID-NEXT:    xorq $63, %rdi
488; HYBRID-NEXT:    addq $64, %rdi
489; HYBRID-NEXT:    testq %rdx, %rdx
490; HYBRID-NEXT:    cmovneq %r10, %rdi
491; HYBRID-NEXT:    subq $-128, %rdi
492; HYBRID-NEXT:    orq %r8, %rcx
493; HYBRID-NEXT:    cmovneq %r9, %rdi
494; HYBRID-NEXT:    movq %rdi, (%rax)
495; HYBRID-NEXT:    movq $0, 8(%rax)
496; HYBRID-NEXT:    popq %rbx
497; HYBRID-NEXT:    retq
498;
499; BURR-LABEL: test3:
500; BURR:       # %bb.0:
501; BURR-NEXT:    pushq %rbx
502; BURR-NEXT:    movq %rdi, %rax
503; BURR-NEXT:    xorps %xmm0, %xmm0
504; BURR-NEXT:    movaps %xmm0, 16(%rdi)
505; BURR-NEXT:    xorl %r9d, %r9d
506; BURR-NEXT:    movq %rsi, %rdi
507; BURR-NEXT:    negq %rdi
508; BURR-NEXT:    movl $0, %r10d
509; BURR-NEXT:    sbbq %rdx, %r10
510; BURR-NEXT:    movl $0, %r11d
511; BURR-NEXT:    sbbq %rcx, %r11
512; BURR-NEXT:    sbbq %r8, %r9
513; BURR-NEXT:    notq %r8
514; BURR-NEXT:    andq %r9, %r8
515; BURR-NEXT:    bsrq %r8, %rbx
516; BURR-NEXT:    xorq $63, %rbx
517; BURR-NEXT:    notq %rcx
518; BURR-NEXT:    andq %r11, %rcx
519; BURR-NEXT:    bsrq %rcx, %r9
520; BURR-NEXT:    xorq $63, %r9
521; BURR-NEXT:    orq $64, %r9
522; BURR-NEXT:    testq %r8, %r8
523; BURR-NEXT:    cmovneq %rbx, %r9
524; BURR-NEXT:    notq %rdx
525; BURR-NEXT:    andq %r10, %rdx
526; BURR-NEXT:    bsrq %rdx, %r10
527; BURR-NEXT:    xorq $63, %r10
528; BURR-NEXT:    notq %rsi
529; BURR-NEXT:    andq %rdi, %rsi
530; BURR-NEXT:    movl $127, %edi
531; BURR-NEXT:    bsrq %rsi, %rdi
532; BURR-NEXT:    xorq $63, %rdi
533; BURR-NEXT:    addq $64, %rdi
534; BURR-NEXT:    testq %rdx, %rdx
535; BURR-NEXT:    cmovneq %r10, %rdi
536; BURR-NEXT:    subq $-128, %rdi
537; BURR-NEXT:    orq %r8, %rcx
538; BURR-NEXT:    cmovneq %r9, %rdi
539; BURR-NEXT:    movq %rdi, (%rax)
540; BURR-NEXT:    movq $0, 8(%rax)
541; BURR-NEXT:    popq %rbx
542; BURR-NEXT:    retq
543;
544; SRC-LABEL: test3:
545; SRC:       # %bb.0:
546; SRC-NEXT:    movq %rdi, %rax
547; SRC-NEXT:    movq %rsi, %rdi
548; SRC-NEXT:    notq %rdi
549; SRC-NEXT:    xorl %r9d, %r9d
550; SRC-NEXT:    negq %rsi
551; SRC-NEXT:    movl $0, %r10d
552; SRC-NEXT:    sbbq %rdx, %r10
553; SRC-NEXT:    notq %rdx
554; SRC-NEXT:    movl $0, %r11d
555; SRC-NEXT:    sbbq %rcx, %r11
556; SRC-NEXT:    notq %rcx
557; SRC-NEXT:    sbbq %r8, %r9
558; SRC-NEXT:    notq %r8
559; SRC-NEXT:    andq %r10, %rdx
560; SRC-NEXT:    andq %r11, %rcx
561; SRC-NEXT:    andq %r9, %r8
562; SRC-NEXT:    andq %rdi, %rsi
563; SRC-NEXT:    bsrq %r8, %rdi
564; SRC-NEXT:    xorq $63, %rdi
565; SRC-NEXT:    bsrq %rcx, %r9
566; SRC-NEXT:    xorq $63, %r9
567; SRC-NEXT:    orq $64, %r9
568; SRC-NEXT:    testq %r8, %r8
569; SRC-NEXT:    cmovneq %rdi, %r9
570; SRC-NEXT:    bsrq %rdx, %rdi
571; SRC-NEXT:    xorq $63, %rdi
572; SRC-NEXT:    movl $127, %r10d
573; SRC-NEXT:    bsrq %rsi, %r10
574; SRC-NEXT:    xorq $63, %r10
575; SRC-NEXT:    addq $64, %r10
576; SRC-NEXT:    testq %rdx, %rdx
577; SRC-NEXT:    cmovneq %rdi, %r10
578; SRC-NEXT:    subq $-128, %r10
579; SRC-NEXT:    orq %rcx, %r8
580; SRC-NEXT:    cmovneq %r9, %r10
581; SRC-NEXT:    xorps %xmm0, %xmm0
582; SRC-NEXT:    movaps %xmm0, 16(%rax)
583; SRC-NEXT:    movq %r10, (%rax)
584; SRC-NEXT:    movq $0, 8(%rax)
585; SRC-NEXT:    retq
586;
587; LIN-LABEL: test3:
588; LIN:       # %bb.0:
589; LIN-NEXT:    movq %rdi, %rax
590; LIN-NEXT:    xorps %xmm0, %xmm0
591; LIN-NEXT:    movaps %xmm0, 16(%rdi)
592; LIN-NEXT:    movl $127, %r9d
593; LIN-NEXT:    movq %rsi, %rdi
594; LIN-NEXT:    negq %rdi
595; LIN-NEXT:    notq %rsi
596; LIN-NEXT:    andq %rdi, %rsi
597; LIN-NEXT:    bsrq %rsi, %r9
598; LIN-NEXT:    xorq $63, %r9
599; LIN-NEXT:    addq $64, %r9
600; LIN-NEXT:    xorl %edi, %edi
601; LIN-NEXT:    movl $0, %esi
602; LIN-NEXT:    sbbq %rdx, %rsi
603; LIN-NEXT:    notq %rdx
604; LIN-NEXT:    andq %rsi, %rdx
605; LIN-NEXT:    bsrq %rdx, %rsi
606; LIN-NEXT:    xorq $63, %rsi
607; LIN-NEXT:    testq %rdx, %rdx
608; LIN-NEXT:    cmoveq %r9, %rsi
609; LIN-NEXT:    subq $-128, %rsi
610; LIN-NEXT:    movl $0, %edx
611; LIN-NEXT:    sbbq %rcx, %rdx
612; LIN-NEXT:    notq %rcx
613; LIN-NEXT:    andq %rdx, %rcx
614; LIN-NEXT:    bsrq %rcx, %rdx
615; LIN-NEXT:    xorq $63, %rdx
616; LIN-NEXT:    orq $64, %rdx
617; LIN-NEXT:    sbbq %r8, %rdi
618; LIN-NEXT:    notq %r8
619; LIN-NEXT:    andq %rdi, %r8
620; LIN-NEXT:    bsrq %r8, %rdi
621; LIN-NEXT:    xorq $63, %rdi
622; LIN-NEXT:    testq %r8, %r8
623; LIN-NEXT:    cmoveq %rdx, %rdi
624; LIN-NEXT:    orq %rcx, %r8
625; LIN-NEXT:    cmoveq %rsi, %rdi
626; LIN-NEXT:    movq %rdi, (%rax)
627; LIN-NEXT:    movq $0, 8(%rax)
628; LIN-NEXT:    retq
629  %m = sub i256 -1, %n
630  %x = sub i256 0, %n
631  %y = and i256 %x, %m
632  %z = call i256 @llvm.ctlz.i256(i256 %y, i1 false)
633  ret i256 %z
634}
635
636declare i256 @llvm.ctlz.i256(i256, i1) nounwind readnone
637
638define i64 @test4(i64 %a, i64 %b) nounwind {
639; ILP-LABEL: test4:
640; ILP:       # %bb.0:
641; ILP-NEXT:    xorl %eax, %eax
642; ILP-NEXT:    xorl %ecx, %ecx
643; ILP-NEXT:    incq %rsi
644; ILP-NEXT:    sete %cl
645; ILP-NEXT:    cmpq %rdi, %rsi
646; ILP-NEXT:    sbbq $0, %rcx
647; ILP-NEXT:    movl $0, %ecx
648; ILP-NEXT:    sbbq %rcx, %rcx
649; ILP-NEXT:    movl $0, %ecx
650; ILP-NEXT:    sbbq %rcx, %rcx
651; ILP-NEXT:    adcq $1, %rax
652; ILP-NEXT:    retq
653;
654; HYBRID-LABEL: test4:
655; HYBRID:       # %bb.0:
656; HYBRID-NEXT:    xorl %eax, %eax
657; HYBRID-NEXT:    xorl %ecx, %ecx
658; HYBRID-NEXT:    incq %rsi
659; HYBRID-NEXT:    sete %cl
660; HYBRID-NEXT:    cmpq %rdi, %rsi
661; HYBRID-NEXT:    sbbq $0, %rcx
662; HYBRID-NEXT:    movl $0, %ecx
663; HYBRID-NEXT:    sbbq %rcx, %rcx
664; HYBRID-NEXT:    movl $0, %ecx
665; HYBRID-NEXT:    sbbq %rcx, %rcx
666; HYBRID-NEXT:    adcq $1, %rax
667; HYBRID-NEXT:    retq
668;
669; BURR-LABEL: test4:
670; BURR:       # %bb.0:
671; BURR-NEXT:    xorl %eax, %eax
672; BURR-NEXT:    xorl %ecx, %ecx
673; BURR-NEXT:    incq %rsi
674; BURR-NEXT:    sete %cl
675; BURR-NEXT:    cmpq %rdi, %rsi
676; BURR-NEXT:    sbbq $0, %rcx
677; BURR-NEXT:    movl $0, %ecx
678; BURR-NEXT:    sbbq %rcx, %rcx
679; BURR-NEXT:    movl $0, %ecx
680; BURR-NEXT:    sbbq %rcx, %rcx
681; BURR-NEXT:    adcq $1, %rax
682; BURR-NEXT:    retq
683;
684; SRC-LABEL: test4:
685; SRC:       # %bb.0:
686; SRC-NEXT:    xorl %ecx, %ecx
687; SRC-NEXT:    incq %rsi
688; SRC-NEXT:    sete %cl
689; SRC-NEXT:    xorl %eax, %eax
690; SRC-NEXT:    cmpq %rdi, %rsi
691; SRC-NEXT:    sbbq $0, %rcx
692; SRC-NEXT:    movl $0, %ecx
693; SRC-NEXT:    sbbq %rcx, %rcx
694; SRC-NEXT:    movl $0, %ecx
695; SRC-NEXT:    sbbq %rcx, %rcx
696; SRC-NEXT:    adcq $1, %rax
697; SRC-NEXT:    retq
698;
699; LIN-LABEL: test4:
700; LIN:       # %bb.0:
701; LIN-NEXT:    xorl %eax, %eax
702; LIN-NEXT:    xorl %ecx, %ecx
703; LIN-NEXT:    incq %rsi
704; LIN-NEXT:    sete %cl
705; LIN-NEXT:    cmpq %rdi, %rsi
706; LIN-NEXT:    sbbq $0, %rcx
707; LIN-NEXT:    movl $0, %ecx
708; LIN-NEXT:    sbbq %rcx, %rcx
709; LIN-NEXT:    movl $0, %ecx
710; LIN-NEXT:    sbbq %rcx, %rcx
711; LIN-NEXT:    adcq $1, %rax
712; LIN-NEXT:    retq
713  %r = zext i64 %b to i256
714  %u = add i256 %r, 1
715  %w = and i256 %u, 1461501637330902918203684832716283019655932542975
716  %x = zext i64 %a to i256
717  %c = icmp uge i256 %w, %x
718  %y = select i1 %c, i64 0, i64 1
719  %z = add i64 %y, 1
720  ret i64 %z
721}
722
723define i256 @PR25498(i256 %a) nounwind {
724; ILP-LABEL: PR25498:
725; ILP:       # %bb.0:
726; ILP-NEXT:    pushq %rbx
727; ILP-NEXT:    movq %rdi, %rax
728; ILP-NEXT:    xorl %edi, %edi
729; ILP-NEXT:    movq %rsi, %rbx
730; ILP-NEXT:    negq %rbx
731; ILP-NEXT:    movl $0, %r11d
732; ILP-NEXT:    sbbq %rdx, %r11
733; ILP-NEXT:    movl $0, %r9d
734; ILP-NEXT:    sbbq %rcx, %r9
735; ILP-NEXT:    movl $0, %r10d
736; ILP-NEXT:    sbbq %r8, %r10
737; ILP-NEXT:    orq %r8, %rdx
738; ILP-NEXT:    orq %rcx, %rsi
739; ILP-NEXT:    orq %rdx, %rsi
740; ILP-NEXT:    je .LBB4_1
741; ILP-NEXT:  # %bb.2: # %cond.false
742; ILP-NEXT:    bsrq %r11, %rdx
743; ILP-NEXT:    bsrq %r10, %rcx
744; ILP-NEXT:    xorq $63, %rcx
745; ILP-NEXT:    bsrq %r9, %rsi
746; ILP-NEXT:    xorq $63, %rsi
747; ILP-NEXT:    orq $64, %rsi
748; ILP-NEXT:    testq %r10, %r10
749; ILP-NEXT:    cmovneq %rcx, %rsi
750; ILP-NEXT:    xorq $63, %rdx
751; ILP-NEXT:    bsrq %rbx, %rcx
752; ILP-NEXT:    xorq $63, %rcx
753; ILP-NEXT:    orq $64, %rcx
754; ILP-NEXT:    testq %r11, %r11
755; ILP-NEXT:    cmovneq %rdx, %rcx
756; ILP-NEXT:    orq $128, %rcx
757; ILP-NEXT:    xorl %edi, %edi
758; ILP-NEXT:    orq %r10, %r9
759; ILP-NEXT:    cmovneq %rsi, %rcx
760; ILP-NEXT:    jmp .LBB4_3
761; ILP-NEXT:  .LBB4_1:
762; ILP-NEXT:    movl $256, %ecx # imm = 0x100
763; ILP-NEXT:  .LBB4_3: # %cond.end
764; ILP-NEXT:    movq %rcx, (%rax)
765; ILP-NEXT:    movq %rdi, 8(%rax)
766; ILP-NEXT:    movq %rdi, 16(%rax)
767; ILP-NEXT:    movq %rdi, 24(%rax)
768; ILP-NEXT:    popq %rbx
769; ILP-NEXT:    retq
770;
771; HYBRID-LABEL: PR25498:
772; HYBRID:       # %bb.0:
773; HYBRID-NEXT:    pushq %rbx
774; HYBRID-NEXT:    movq %rdi, %rax
775; HYBRID-NEXT:    xorl %edi, %edi
776; HYBRID-NEXT:    movq %rsi, %rbx
777; HYBRID-NEXT:    negq %rbx
778; HYBRID-NEXT:    movl $0, %r11d
779; HYBRID-NEXT:    sbbq %rdx, %r11
780; HYBRID-NEXT:    movl $0, %r9d
781; HYBRID-NEXT:    sbbq %rcx, %r9
782; HYBRID-NEXT:    movl $0, %r10d
783; HYBRID-NEXT:    sbbq %r8, %r10
784; HYBRID-NEXT:    orq %r8, %rdx
785; HYBRID-NEXT:    orq %rcx, %rsi
786; HYBRID-NEXT:    orq %rdx, %rsi
787; HYBRID-NEXT:    je .LBB4_1
788; HYBRID-NEXT:  # %bb.2: # %cond.false
789; HYBRID-NEXT:    bsrq %r10, %rcx
790; HYBRID-NEXT:    xorq $63, %rcx
791; HYBRID-NEXT:    bsrq %r9, %rdx
792; HYBRID-NEXT:    xorq $63, %rdx
793; HYBRID-NEXT:    orq $64, %rdx
794; HYBRID-NEXT:    testq %r10, %r10
795; HYBRID-NEXT:    cmovneq %rcx, %rdx
796; HYBRID-NEXT:    bsrq %r11, %rsi
797; HYBRID-NEXT:    xorq $63, %rsi
798; HYBRID-NEXT:    bsrq %rbx, %rcx
799; HYBRID-NEXT:    xorq $63, %rcx
800; HYBRID-NEXT:    orq $64, %rcx
801; HYBRID-NEXT:    testq %r11, %r11
802; HYBRID-NEXT:    cmovneq %rsi, %rcx
803; HYBRID-NEXT:    orq $128, %rcx
804; HYBRID-NEXT:    orq %r10, %r9
805; HYBRID-NEXT:    cmovneq %rdx, %rcx
806; HYBRID-NEXT:    xorl %edi, %edi
807; HYBRID-NEXT:    jmp .LBB4_3
808; HYBRID-NEXT:  .LBB4_1:
809; HYBRID-NEXT:    movl $256, %ecx # imm = 0x100
810; HYBRID-NEXT:  .LBB4_3: # %cond.end
811; HYBRID-NEXT:    movq %rcx, (%rax)
812; HYBRID-NEXT:    movq %rdi, 8(%rax)
813; HYBRID-NEXT:    movq %rdi, 16(%rax)
814; HYBRID-NEXT:    movq %rdi, 24(%rax)
815; HYBRID-NEXT:    popq %rbx
816; HYBRID-NEXT:    retq
817;
818; BURR-LABEL: PR25498:
819; BURR:       # %bb.0:
820; BURR-NEXT:    pushq %rbx
821; BURR-NEXT:    movq %rdi, %rax
822; BURR-NEXT:    xorl %edi, %edi
823; BURR-NEXT:    movq %rsi, %rbx
824; BURR-NEXT:    negq %rbx
825; BURR-NEXT:    movl $0, %r11d
826; BURR-NEXT:    sbbq %rdx, %r11
827; BURR-NEXT:    movl $0, %r9d
828; BURR-NEXT:    sbbq %rcx, %r9
829; BURR-NEXT:    movl $0, %r10d
830; BURR-NEXT:    sbbq %r8, %r10
831; BURR-NEXT:    orq %r8, %rdx
832; BURR-NEXT:    orq %rcx, %rsi
833; BURR-NEXT:    orq %rdx, %rsi
834; BURR-NEXT:    je .LBB4_1
835; BURR-NEXT:  # %bb.2: # %cond.false
836; BURR-NEXT:    bsrq %r10, %rcx
837; BURR-NEXT:    xorq $63, %rcx
838; BURR-NEXT:    bsrq %r9, %rdx
839; BURR-NEXT:    xorq $63, %rdx
840; BURR-NEXT:    orq $64, %rdx
841; BURR-NEXT:    testq %r10, %r10
842; BURR-NEXT:    cmovneq %rcx, %rdx
843; BURR-NEXT:    bsrq %r11, %rsi
844; BURR-NEXT:    xorq $63, %rsi
845; BURR-NEXT:    bsrq %rbx, %rcx
846; BURR-NEXT:    xorq $63, %rcx
847; BURR-NEXT:    orq $64, %rcx
848; BURR-NEXT:    testq %r11, %r11
849; BURR-NEXT:    cmovneq %rsi, %rcx
850; BURR-NEXT:    orq $128, %rcx
851; BURR-NEXT:    orq %r10, %r9
852; BURR-NEXT:    cmovneq %rdx, %rcx
853; BURR-NEXT:    xorl %edi, %edi
854; BURR-NEXT:    jmp .LBB4_3
855; BURR-NEXT:  .LBB4_1:
856; BURR-NEXT:    movl $256, %ecx # imm = 0x100
857; BURR-NEXT:  .LBB4_3: # %cond.end
858; BURR-NEXT:    movq %rcx, (%rax)
859; BURR-NEXT:    movq %rdi, 8(%rax)
860; BURR-NEXT:    movq %rdi, 16(%rax)
861; BURR-NEXT:    movq %rdi, 24(%rax)
862; BURR-NEXT:    popq %rbx
863; BURR-NEXT:    retq
864;
865; SRC-LABEL: PR25498:
866; SRC:       # %bb.0:
867; SRC-NEXT:    pushq %rbx
868; SRC-NEXT:    movq %rdi, %rax
869; SRC-NEXT:    xorl %edi, %edi
870; SRC-NEXT:    movq %rsi, %rbx
871; SRC-NEXT:    negq %rbx
872; SRC-NEXT:    movl $0, %r11d
873; SRC-NEXT:    sbbq %rdx, %r11
874; SRC-NEXT:    movl $0, %r9d
875; SRC-NEXT:    sbbq %rcx, %r9
876; SRC-NEXT:    movl $0, %r10d
877; SRC-NEXT:    sbbq %r8, %r10
878; SRC-NEXT:    orq %r8, %rdx
879; SRC-NEXT:    orq %rcx, %rsi
880; SRC-NEXT:    orq %rdx, %rsi
881; SRC-NEXT:    je .LBB4_1
882; SRC-NEXT:  # %bb.2: # %cond.false
883; SRC-NEXT:    bsrq %r10, %rcx
884; SRC-NEXT:    xorq $63, %rcx
885; SRC-NEXT:    bsrq %r9, %rdx
886; SRC-NEXT:    xorq $63, %rdx
887; SRC-NEXT:    orq $64, %rdx
888; SRC-NEXT:    testq %r10, %r10
889; SRC-NEXT:    cmovneq %rcx, %rdx
890; SRC-NEXT:    bsrq %r11, %rsi
891; SRC-NEXT:    xorq $63, %rsi
892; SRC-NEXT:    bsrq %rbx, %rcx
893; SRC-NEXT:    xorq $63, %rcx
894; SRC-NEXT:    orq $64, %rcx
895; SRC-NEXT:    testq %r11, %r11
896; SRC-NEXT:    cmovneq %rsi, %rcx
897; SRC-NEXT:    orq $128, %rcx
898; SRC-NEXT:    orq %r10, %r9
899; SRC-NEXT:    cmovneq %rdx, %rcx
900; SRC-NEXT:    xorl %edi, %edi
901; SRC-NEXT:    jmp .LBB4_3
902; SRC-NEXT:  .LBB4_1:
903; SRC-NEXT:    movl $256, %ecx # imm = 0x100
904; SRC-NEXT:  .LBB4_3: # %cond.end
905; SRC-NEXT:    movq %rcx, (%rax)
906; SRC-NEXT:    movq %rdi, 8(%rax)
907; SRC-NEXT:    movq %rdi, 16(%rax)
908; SRC-NEXT:    movq %rdi, 24(%rax)
909; SRC-NEXT:    popq %rbx
910; SRC-NEXT:    retq
911;
912; LIN-LABEL: PR25498:
913; LIN:       # %bb.0:
914; LIN-NEXT:    pushq %rbx
915; LIN-NEXT:    movq %rdi, %rax
916; LIN-NEXT:    movq %rsi, %rbx
917; LIN-NEXT:    negq %rbx
918; LIN-NEXT:    xorl %edi, %edi
919; LIN-NEXT:    movl $0, %r11d
920; LIN-NEXT:    sbbq %rdx, %r11
921; LIN-NEXT:    movl $0, %r9d
922; LIN-NEXT:    sbbq %rcx, %r9
923; LIN-NEXT:    movl $0, %r10d
924; LIN-NEXT:    sbbq %r8, %r10
925; LIN-NEXT:    orq %rcx, %rsi
926; LIN-NEXT:    orq %r8, %rdx
927; LIN-NEXT:    orq %rsi, %rdx
928; LIN-NEXT:    je .LBB4_1
929; LIN-NEXT:  # %bb.2: # %cond.false
930; LIN-NEXT:    bsrq %rbx, %rcx
931; LIN-NEXT:    xorq $63, %rcx
932; LIN-NEXT:    orq $64, %rcx
933; LIN-NEXT:    bsrq %r11, %rdx
934; LIN-NEXT:    xorq $63, %rdx
935; LIN-NEXT:    testq %r11, %r11
936; LIN-NEXT:    cmoveq %rcx, %rdx
937; LIN-NEXT:    orq $128, %rdx
938; LIN-NEXT:    bsrq %r9, %rsi
939; LIN-NEXT:    xorq $63, %rsi
940; LIN-NEXT:    orq $64, %rsi
941; LIN-NEXT:    bsrq %r10, %rcx
942; LIN-NEXT:    xorq $63, %rcx
943; LIN-NEXT:    testq %r10, %r10
944; LIN-NEXT:    cmoveq %rsi, %rcx
945; LIN-NEXT:    orq %r10, %r9
946; LIN-NEXT:    cmoveq %rdx, %rcx
947; LIN-NEXT:    xorl %edi, %edi
948; LIN-NEXT:    jmp .LBB4_3
949; LIN-NEXT:  .LBB4_1:
950; LIN-NEXT:    movl $256, %ecx # imm = 0x100
951; LIN-NEXT:  .LBB4_3: # %cond.end
952; LIN-NEXT:    movq %rcx, (%rax)
953; LIN-NEXT:    movq %rdi, 8(%rax)
954; LIN-NEXT:    movq %rdi, 16(%rax)
955; LIN-NEXT:    movq %rdi, 24(%rax)
956; LIN-NEXT:    popq %rbx
957; LIN-NEXT:    retq
958  %b = sub i256 0, %a
959  %cmpz = icmp eq i256 %b, 0
960  br i1 %cmpz, label %cond.end, label %cond.false
961
962cond.false:
963  %d = call i256 @llvm.ctlz.i256(i256 %b, i1 true)
964  br label %cond.end
965
966cond.end:
967  %ctz = phi i256 [ 256, %0 ], [ %d, %cond.false ]
968  ret i256 %ctz
969}
970
971