Index: lib/CodeGen/SelectionDAG/FastISel.cpp =================================================================== --- lib/CodeGen/SelectionDAG/FastISel.cpp +++ lib/CodeGen/SelectionDAG/FastISel.cpp @@ -618,7 +618,8 @@ // Check if the second operand is a constant and handle it appropriately. if (const auto *CI = dyn_cast(I->getOperand(1))) { - uint64_t Imm = CI->getSExtValue(); + // Use 1/0 for i1 otherwise use sext; Improves encoding on x86. + uint64_t Imm = CI->getBitWidth() != 1 ? CI->getSExtValue() : CI->getZExtValue(); // Transform "sdiv exact X, 8" -> "sra X, 3". if (ISDOpcode == ISD::SDIV && isa(I) && Index: test/CodeGen/Mips/Fast-ISel/xori1.ll =================================================================== --- /dev/null +++ test/CodeGen/Mips/Fast-ISel/xori1.ll @@ -0,0 +1,20 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -march=mipsel -relocation-model=pic -O0 -fast-isel-abort=3 -mcpu=mips32r2 \ +; RUN: < %s -verify-machineinstrs | FileCheck %s + + +define zeroext i1 @foobar(i1 zeroext) { +entry: +; CHECK-LABEL: foobar: +; CHECK: # %bb.0: # %entry +; CHECK: addiu $1, $zero, 1 +; CHECK-NEXT: xor $1, $4, $1 +; CHECK: # %bb.1: # %bb0 + %1 = xor i1 %0, true + br label %bb0 +bb0: + %2 = icmp eq i1 %1, true + ret i1 %2 +} + + Index: test/CodeGen/X86/avx512-fsel.ll =================================================================== --- test/CodeGen/X86/avx512-fsel.ll +++ test/CodeGen/X86/avx512-fsel.ll @@ -13,7 +13,7 @@ ; CHECK-NEXT: sete %al ; CHECK-NEXT: setnp %cl ; CHECK-NEXT: andb %cl, %al -; CHECK-NEXT: xorb $-1, %al +; CHECK-NEXT: xorb $1, %al ; CHECK-NEXT: testb $1, %al ; CHECK-NEXT: jne LBB0_1 ; CHECK-NEXT: jmp LBB0_2 Index: test/CodeGen/X86/pr32256.ll =================================================================== --- test/CodeGen/X86/pr32256.ll +++ test/CodeGen/X86/pr32256.ll @@ -12,7 +12,7 @@ ; CHECK-NEXT: xorl %eax, %eax ; CHECK-NEXT: movb %al, %cl ; CHECK-NEXT: movb c, %dl -; CHECK-NEXT: xorb $-1, %dl +; CHECK-NEXT: xorb $1, %dl ; CHECK-NEXT: testb $1, %dl ; CHECK-NEXT: movb %cl, (%esp) # 1-byte Spill ; CHECK-NEXT: jne .LBB0_1 Index: test/CodeGen/X86/pr32284.ll =================================================================== --- test/CodeGen/X86/pr32284.ll +++ test/CodeGen/X86/pr32284.ll @@ -23,8 +23,8 @@ ; X86-O0-NEXT: movb %dil, -{{[0-9]+}}(%rsp) ; X86-O0-NEXT: cmpb $0, c ; X86-O0-NEXT: setne %dil -; X86-O0-NEXT: xorb $-1, %dil -; X86-O0-NEXT: xorb $-1, %dil +; X86-O0-NEXT: xorb $1, %dil +; X86-O0-NEXT: xorb $1, %dil ; X86-O0-NEXT: andb $1, %dil ; X86-O0-NEXT: movzbl %dil, %eax ; X86-O0-NEXT: movzbl c, %edx @@ -60,8 +60,8 @@ ; 686-O0-NEXT: movb %al, {{[0-9]+}}(%esp) ; 686-O0-NEXT: cmpb $0, c ; 686-O0-NEXT: setne %al -; 686-O0-NEXT: xorb $-1, %al -; 686-O0-NEXT: xorb $-1, %al +; 686-O0-NEXT: xorb $1, %al +; 686-O0-NEXT: xorb $1, %al ; 686-O0-NEXT: andb $1, %al ; 686-O0-NEXT: movzbl %al, %ecx ; 686-O0-NEXT: movzbl c, %edx @@ -134,7 +134,7 @@ ; X86-O0-NEXT: xorl $-1, %esi ; X86-O0-NEXT: cmpl $0, %esi ; X86-O0-NEXT: setne %dl -; X86-O0-NEXT: xorb $-1, %dl +; X86-O0-NEXT: xorb $1, %dl ; X86-O0-NEXT: andb $1, %dl ; X86-O0-NEXT: movzbl %dl, %esi ; X86-O0-NEXT: movl %esi, %eax @@ -150,7 +150,7 @@ ; X86-O0-NEXT: xorl $-1, %esi ; X86-O0-NEXT: cmpl $0, %esi ; X86-O0-NEXT: setne %dl -; X86-O0-NEXT: xorb $-1, %dl +; X86-O0-NEXT: xorb $1, %dl ; X86-O0-NEXT: andb $1, %dl ; X86-O0-NEXT: movzbl %dl, %esi ; X86-O0-NEXT: movl %esi, %eax @@ -321,7 +321,7 @@ ; X86-O0-NEXT: movzbl var_7, %eax ; X86-O0-NEXT: cmpb $0, var_7 ; X86-O0-NEXT: setne %cl -; X86-O0-NEXT: xorb $-1, %cl +; X86-O0-NEXT: xorb $1, %cl ; X86-O0-NEXT: andb $1, %cl ; X86-O0-NEXT: movzbl %cl, %edx ; X86-O0-NEXT: xorl %edx, %eax @@ -331,7 +331,7 @@ ; X86-O0-NEXT: movw %ax, %si ; X86-O0-NEXT: cmpw $0, %si ; X86-O0-NEXT: setne %cl -; X86-O0-NEXT: xorb $-1, %cl +; X86-O0-NEXT: xorb $1, %cl ; X86-O0-NEXT: andb $1, %cl ; X86-O0-NEXT: movzbl %cl, %eax ; X86-O0-NEXT: movzbl var_7, %edx @@ -371,7 +371,7 @@ ; 686-O0-NEXT: movzbl var_7, %eax ; 686-O0-NEXT: cmpb $0, var_7 ; 686-O0-NEXT: setne %cl -; 686-O0-NEXT: xorb $-1, %cl +; 686-O0-NEXT: xorb $1, %cl ; 686-O0-NEXT: andb $1, %cl ; 686-O0-NEXT: movzbl %cl, %edx ; 686-O0-NEXT: xorl %edx, %eax @@ -381,7 +381,7 @@ ; 686-O0-NEXT: movw %ax, %si ; 686-O0-NEXT: cmpw $0, %si ; 686-O0-NEXT: setne %cl -; 686-O0-NEXT: xorb $-1, %cl +; 686-O0-NEXT: xorb $1, %cl ; 686-O0-NEXT: andb $1, %cl ; 686-O0-NEXT: movzbl %cl, %eax ; 686-O0-NEXT: movzbl var_7, %edx @@ -457,7 +457,7 @@ ; X86-O0-NEXT: movl %eax, %ecx ; X86-O0-NEXT: cmpl $0, var_13 ; X86-O0-NEXT: setne %dl -; X86-O0-NEXT: xorb $-1, %dl +; X86-O0-NEXT: xorb $1, %dl ; X86-O0-NEXT: andb $1, %dl ; X86-O0-NEXT: movzbl %dl, %eax ; X86-O0-NEXT: movl %eax, %esi @@ -475,7 +475,7 @@ ; X86-O0-NEXT: movl %eax, %ecx ; X86-O0-NEXT: cmpl $0, var_13 ; X86-O0-NEXT: setne %dl -; X86-O0-NEXT: xorb $-1, %dl +; X86-O0-NEXT: xorb $1, %dl ; X86-O0-NEXT: andb $1, %dl ; X86-O0-NEXT: movzbl %dl, %eax ; X86-O0-NEXT: movl %eax, %esi