From 311b63f13b0873b183f2a7e57eecf0257c7bffa0 Mon Sep 17 00:00:00 2001 From: Hans Wennborg Date: Mon, 26 Mar 2018 10:07:51 +0000 Subject: [PATCH] Revert r328386 "[X86] Fix Windows `i1 zeroext` conventions to use i8 instead of i32" This broke Chromium (see crbug.com/825748). It looks like mstorsjo's follow-up patch at D44876 fixes this, but let's revert back to green for now until that's ready to land. (Also reverts r328443.) > Both GCC and MSVC only look at the low byte of a boolean when it is > passed. llvm-svn: 328482 --- llvm/lib/Target/X86/X86CallingConv.td | 14 ++++--------- llvm/lib/Target/X86/X86ISelLowering.cpp | 6 +----- llvm/test/CodeGen/X86/avx512-intel-ocl.ll | 2 -- llvm/test/CodeGen/X86/h-registers-0.ll | 3 +-- llvm/test/CodeGen/X86/test-shrink.ll | 4 ---- llvm/test/CodeGen/X86/vec_cast.ll | 8 -------- llvm/test/CodeGen/X86/win32-bool.ll | 33 ------------------------------- llvm/test/CodeGen/X86/win64-bool.ll | 23 --------------------- llvm/test/CodeGen/X86/xor.ll | 5 +---- 9 files changed, 7 insertions(+), 91 deletions(-) delete mode 100644 llvm/test/CodeGen/X86/win32-bool.ll delete mode 100644 llvm/test/CodeGen/X86/win64-bool.ll diff --git a/llvm/lib/Target/X86/X86CallingConv.td b/llvm/lib/Target/X86/X86CallingConv.td index d2ade22..8d3e33d 100644 --- a/llvm/lib/Target/X86/X86CallingConv.td +++ b/llvm/lib/Target/X86/X86CallingConv.td @@ -593,8 +593,8 @@ def CC_X86_Win64_C : CallingConv<[ // FIXME: Handle byval stuff. // FIXME: Handle varargs. - // Promote i1/v1i1 arguments to i8. - CCIfType<[i1, v1i1], CCPromoteToType>, + // Promote i1/i8/i16/v1i1 arguments to i32. + CCIfType<[i1, i8, i16, v1i1], CCPromoteToType>, // The 'nest' parameter, if any, is passed in R10. CCIfNest>, @@ -619,10 +619,6 @@ def CC_X86_Win64_C : CallingConv<[ CCIfType<[x86mmx], CCBitConvertToType>, // The first 4 integer arguments are passed in integer registers. - CCIfType<[i8 ], CCAssignToRegWithShadow<[CL , DL , R8B , R9B ], - [XMM0, XMM1, XMM2, XMM3]>>, - CCIfType<[i16], CCAssignToRegWithShadow<[CX , DX , R8W , R9W ], - [XMM0, XMM1, XMM2, XMM3]>>, CCIfType<[i32], CCAssignToRegWithShadow<[ECX , EDX , R8D , R9D ], [XMM0, XMM1, XMM2, XMM3]>>, @@ -851,15 +847,13 @@ def CC_X86_32_MCU : CallingConv<[ ]>; def CC_X86_32_FastCall : CallingConv<[ - // Promote i1 to i8. - CCIfType<[i1], CCPromoteToType>, + // Promote i1/i8/i16/v1i1 arguments to i32. + CCIfType<[i1, i8, i16, v1i1], CCPromoteToType>, // The 'nest' parameter, if any, is passed in EAX. CCIfNest>, // The first 2 integer arguments are passed in ECX/EDX - CCIfInReg>>, - CCIfInReg>>, CCIfInReg>>, // Otherwise, same as everything else. diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 8e9e090..242a008 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -3034,11 +3034,7 @@ SDValue X86TargetLowering::LowerFormalArguments( getv64i1Argument(VA, ArgLocs[++I], Chain, DAG, dl, Subtarget); } else { const TargetRegisterClass *RC; - if (RegVT == MVT::i8) - RC = &X86::GR8RegClass; - else if (RegVT == MVT::i16) - RC = &X86::GR16RegClass; - else if (RegVT == MVT::i32) + if (RegVT == MVT::i32) RC = &X86::GR32RegClass; else if (Is64Bit && RegVT == MVT::i64) RC = &X86::GR64RegClass; diff --git a/llvm/test/CodeGen/X86/avx512-intel-ocl.ll b/llvm/test/CodeGen/X86/avx512-intel-ocl.ll index defedd2..61718fb 100644 --- a/llvm/test/CodeGen/X86/avx512-intel-ocl.ll +++ b/llvm/test/CodeGen/X86/avx512-intel-ocl.ll @@ -420,7 +420,6 @@ define <16 x float> @testf16_inp_mask(<16 x float> %a, i16 %mask) { ; WIN64-KNL-NEXT: subq $40, %rsp ; WIN64-KNL-NEXT: .seh_stackalloc 40 ; WIN64-KNL-NEXT: .seh_endprologue -; WIN64-KNL-NEXT: # kill: def $dx killed $dx def $edx ; WIN64-KNL-NEXT: vmovaps (%rcx), %zmm0 ; WIN64-KNL-NEXT: kmovw %edx, %k1 ; WIN64-KNL-NEXT: callq func_float16_mask @@ -436,7 +435,6 @@ define <16 x float> @testf16_inp_mask(<16 x float> %a, i16 %mask) { ; WIN64-SKX-NEXT: subq $40, %rsp ; WIN64-SKX-NEXT: .seh_stackalloc 40 ; WIN64-SKX-NEXT: .seh_endprologue -; WIN64-SKX-NEXT: # kill: def $dx killed $dx def $edx ; WIN64-SKX-NEXT: vmovaps (%rcx), %zmm0 ; WIN64-SKX-NEXT: kmovd %edx, %k1 ; WIN64-SKX-NEXT: callq func_float16_mask diff --git a/llvm/test/CodeGen/X86/h-registers-0.ll b/llvm/test/CodeGen/X86/h-registers-0.ll index dfd79f3..5f459c3 100644 --- a/llvm/test/CodeGen/X86/h-registers-0.ll +++ b/llvm/test/CodeGen/X86/h-registers-0.ll @@ -98,8 +98,7 @@ define i16 @qux16(i16 inreg %x) nounwind { ; X86-64: movzbl %ah, %eax ; WIN64-LABEL: qux16: -; WIN64: movzwl %cx, %eax -; WIN64: shrl $8, %eax +; WIN64: movzbl %ch, %eax ; X86-32-LABEL: qux16: ; X86-32: movzbl %ah, %eax diff --git a/llvm/test/CodeGen/X86/test-shrink.ll b/llvm/test/CodeGen/X86/test-shrink.ll index 5a59814..e44233f 100644 --- a/llvm/test/CodeGen/X86/test-shrink.ll +++ b/llvm/test/CodeGen/X86/test-shrink.ll @@ -186,7 +186,6 @@ define void @g16xh(i16 inreg %x) nounwind { ; CHECK-WIN32-64-LABEL: g16xh: ; CHECK-WIN32-64: # %bb.0: ; CHECK-WIN32-64-NEXT: subq $40, %rsp -; CHECK-WIN32-64-NEXT: # kill: def $cx killed $cx def $ecx ; CHECK-WIN32-64-NEXT: testl $2048, %ecx # imm = 0x800 ; CHECK-WIN32-64-NEXT: jne .LBB4_2 ; CHECK-WIN32-64-NEXT: # %bb.1: # %yes @@ -229,7 +228,6 @@ define void @g16xl(i16 inreg %x) nounwind { ; CHECK-WIN32-64-LABEL: g16xl: ; CHECK-WIN32-64: # %bb.0: ; CHECK-WIN32-64-NEXT: subq $40, %rsp -; CHECK-WIN32-64-NEXT: # kill: def $cx killed $cx def $ecx ; CHECK-WIN32-64-NEXT: testb $8, %cl ; CHECK-WIN32-64-NEXT: jne .LBB5_2 ; CHECK-WIN32-64-NEXT: # %bb.1: # %yes @@ -499,7 +497,6 @@ define void @truncand32(i16 inreg %x) nounwind { ; CHECK-WIN32-64-LABEL: truncand32: ; CHECK-WIN32-64: # %bb.0: ; CHECK-WIN32-64-NEXT: subq $40, %rsp -; CHECK-WIN32-64-NEXT: # kill: def $cx killed $cx def $ecx ; CHECK-WIN32-64-NEXT: testl $2049, %ecx # imm = 0x801 ; CHECK-WIN32-64-NEXT: je .LBB11_1 ; CHECK-WIN32-64-NEXT: # %bb.2: # %no @@ -546,7 +543,6 @@ define void @testw(i16 inreg %x) nounwind minsize { ; CHECK-WIN32-64-LABEL: testw: ; CHECK-WIN32-64: # %bb.0: ; CHECK-WIN32-64-NEXT: subq $40, %rsp -; CHECK-WIN32-64-NEXT: # kill: def $cx killed $cx def $ecx ; CHECK-WIN32-64-NEXT: testw $2049, %cx # imm = 0x801 ; CHECK-WIN32-64-NEXT: jne .LBB12_2 ; CHECK-WIN32-64-NEXT: # %bb.1: # %yes diff --git a/llvm/test/CodeGen/X86/vec_cast.ll b/llvm/test/CodeGen/X86/vec_cast.ll index f6b1ac1..e6e5982 100644 --- a/llvm/test/CodeGen/X86/vec_cast.ll +++ b/llvm/test/CodeGen/X86/vec_cast.ll @@ -37,9 +37,6 @@ define <3 x i32> @b(<3 x i16> %a) nounwind { ; ; CHECK-WIN-LABEL: b: ; CHECK-WIN: # %bb.0: -; CHECK-WIN-NEXT: # kill: def $r8w killed $r8w def $r8d -; CHECK-WIN-NEXT: # kill: def $dx killed $dx def $edx -; CHECK-WIN-NEXT: # kill: def $cx killed $cx def $ecx ; CHECK-WIN-NEXT: movd %ecx, %xmm0 ; CHECK-WIN-NEXT: pinsrw $1, %edx, %xmm0 ; CHECK-WIN-NEXT: pinsrw $2, %r8d, %xmm0 @@ -61,7 +58,6 @@ define <1 x i32> @c(<1 x i16> %a) nounwind { ; ; CHECK-WIN-LABEL: c: ; CHECK-WIN: # %bb.0: -; CHECK-WIN-NEXT: # kill: def $cx killed $cx def $ecx ; CHECK-WIN-NEXT: movd %ecx, %xmm0 ; CHECK-WIN-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7] ; CHECK-WIN-NEXT: psrad $16, %xmm0 @@ -104,9 +100,6 @@ define <3 x i32> @e(<3 x i16> %a) nounwind { ; ; CHECK-WIN-LABEL: e: ; CHECK-WIN: # %bb.0: -; CHECK-WIN-NEXT: # kill: def $r8w killed $r8w def $r8d -; CHECK-WIN-NEXT: # kill: def $dx killed $dx def $edx -; CHECK-WIN-NEXT: # kill: def $cx killed $cx def $ecx ; CHECK-WIN-NEXT: movd %ecx, %xmm0 ; CHECK-WIN-NEXT: pinsrw $1, %edx, %xmm0 ; CHECK-WIN-NEXT: pinsrw $2, %r8d, %xmm0 @@ -128,7 +121,6 @@ define <1 x i32> @f(<1 x i16> %a) nounwind { ; ; CHECK-WIN-LABEL: f: ; CHECK-WIN: # %bb.0: -; CHECK-WIN-NEXT: # kill: def $cx killed $cx def $ecx ; CHECK-WIN-NEXT: movd %ecx, %xmm0 ; CHECK-WIN-NEXT: pxor %xmm1, %xmm1 ; CHECK-WIN-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] diff --git a/llvm/test/CodeGen/X86/win32-bool.ll b/llvm/test/CodeGen/X86/win32-bool.ll deleted file mode 100644 index 53607ea..0000000 --- a/llvm/test/CodeGen/X86/win32-bool.ll +++ /dev/null @@ -1,33 +0,0 @@ -; RUN: llc < %s -mtriple=i686-windows-msvc | FileCheck %s -; RUN: llc < %s -mtriple=i686-windows-gnu | FileCheck %s - -define x86_fastcallcc i32 @pass_fast_bool(i1 inreg zeroext %b) { -entry: - %cond = select i1 %b, i32 66, i32 0 - ret i32 %cond -} - -; CHECK-LABEL: @pass_fast_bool@4: -; CHECK-DAG: testb %cl, %cl -; CHECK-DAG: movl $66, -; CHECK: retl - -define x86_vectorcallcc i32 @pass_vector_bool(i1 inreg zeroext %b) { -entry: - %cond = select i1 %b, i32 66, i32 0 - ret i32 %cond -} - -; CHECK-LABEL: pass_vector_bool@@4: -; CHECK-DAG: testb %cl, %cl -; CHECK-DAG: movl $66, -; CHECK: retl - -define zeroext i1 @ret_true() { -entry: - ret i1 true -} - -; CHECK-LABEL: ret_true: -; CHECK: movb $1, %al -; CHECK: retl diff --git a/llvm/test/CodeGen/X86/win64-bool.ll b/llvm/test/CodeGen/X86/win64-bool.ll deleted file mode 100644 index cb77c7e..0000000 --- a/llvm/test/CodeGen/X86/win64-bool.ll +++ /dev/null @@ -1,23 +0,0 @@ -; RUN: llc < %s -mtriple=x86_64-windows-msvc | FileCheck %s --check-prefix=CHECK -; RUN: llc < %s -mtriple=x86_64-windows-gnu | FileCheck %s --check-prefix=CHECK - -define i32 @pass_bool(i1 zeroext %b) { -entry: - %cond = select i1 %b, i32 66, i32 0 - ret i32 %cond -} - -; CHECK-LABEL: pass_bool: -; CHECK-DAG: testb %cl, %cl -; CHECK-DAG: movl $66, -; CHECK: cmovel {{.*}}, %eax -; CHECK: retq - -define zeroext i1 @ret_true() { -entry: - ret i1 true -} - -; CHECK-LABEL: ret_true: -; CHECK: movb $1, %al -; CHECK: retq diff --git a/llvm/test/CodeGen/X86/xor.ll b/llvm/test/CodeGen/X86/xor.ll index f73fdb2..6f0f0df 100644 --- a/llvm/test/CodeGen/X86/xor.ll +++ b/llvm/test/CodeGen/X86/xor.ll @@ -167,8 +167,6 @@ define i16 @test5(i16 %a, i16 %b) nounwind { ; ; X64-WIN-LABEL: test5: ; X64-WIN: # %bb.0: # %entry -; X64-WIN-NEXT: # kill: def $dx killed $dx def $edx -; X64-WIN-NEXT: # kill: def $cx killed $cx def $ecx ; X64-WIN-NEXT: .p2align 4, 0x90 ; X64-WIN-NEXT: .LBB4_1: # %bb ; X64-WIN-NEXT: # =>This Inner Loop Header: Depth=1 @@ -429,8 +427,7 @@ define i32 @PR17487(i1 %tobool) { ; ; X64-WIN-LABEL: PR17487: ; X64-WIN: # %bb.0: -; X64-WIN-NEXT: movzbl %cl, %eax -; X64-WIN-NEXT: movd %eax, %xmm0 +; X64-WIN-NEXT: movd %ecx, %xmm0 ; X64-WIN-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] ; X64-WIN-NEXT: pandn __xmm@{{.*}}(%rip), %xmm0 ; X64-WIN-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] -- 2.7.4