1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -O2 -mtriple=x86_64-linux-android -mattr=+sse \ 3; RUN: -enable-legalize-types-checking | FileCheck %s --check-prefix=SSE 4; RUN: llc < %s -O2 -mtriple=x86_64-linux-gnu -mattr=+sse \ 5; RUN: -enable-legalize-types-checking | FileCheck %s --check-prefix=SSE 6; RUN: llc < %s -O2 -mtriple=x86_64-linux-android -mattr=-sse \ 7; RUN: -enable-legalize-types-checking | FileCheck %s --check-prefix=NOSSE 8; RUN: llc < %s -O2 -mtriple=x86_64-linux-gnu -mattr=-sse \ 9; RUN: -enable-legalize-types-checking | FileCheck %s --check-prefix=NOSSE 10 11define void @test_select(fp128* %p, fp128* %q, i1 zeroext %c) { 12; SSE-LABEL: test_select: 13; SSE: # %bb.0: 14; SSE-NEXT: testl %edx, %edx 15; SSE-NEXT: jne .LBB0_1 16; SSE-NEXT: # %bb.2: 17; SSE-NEXT: movaps {{.*}}(%rip), %xmm0 18; SSE-NEXT: movaps %xmm0, (%rsi) 19; SSE-NEXT: retq 20; SSE-NEXT: .LBB0_1: 21; SSE-NEXT: movups (%rdi), %xmm0 22; SSE-NEXT: movaps %xmm0, (%rsi) 23; SSE-NEXT: retq 24; 25; NOSSE-LABEL: test_select: 26; NOSSE: # %bb.0: 27; NOSSE-NEXT: xorl %eax, %eax 28; NOSSE-NEXT: testl %edx, %edx 29; NOSSE-NEXT: cmovneq (%rdi), %rax 30; NOSSE-NEXT: movabsq $9223231299366420480, %rcx # imm = 0x7FFF800000000000 31; NOSSE-NEXT: cmovneq 8(%rdi), %rcx 32; NOSSE-NEXT: movq %rcx, 8(%rsi) 33; NOSSE-NEXT: movq %rax, (%rsi) 34; NOSSE-NEXT: retq 35 %a = load fp128, fp128* %p, align 2 36 %r = select i1 %c, fp128 %a, fp128 0xL00000000000000007FFF800000000000 37 store fp128 %r, fp128* %q 38 ret void 39} 40 41; The uitofp will become a select_cc. This used to crash during type 42; legalization because we didn't expect the operands to need to be softened. 43define fp128 @test_select_cc(fp128, fp128) { 44; SSE-LABEL: test_select_cc: 45; SSE: # %bb.0: # %BB0 46; SSE-NEXT: pushq %rbx 47; SSE-NEXT: .cfi_def_cfa_offset 16 48; SSE-NEXT: subq $32, %rsp 49; SSE-NEXT: .cfi_def_cfa_offset 48 50; SSE-NEXT: .cfi_offset %rbx, -16 51; SSE-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill 52; SSE-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill 53; SSE-NEXT: callq __netf2 54; SSE-NEXT: movl %eax, %ebx 55; SSE-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload 56; SSE-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload 57; SSE-NEXT: callq __eqtf2 58; SSE-NEXT: testl %eax, %eax 59; SSE-NEXT: je .LBB1_1 60; SSE-NEXT: # %bb.2: # %BB0 61; SSE-NEXT: xorps %xmm1, %xmm1 62; SSE-NEXT: jmp .LBB1_3 63; SSE-NEXT: .LBB1_1: 64; SSE-NEXT: movaps {{.*}}(%rip), %xmm1 65; SSE-NEXT: .LBB1_3: # %BB0 66; SSE-NEXT: testl %ebx, %ebx 67; SSE-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload 68; SSE-NEXT: jne .LBB1_5 69; SSE-NEXT: # %bb.4: # %BB1 70; SSE-NEXT: movaps %xmm1, %xmm0 71; SSE-NEXT: .LBB1_5: # %BB2 72; SSE-NEXT: addq $32, %rsp 73; SSE-NEXT: .cfi_def_cfa_offset 16 74; SSE-NEXT: popq %rbx 75; SSE-NEXT: .cfi_def_cfa_offset 8 76; SSE-NEXT: retq 77; 78; NOSSE-LABEL: test_select_cc: 79; NOSSE: # %bb.0: # %BB0 80; NOSSE-NEXT: pushq %rbp 81; NOSSE-NEXT: .cfi_def_cfa_offset 16 82; NOSSE-NEXT: pushq %r15 83; NOSSE-NEXT: .cfi_def_cfa_offset 24 84; NOSSE-NEXT: pushq %r14 85; NOSSE-NEXT: .cfi_def_cfa_offset 32 86; NOSSE-NEXT: pushq %r12 87; NOSSE-NEXT: .cfi_def_cfa_offset 40 88; NOSSE-NEXT: pushq %rbx 89; NOSSE-NEXT: .cfi_def_cfa_offset 48 90; NOSSE-NEXT: .cfi_offset %rbx, -48 91; NOSSE-NEXT: .cfi_offset %r12, -40 92; NOSSE-NEXT: .cfi_offset %r14, -32 93; NOSSE-NEXT: .cfi_offset %r15, -24 94; NOSSE-NEXT: .cfi_offset %rbp, -16 95; NOSSE-NEXT: movq %rcx, %r12 96; NOSSE-NEXT: movq %rdx, %rbx 97; NOSSE-NEXT: movq %rsi, %r14 98; NOSSE-NEXT: movq %rdi, %r15 99; NOSSE-NEXT: callq __netf2 100; NOSSE-NEXT: movl %eax, %ebp 101; NOSSE-NEXT: movq %r15, %rdi 102; NOSSE-NEXT: movq %r14, %rsi 103; NOSSE-NEXT: movq %rbx, %rdx 104; NOSSE-NEXT: movq %r12, %rcx 105; NOSSE-NEXT: callq __eqtf2 106; NOSSE-NEXT: movl %eax, %ecx 107; NOSSE-NEXT: xorl %eax, %eax 108; NOSSE-NEXT: testl %ecx, %ecx 109; NOSSE-NEXT: movabsq $4611404543450677248, %rdx # imm = 0x3FFF000000000000 110; NOSSE-NEXT: cmovneq %rax, %rdx 111; NOSSE-NEXT: testl %ebp, %ebp 112; NOSSE-NEXT: je .LBB1_2 113; NOSSE-NEXT: # %bb.1: 114; NOSSE-NEXT: movq %r15, %rax 115; NOSSE-NEXT: movq %r14, %rdx 116; NOSSE-NEXT: .LBB1_2: # %BB2 117; NOSSE-NEXT: popq %rbx 118; NOSSE-NEXT: .cfi_def_cfa_offset 40 119; NOSSE-NEXT: popq %r12 120; NOSSE-NEXT: .cfi_def_cfa_offset 32 121; NOSSE-NEXT: popq %r14 122; NOSSE-NEXT: .cfi_def_cfa_offset 24 123; NOSSE-NEXT: popq %r15 124; NOSSE-NEXT: .cfi_def_cfa_offset 16 125; NOSSE-NEXT: popq %rbp 126; NOSSE-NEXT: .cfi_def_cfa_offset 8 127; NOSSE-NEXT: retq 128BB0: 129 %a = fcmp oeq fp128 %0, %1 130 %b = uitofp i1 %a to fp128 131 br i1 %a, label %BB1, label %BB2 132BB1: 133 br label %BB2 134BB2: 135 %c = phi fp128 [ %0, %BB0 ], [ %b, %BB1 ] 136 ret fp128 %c 137} 138