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