1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=i686-linux-gnu -verify-machineinstrs < %s -o - | FileCheck %s --check-prefixes=X86 3; RUN: llc -mtriple=i686-linux-gnu -fast-isel -fast-isel-abort=1 -verify-machineinstrs < %s -o - | FileCheck %s --check-prefixes=X86 4; TODO: enable when x87 is supported 5; llc -mtriple=i686-linux-gnu -global-isel -global-isel-abort=1 -verify-machineinstrs < %s -o - | FileCheck %s --check-prefixes=X86,GLOBAL-X86 6; RUN: llc -mtriple=x86_64-linux-gnu -verify-machineinstrs < %s -o - | FileCheck %s --check-prefixes=X64,DAG-X64 7; RUN: llc -mtriple=x86_64-linux-gnu -fast-isel -fast-isel-abort=1 -verify-machineinstrs < %s -o - | FileCheck %s --check-prefixes=X64,DAG-X64 8; RUN: llc -mtriple=x86_64-linux-gnu -global-isel -global-isel-abort=1 -verify-machineinstrs < %s -o - | FileCheck %s --check-prefixes=X64,GLOBAL-X64 9 10define i1 @test_i1(i1 %a, i1 %b, i1 %c, i1 %pred0, i1 %pred1) { 11; X86-LABEL: test_i1: 12; X86: # %bb.0: # %entry 13; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 14; X86-NEXT: je .LBB0_1 15; X86-NEXT: # %bb.2: # %cond 16; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 17; X86-NEXT: je .LBB0_4 18; X86-NEXT: # %bb.3: 19; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 20; X86-NEXT: retl 21; X86-NEXT: .LBB0_1: 22; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 23; X86-NEXT: retl 24; X86-NEXT: .LBB0_4: # %cond.false 25; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 26; X86-NEXT: retl 27; 28; X64-LABEL: test_i1: 29; X64: # %bb.0: # %entry 30; X64-NEXT: testb $1, %cl 31; X64-NEXT: je .LBB0_1 32; X64-NEXT: # %bb.2: # %cond 33; X64-NEXT: movl %esi, %eax 34; X64-NEXT: testb $1, %r8b 35; X64-NEXT: jne .LBB0_4 36; X64-NEXT: # %bb.3: # %cond.false 37; X64-NEXT: movl %edx, %eax 38; X64-NEXT: .LBB0_4: # %cond.end 39; X64-NEXT: # kill: def $al killed $al killed $eax 40; X64-NEXT: retq 41; X64-NEXT: .LBB0_1: 42; X64-NEXT: movl %edi, %eax 43; X64-NEXT: # kill: def $al killed $al killed $eax 44; X64-NEXT: retq 45entry: 46 br i1 %pred0, label %cond, label %cond.end 47 48cond: 49 br i1 %pred1, label %cond.true, label %cond.false 50 51cond.true: 52 br label %cond.end 53 54cond.false: 55 br label %cond.end 56 57cond.end: 58 %res = phi i1 [ %a, %entry ], [ %b, %cond.true ], [ %c, %cond.false ] 59 ret i1 %res 60} 61 62define i8 @test_i8(i8 %f, i8 %t, i1 %pred) { 63; X86-LABEL: test_i8: 64; X86: # %bb.0: # %entry 65; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 66; X86-NEXT: je .LBB1_2 67; X86-NEXT: # %bb.1: 68; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 69; X86-NEXT: retl 70; X86-NEXT: .LBB1_2: # %cond.false 71; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 72; X86-NEXT: retl 73; 74; X64-LABEL: test_i8: 75; X64: # %bb.0: # %entry 76; X64-NEXT: testb $1, %dl 77; X64-NEXT: je .LBB1_2 78; X64-NEXT: # %bb.1: 79; X64-NEXT: movl %edi, %eax 80; X64-NEXT: # kill: def $al killed $al killed $eax 81; X64-NEXT: retq 82; X64-NEXT: .LBB1_2: # %cond.false 83; X64-NEXT: movl %esi, %eax 84; X64-NEXT: # kill: def $al killed $al killed $eax 85; X64-NEXT: retq 86entry: 87 br i1 %pred, label %cond.true, label %cond.false 88 89cond.true: ; preds = %entry 90 br label %cond.end 91 92cond.false: ; preds = %entry 93 br label %cond.end 94 95cond.end: ; preds = %cond.false, %cond.true 96 %cond = phi i8 [ %f, %cond.true ], [ %t, %cond.false ] 97 ret i8 %cond 98} 99 100define i16 @test_i16(i16 %f, i16 %t, i1 %pred) { 101; X86-LABEL: test_i16: 102; X86: # %bb.0: # %entry 103; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 104; X86-NEXT: je .LBB2_2 105; X86-NEXT: # %bb.1: 106; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 107; X86-NEXT: retl 108; X86-NEXT: .LBB2_2: # %cond.false 109; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 110; X86-NEXT: retl 111; 112; X64-LABEL: test_i16: 113; X64: # %bb.0: # %entry 114; X64-NEXT: testb $1, %dl 115; X64-NEXT: je .LBB2_2 116; X64-NEXT: # %bb.1: 117; X64-NEXT: movl %edi, %eax 118; X64-NEXT: # kill: def $ax killed $ax killed $eax 119; X64-NEXT: retq 120; X64-NEXT: .LBB2_2: # %cond.false 121; X64-NEXT: movl %esi, %eax 122; X64-NEXT: # kill: def $ax killed $ax killed $eax 123; X64-NEXT: retq 124entry: 125 br i1 %pred, label %cond.true, label %cond.false 126 127cond.true: ; preds = %entry 128 br label %cond.end 129 130cond.false: ; preds = %entry 131 br label %cond.end 132 133cond.end: ; preds = %cond.false, %cond.true 134 %cond = phi i16 [ %f, %cond.true ], [ %t, %cond.false ] 135 ret i16 %cond 136} 137 138define i32 @test_i32(i32 %f, i32 %t, i1 %pred) { 139; X86-LABEL: test_i32: 140; X86: # %bb.0: # %entry 141; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 142; X86-NEXT: je .LBB3_2 143; X86-NEXT: # %bb.1: 144; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 145; X86-NEXT: retl 146; X86-NEXT: .LBB3_2: # %cond.false 147; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 148; X86-NEXT: retl 149; 150; X64-LABEL: test_i32: 151; X64: # %bb.0: # %entry 152; X64-NEXT: movl %edi, %eax 153; X64-NEXT: testb $1, %dl 154; X64-NEXT: jne .LBB3_2 155; X64-NEXT: # %bb.1: # %cond.false 156; X64-NEXT: movl %esi, %eax 157; X64-NEXT: .LBB3_2: # %cond.end 158; X64-NEXT: retq 159entry: 160 br i1 %pred, label %cond.true, label %cond.false 161 162cond.true: ; preds = %entry 163 br label %cond.end 164 165cond.false: ; preds = %entry 166 br label %cond.end 167 168cond.end: ; preds = %cond.false, %cond.true 169 %cond = phi i32 [ %f, %cond.true ], [ %t, %cond.false ] 170 ret i32 %cond 171} 172 173define i64 @test_i64(i64 %f, i64 %t, i1 %pred) { 174; X86-LABEL: test_i64: 175; X86: # %bb.0: # %entry 176; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 177; X86-NEXT: je .LBB4_2 178; X86-NEXT: # %bb.1: 179; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 180; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 181; X86-NEXT: retl 182; X86-NEXT: .LBB4_2: # %cond.false 183; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 184; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 185; X86-NEXT: retl 186; 187; X64-LABEL: test_i64: 188; X64: # %bb.0: # %entry 189; X64-NEXT: movq %rdi, %rax 190; X64-NEXT: testb $1, %dl 191; X64-NEXT: jne .LBB4_2 192; X64-NEXT: # %bb.1: # %cond.false 193; X64-NEXT: movq %rsi, %rax 194; X64-NEXT: .LBB4_2: # %cond.end 195; X64-NEXT: retq 196entry: 197 br i1 %pred, label %cond.true, label %cond.false 198 199cond.true: ; preds = %entry 200 br label %cond.end 201 202cond.false: ; preds = %entry 203 br label %cond.end 204 205cond.end: ; preds = %cond.false, %cond.true 206 %cond = phi i64 [ %f, %cond.true ], [ %t, %cond.false ] 207 ret i64 %cond 208} 209 210define float @test_float(float %f, float %t, i1 %pred) { 211; X86-LABEL: test_float: 212; X86: # %bb.0: # %entry 213; X86-NEXT: flds {{[0-9]+}}(%esp) 214; X86-NEXT: flds {{[0-9]+}}(%esp) 215; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 216; X86-NEXT: jne .LBB5_2 217; X86-NEXT: # %bb.1: # %cond.false 218; X86-NEXT: fstp %st(0) 219; X86-NEXT: fldz 220; X86-NEXT: fxch %st(1) 221; X86-NEXT: .LBB5_2: # %cond.end 222; X86-NEXT: fstp %st(1) 223; X86-NEXT: retl 224; 225; X64-LABEL: test_float: 226; X64: # %bb.0: # %entry 227; X64-NEXT: testb $1, %dil 228; X64-NEXT: jne .LBB5_2 229; X64-NEXT: # %bb.1: # %cond.false 230; X64-NEXT: movaps %xmm1, %xmm0 231; X64-NEXT: .LBB5_2: # %cond.end 232; X64-NEXT: retq 233entry: 234 br i1 %pred, label %cond.true, label %cond.false 235 236cond.true: ; preds = %entry 237 br label %cond.end 238 239cond.false: ; preds = %entry 240 br label %cond.end 241 242cond.end: ; preds = %cond.false, %cond.true 243 %cond = phi float [ %f, %cond.true ], [ %t, %cond.false ] 244 ret float %cond 245} 246 247define double @test_double(i32 %a, double %f, double %t, i1 %pred) { 248; X86-LABEL: test_double: 249; X86: # %bb.0: # %entry 250; X86-NEXT: fldl {{[0-9]+}}(%esp) 251; X86-NEXT: fldl {{[0-9]+}}(%esp) 252; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 253; X86-NEXT: jne .LBB6_2 254; X86-NEXT: # %bb.1: # %cond.false 255; X86-NEXT: fstp %st(0) 256; X86-NEXT: fldz 257; X86-NEXT: fxch %st(1) 258; X86-NEXT: .LBB6_2: # %cond.end 259; X86-NEXT: fstp %st(1) 260; X86-NEXT: retl 261; 262; X64-LABEL: test_double: 263; X64: # %bb.0: # %entry 264; X64-NEXT: testb $1, %sil 265; X64-NEXT: jne .LBB6_2 266; X64-NEXT: # %bb.1: # %cond.false 267; X64-NEXT: movaps %xmm1, %xmm0 268; X64-NEXT: .LBB6_2: # %cond.end 269; X64-NEXT: retq 270entry: 271 br i1 %pred, label %cond.true, label %cond.false 272 273cond.true: ; preds = %entry 274 br label %cond.end 275 276cond.false: ; preds = %entry 277 br label %cond.end 278 279cond.end: ; preds = %cond.false, %cond.true 280 %cond = phi double [ %f, %cond.true ], [ %t, %cond.false ] 281 ret double %cond 282} 283 284define ptr @test_ptr(ptr %a, ptr %b, ptr %c, ptr %d, ptr %e, ptr %f, ptr %g, i1 %pred0, i1 %pred1, i1 %pred2) { 285; X86-LABEL: test_ptr: 286; X86: # %bb.0: # %entry 287; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 288; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 289; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 290; X86-NEXT: je .LBB7_6 291; X86-NEXT: # %bb.1: # %cond.true 292; X86-NEXT: testb $1, %cl 293; X86-NEXT: je .LBB7_3 294; X86-NEXT: # %bb.2: 295; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 296; X86-NEXT: retl 297; X86-NEXT: .LBB7_6: # %cond.false 298; X86-NEXT: testb $1, %cl 299; X86-NEXT: je .LBB7_10 300; X86-NEXT: # %bb.7: # %cond.false.true 301; X86-NEXT: testb $1, %al 302; X86-NEXT: je .LBB7_9 303; X86-NEXT: # %bb.8: 304; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 305; X86-NEXT: retl 306; X86-NEXT: .LBB7_3: # %cond.true.false 307; X86-NEXT: testb $1, %al 308; X86-NEXT: je .LBB7_5 309; X86-NEXT: # %bb.4: 310; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 311; X86-NEXT: retl 312; X86-NEXT: .LBB7_10: # %cond.false.false 313; X86-NEXT: testb $1, %al 314; X86-NEXT: je .LBB7_12 315; X86-NEXT: # %bb.11: 316; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 317; X86-NEXT: retl 318; X86-NEXT: .LBB7_9: # %cond.false.true.false 319; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 320; X86-NEXT: retl 321; X86-NEXT: .LBB7_5: # %cond.true.false.false 322; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 323; X86-NEXT: retl 324; X86-NEXT: .LBB7_12: # %cond.false.false.false 325; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 326; X86-NEXT: retl 327; 328; DAG-X64-LABEL: test_ptr: 329; DAG-X64: # %bb.0: # %entry 330; DAG-X64-NEXT: movq %rdi, %rax 331; DAG-X64-NEXT: movzbl {{[0-9]+}}(%rsp), %edi 332; DAG-X64-NEXT: movzbl {{[0-9]+}}(%rsp), %r10d 333; DAG-X64-NEXT: testb $1, {{[0-9]+}}(%rsp) 334; DAG-X64-NEXT: je .LBB7_4 335; DAG-X64-NEXT: # %bb.1: # %cond.true 336; DAG-X64-NEXT: testb $1, %r10b 337; DAG-X64-NEXT: jne .LBB7_9 338; DAG-X64-NEXT: # %bb.2: # %cond.true.false 339; DAG-X64-NEXT: testb $1, %dil 340; DAG-X64-NEXT: movq %rsi, %rax 341; DAG-X64-NEXT: jne .LBB7_9 342; DAG-X64-NEXT: # %bb.3: # %cond.true.false.false 343; DAG-X64-NEXT: movq %rdx, %rax 344; DAG-X64-NEXT: retq 345; DAG-X64-NEXT: .LBB7_4: # %cond.false 346; DAG-X64-NEXT: testb $1, %r10b 347; DAG-X64-NEXT: je .LBB7_7 348; DAG-X64-NEXT: # %bb.5: # %cond.false.true 349; DAG-X64-NEXT: testb $1, %dil 350; DAG-X64-NEXT: movq %rcx, %rax 351; DAG-X64-NEXT: jne .LBB7_9 352; DAG-X64-NEXT: # %bb.6: # %cond.false.true.false 353; DAG-X64-NEXT: movq %r8, %rax 354; DAG-X64-NEXT: retq 355; DAG-X64-NEXT: .LBB7_7: # %cond.false.false 356; DAG-X64-NEXT: testb $1, %dil 357; DAG-X64-NEXT: movq %r9, %rax 358; DAG-X64-NEXT: jne .LBB7_9 359; DAG-X64-NEXT: # %bb.8: # %cond.false.false.false 360; DAG-X64-NEXT: movq {{[0-9]+}}(%rsp), %rax 361; DAG-X64-NEXT: .LBB7_9: # %cond.end 362; DAG-X64-NEXT: retq 363; 364; GLOBAL-X64-LABEL: test_ptr: 365; GLOBAL-X64: # %bb.0: # %entry 366; GLOBAL-X64-NEXT: movq %rdi, %rax 367; GLOBAL-X64-NEXT: movl {{[0-9]+}}(%rsp), %r11d 368; GLOBAL-X64-NEXT: movl {{[0-9]+}}(%rsp), %r10d 369; GLOBAL-X64-NEXT: movl {{[0-9]+}}(%rsp), %edi 370; GLOBAL-X64-NEXT: testb $1, %r11b 371; GLOBAL-X64-NEXT: je .LBB7_4 372; GLOBAL-X64-NEXT: # %bb.1: # %cond.true 373; GLOBAL-X64-NEXT: testb $1, %r10b 374; GLOBAL-X64-NEXT: jne .LBB7_9 375; GLOBAL-X64-NEXT: # %bb.2: # %cond.true.false 376; GLOBAL-X64-NEXT: testb $1, %dil 377; GLOBAL-X64-NEXT: movq %rsi, %rax 378; GLOBAL-X64-NEXT: jne .LBB7_9 379; GLOBAL-X64-NEXT: # %bb.3: # %cond.true.false.false 380; GLOBAL-X64-NEXT: movq %rdx, %rax 381; GLOBAL-X64-NEXT: retq 382; GLOBAL-X64-NEXT: .LBB7_4: # %cond.false 383; GLOBAL-X64-NEXT: testb $1, %r10b 384; GLOBAL-X64-NEXT: je .LBB7_7 385; GLOBAL-X64-NEXT: # %bb.5: # %cond.false.true 386; GLOBAL-X64-NEXT: testb $1, %dil 387; GLOBAL-X64-NEXT: movq %rcx, %rax 388; GLOBAL-X64-NEXT: jne .LBB7_9 389; GLOBAL-X64-NEXT: # %bb.6: # %cond.false.true.false 390; GLOBAL-X64-NEXT: movq %r8, %rax 391; GLOBAL-X64-NEXT: retq 392; GLOBAL-X64-NEXT: .LBB7_7: # %cond.false.false 393; GLOBAL-X64-NEXT: testb $1, %dil 394; GLOBAL-X64-NEXT: movq %r9, %rax 395; GLOBAL-X64-NEXT: jne .LBB7_9 396; GLOBAL-X64-NEXT: # %bb.8: # %cond.false.false.false 397; GLOBAL-X64-NEXT: movq {{[0-9]+}}(%rsp), %rax 398; GLOBAL-X64-NEXT: .LBB7_9: # %cond.end 399; GLOBAL-X64-NEXT: retq 400entry: 401 br i1 %pred0, label %cond.true, label %cond.false 402 403cond.true: 404 br i1 %pred1, label %cond.end, label %cond.true.false 405 406cond.true.false: 407 br i1 %pred2, label %cond.true.false.true, label %cond.true.false.false 408 409cond.true.false.true: 410 br label %cond.end 411 412cond.true.false.false: 413 br label %cond.end 414 415cond.false: 416 br i1 %pred1, label %cond.false.true, label %cond.false.false 417 418cond.false.true: 419 br i1 %pred2, label %cond.false.true.true, label %cond.false.true.false 420 421cond.false.true.true: 422 br label %cond.end 423 424cond.false.true.false: 425 br label %cond.end 426 427cond.false.false: 428 br i1 %pred2, label %cond.false.false.true, label %cond.false.false.false 429 430cond.false.false.true: 431 br label %cond.end 432 433cond.false.false.false: 434 br label %cond.end 435 436cond.end: 437 %res = phi ptr [ %a, %cond.true ], [ %b, %cond.true.false.true ], [ %c, %cond.true.false.false ], [ %d, %cond.false.true.true ], [ %e, %cond.false.true.false ], [ %f, %cond.false.false.true ], [ %g, %cond.false.false.false ] 438 ret ptr %res 439} 440 441define x86_fp80 @test_fp80(x86_fp80 %f, x86_fp80 %t, i1 %pred) { 442; X86-LABEL: test_fp80: 443; X86: # %bb.0: # %entry 444; X86-NEXT: fldt {{[0-9]+}}(%esp) 445; X86-NEXT: fldt {{[0-9]+}}(%esp) 446; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 447; X86-NEXT: jne .LBB8_2 448; X86-NEXT: # %bb.1: # %cond.false 449; X86-NEXT: fstp %st(0) 450; X86-NEXT: fldz 451; X86-NEXT: fxch %st(1) 452; X86-NEXT: .LBB8_2: # %cond.end 453; X86-NEXT: fstp %st(1) 454; X86-NEXT: retl 455; 456; DAG-X64-LABEL: test_fp80: 457; DAG-X64: # %bb.0: # %entry 458; DAG-X64-NEXT: fldt {{[0-9]+}}(%rsp) 459; DAG-X64-NEXT: fldt {{[0-9]+}}(%rsp) 460; DAG-X64-NEXT: testb $1, %dil 461; DAG-X64-NEXT: jne .LBB8_2 462; DAG-X64-NEXT: # %bb.1: # %cond.false 463; DAG-X64-NEXT: fstp %st(0) 464; DAG-X64-NEXT: fldz 465; DAG-X64-NEXT: fxch %st(1) 466; DAG-X64-NEXT: .LBB8_2: # %cond.end 467; DAG-X64-NEXT: fstp %st(1) 468; DAG-X64-NEXT: retq 469; 470; GLOBAL-X64-LABEL: test_fp80: 471; GLOBAL-X64: # %bb.0: # %entry 472; GLOBAL-X64-NEXT: fldt {{[0-9]+}}(%rsp) 473; GLOBAL-X64-NEXT: fldt {{[0-9]+}}(%rsp) 474; GLOBAL-X64-NEXT: testb $1, %dil 475; GLOBAL-X64-NEXT: jne .LBB8_2 476; GLOBAL-X64-NEXT: # %bb.1: # %cond.false 477; GLOBAL-X64-NEXT: fstp %st(1) 478; GLOBAL-X64-NEXT: fldz 479; GLOBAL-X64-NEXT: .LBB8_2: # %cond.end 480; GLOBAL-X64-NEXT: fstp %st(0) 481; GLOBAL-X64-NEXT: retq 482entry: 483 br i1 %pred, label %cond.true, label %cond.false 484 485cond.true: ; preds = %entry 486 br label %cond.end 487 488cond.false: ; preds = %entry 489 br label %cond.end 490 491cond.end: ; preds = %cond.false, %cond.true 492 %cond = phi x86_fp80 [ %f, %cond.true ], [ %t, %cond.false ] 493 ret x86_fp80 %cond 494} 495