Skip to content
This repository was archived by the owner on Apr 23, 2020. It is now read-only.

Commit a7f9439

Browse files
committed
[X86] Promote 16-bit cmovs to 32-bits
This allows us to avoid an opsize prefix. And forcing some move immediates to i32 avoids a length changing prefix on those instructions. This mostly replaces the existing combine we had for zext/sext+cmov of constants. I left in a case for sign extending a 32 bit cmov of constants to 64 bits. Differential Revision: https://reviews.llvm.org/D43327 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325601 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 35c4cd1 commit a7f9439

File tree

7 files changed

+86
-34
lines changed

7 files changed

+86
-34
lines changed

lib/Target/X86/X86ISelLowering.cpp

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18713,6 +18713,15 @@ SDValue X86TargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
1871318713
}
1871418714
}
1871518715

18716+
// Promote i16 cmovs if it won't prevent folding a load.
18717+
if (Op.getValueType() == MVT::i16 && !MayFoldLoad(Op1) && !MayFoldLoad(Op2)) {
18718+
Op1 = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i32, Op1);
18719+
Op2 = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i32, Op2);
18720+
SDValue Ops[] = { Op2, Op1, CC, Cond };
18721+
SDValue Cmov = DAG.getNode(X86ISD::CMOV, DL, MVT::i32, Ops);
18722+
return DAG.getNode(ISD::TRUNCATE, DL, Op.getValueType(), Cmov);
18723+
}
18724+
1871618725
// X86ISD::CMOV means set the result (which is operand 1) to the RHS if
1871718726
// condition is true.
1871818727
SDValue Ops[] = { Op2, Op1, CC, Cond };
@@ -35935,12 +35944,54 @@ static SDValue combineBT(SDNode *N, SelectionDAG &DAG,
3593535944
return SDValue();
3593635945
}
3593735946

35938-
static SDValue combineSignExtendInReg(SDNode *N, SelectionDAG &DAG,
35939-
const X86Subtarget &Subtarget) {
35947+
// Try to combine sext_in_reg of a cmov of constants by extending the constants.
35948+
static SDValue combineSextInRegCmov(SDNode *N, SelectionDAG &DAG) {
3594035949
EVT VT = N->getValueType(0);
35941-
if (!VT.isVector())
35950+
35951+
SDValue N0 = N->getOperand(0);
35952+
SDValue N1 = N->getOperand(1);
35953+
EVT ExtraVT = cast<VTSDNode>(N1)->getVT();
35954+
35955+
if (ExtraVT != MVT::i16)
35956+
return SDValue();
35957+
35958+
// Look through single use any_extends.
35959+
if (N0.getOpcode() == ISD::ANY_EXTEND && N0.hasOneUse())
35960+
N0 = N0.getOperand(0);
35961+
35962+
// See if we have a single use cmov.
35963+
if (N0.getOpcode() != X86ISD::CMOV || !N0.hasOneUse())
35964+
return SDValue();
35965+
35966+
SDValue CMovOp0 = N0.getOperand(0);
35967+
SDValue CMovOp1 = N0.getOperand(1);
35968+
35969+
// Make sure both operands are constants.
35970+
if (!isa<ConstantSDNode>(CMovOp0.getNode()) ||
35971+
!isa<ConstantSDNode>(CMovOp1.getNode()))
3594235972
return SDValue();
3594335973

35974+
SDLoc DL(N);
35975+
35976+
// If we looked through an any_extend above, add one to the constants.
35977+
if (N0.getValueType() != VT) {
35978+
CMovOp0 = DAG.getNode(ISD::ANY_EXTEND, DL, VT, CMovOp0);
35979+
CMovOp1 = DAG.getNode(ISD::ANY_EXTEND, DL, VT, CMovOp1);
35980+
}
35981+
35982+
CMovOp0 = DAG.getNode(ISD::SIGN_EXTEND_INREG, DL, VT, CMovOp0, N1);
35983+
CMovOp1 = DAG.getNode(ISD::SIGN_EXTEND_INREG, DL, VT, CMovOp1, N1);
35984+
35985+
return DAG.getNode(X86ISD::CMOV, DL, VT, CMovOp0, CMovOp1,
35986+
N0.getOperand(2), N0.getOperand(3));
35987+
}
35988+
35989+
static SDValue combineSignExtendInReg(SDNode *N, SelectionDAG &DAG,
35990+
const X86Subtarget &Subtarget) {
35991+
if (SDValue V = combineSextInRegCmov(N, DAG))
35992+
return V;
35993+
35994+
EVT VT = N->getValueType(0);
3594435995
SDValue N0 = N->getOperand(0);
3594535996
SDValue N1 = N->getOperand(1);
3594635997
EVT ExtraVT = cast<VTSDNode>(N1)->getVT();

test/CodeGen/X86/avx512-insert-extract.ll

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,8 +287,9 @@ define i16 @test15(i1 *%addr) {
287287
; CHECK: ## %bb.0:
288288
; CHECK-NEXT: xorl %ecx, %ecx
289289
; CHECK-NEXT: cmpb $0, (%rdi)
290-
; CHECK-NEXT: movw $-1, %ax
291-
; CHECK-NEXT: cmovew %cx, %ax
290+
; CHECK-NEXT: movl $65535, %eax ## imm = 0xFFFF
291+
; CHECK-NEXT: cmovel %ecx, %eax
292+
; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax
292293
; CHECK-NEXT: retq
293294
%x = load i1 , i1 * %addr, align 1
294295
%x1 = insertelement <16 x i1> undef, i1 %x, i32 10

test/CodeGen/X86/avx512-mask-op.ll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -818,9 +818,9 @@ define <16 x i1> @test15(i32 %x, i32 %y) {
818818
; KNL-LABEL: test15:
819819
; KNL: ## %bb.0:
820820
; KNL-NEXT: cmpl %esi, %edi
821-
; KNL-NEXT: movw $21845, %ax ## imm = 0x5555
822-
; KNL-NEXT: movw $1, %cx
823-
; KNL-NEXT: cmovgw %ax, %cx
821+
; KNL-NEXT: movl $21845, %eax ## imm = 0x5555
822+
; KNL-NEXT: movl $1, %ecx
823+
; KNL-NEXT: cmovgl %eax, %ecx
824824
; KNL-NEXT: kmovw %ecx, %k1
825825
; KNL-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
826826
; KNL-NEXT: vpmovdb %zmm0, %xmm0
@@ -830,19 +830,19 @@ define <16 x i1> @test15(i32 %x, i32 %y) {
830830
; SKX-LABEL: test15:
831831
; SKX: ## %bb.0:
832832
; SKX-NEXT: cmpl %esi, %edi
833-
; SKX-NEXT: movw $21845, %ax ## imm = 0x5555
834-
; SKX-NEXT: movw $1, %cx
835-
; SKX-NEXT: cmovgw %ax, %cx
833+
; SKX-NEXT: movl $21845, %eax ## imm = 0x5555
834+
; SKX-NEXT: movl $1, %ecx
835+
; SKX-NEXT: cmovgl %eax, %ecx
836836
; SKX-NEXT: kmovd %ecx, %k0
837837
; SKX-NEXT: vpmovm2b %k0, %xmm0
838838
; SKX-NEXT: retq
839839
;
840840
; AVX512BW-LABEL: test15:
841841
; AVX512BW: ## %bb.0:
842842
; AVX512BW-NEXT: cmpl %esi, %edi
843-
; AVX512BW-NEXT: movw $21845, %ax ## imm = 0x5555
844-
; AVX512BW-NEXT: movw $1, %cx
845-
; AVX512BW-NEXT: cmovgw %ax, %cx
843+
; AVX512BW-NEXT: movl $21845, %eax ## imm = 0x5555
844+
; AVX512BW-NEXT: movl $1, %ecx
845+
; AVX512BW-NEXT: cmovgl %eax, %ecx
846846
; AVX512BW-NEXT: kmovd %ecx, %k0
847847
; AVX512BW-NEXT: vpmovm2b %k0, %zmm0
848848
; AVX512BW-NEXT: ## kill: def $xmm0 killed $xmm0 killed $zmm0
@@ -852,9 +852,9 @@ define <16 x i1> @test15(i32 %x, i32 %y) {
852852
; AVX512DQ-LABEL: test15:
853853
; AVX512DQ: ## %bb.0:
854854
; AVX512DQ-NEXT: cmpl %esi, %edi
855-
; AVX512DQ-NEXT: movw $21845, %ax ## imm = 0x5555
856-
; AVX512DQ-NEXT: movw $1, %cx
857-
; AVX512DQ-NEXT: cmovgw %ax, %cx
855+
; AVX512DQ-NEXT: movl $21845, %eax ## imm = 0x5555
856+
; AVX512DQ-NEXT: movl $1, %ecx
857+
; AVX512DQ-NEXT: cmovgl %eax, %ecx
858858
; AVX512DQ-NEXT: kmovw %ecx, %k0
859859
; AVX512DQ-NEXT: vpmovm2d %k0, %zmm0
860860
; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0

test/CodeGen/X86/avx512-schedule.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7201,21 +7201,21 @@ define <16 x i1> @vmov_test15(i32 %x, i32 %y) {
72017201
; GENERIC-LABEL: vmov_test15:
72027202
; GENERIC: # %bb.0:
72037203
; GENERIC-NEXT: cmpl %esi, %edi # sched: [1:0.33]
7204-
; GENERIC-NEXT: movw $21845, %ax # imm = 0x5555
7204+
; GENERIC-NEXT: movl $21845, %eax # imm = 0x5555
72057205
; GENERIC-NEXT: # sched: [1:0.33]
7206-
; GENERIC-NEXT: movw $1, %cx # sched: [1:0.33]
7207-
; GENERIC-NEXT: cmovgw %ax, %cx # sched: [2:0.67]
7206+
; GENERIC-NEXT: movl $1, %ecx # sched: [1:0.33]
7207+
; GENERIC-NEXT: cmovgl %eax, %ecx # sched: [2:0.67]
72087208
; GENERIC-NEXT: kmovd %ecx, %k0 # sched: [1:0.33]
72097209
; GENERIC-NEXT: vpmovm2b %k0, %xmm0 # sched: [1:0.33]
72107210
; GENERIC-NEXT: retq # sched: [1:1.00]
72117211
;
72127212
; SKX-LABEL: vmov_test15:
72137213
; SKX: # %bb.0:
72147214
; SKX-NEXT: cmpl %esi, %edi # sched: [1:0.25]
7215-
; SKX-NEXT: movw $21845, %ax # imm = 0x5555
7215+
; SKX-NEXT: movl $21845, %eax # imm = 0x5555
72167216
; SKX-NEXT: # sched: [1:0.25]
7217-
; SKX-NEXT: movw $1, %cx # sched: [1:0.25]
7218-
; SKX-NEXT: cmovgw %ax, %cx # sched: [1:0.50]
7217+
; SKX-NEXT: movl $1, %ecx # sched: [1:0.25]
7218+
; SKX-NEXT: cmovgl %eax, %ecx # sched: [1:0.50]
72197219
; SKX-NEXT: kmovd %ecx, %k0 # sched: [1:1.00]
72207220
; SKX-NEXT: vpmovm2b %k0, %xmm0 # sched: [1:0.25]
72217221
; SKX-NEXT: retq # sched: [7:1.00]

test/CodeGen/X86/bool-simplify.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ define i16 @rnd16(i16 %arg) nounwind {
5353
; CHECK: # %bb.0:
5454
; CHECK-NEXT: xorl %eax, %eax
5555
; CHECK-NEXT: rdrandw %cx
56-
; CHECK-NEXT: cmovbw %di, %ax
56+
; CHECK-NEXT: cmovbl %edi, %eax
5757
; CHECK-NEXT: addl %ecx, %eax
5858
; CHECK-NEXT: # kill: def $ax killed $ax killed $eax
5959
; CHECK-NEXT: retq
@@ -105,7 +105,7 @@ define i16 @seed16(i16 %arg) nounwind {
105105
; CHECK: # %bb.0:
106106
; CHECK-NEXT: xorl %eax, %eax
107107
; CHECK-NEXT: rdseedw %cx
108-
; CHECK-NEXT: cmovbw %di, %ax
108+
; CHECK-NEXT: cmovbl %edi, %eax
109109
; CHECK-NEXT: addl %ecx, %eax
110110
; CHECK-NEXT: # kill: def $ax killed $ax killed $eax
111111
; CHECK-NEXT: retq

test/CodeGen/X86/select.ll

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -938,8 +938,8 @@ define void @clamp(i32 %src, i16* %dst) {
938938
; GENERIC-NEXT: movl $32767, %eax ## imm = 0x7FFF
939939
; GENERIC-NEXT: cmovlel %edi, %eax
940940
; GENERIC-NEXT: cmpl $-32768, %eax ## imm = 0x8000
941-
; GENERIC-NEXT: movw $-32768, %cx ## imm = 0x8000
942-
; GENERIC-NEXT: cmovgew %ax, %cx
941+
; GENERIC-NEXT: movl $32768, %ecx ## imm = 0x8000
942+
; GENERIC-NEXT: cmovgel %eax, %ecx
943943
; GENERIC-NEXT: movw %cx, (%rsi)
944944
; GENERIC-NEXT: retq
945945
;
@@ -948,9 +948,9 @@ define void @clamp(i32 %src, i16* %dst) {
948948
; ATOM-NEXT: cmpl $32767, %edi ## imm = 0x7FFF
949949
; ATOM-NEXT: movl $32767, %eax ## imm = 0x7FFF
950950
; ATOM-NEXT: cmovlel %edi, %eax
951-
; ATOM-NEXT: movw $-32768, %cx ## imm = 0x8000
951+
; ATOM-NEXT: movl $32768, %ecx ## imm = 0x8000
952952
; ATOM-NEXT: cmpl $-32768, %eax ## imm = 0x8000
953-
; ATOM-NEXT: cmovgew %ax, %cx
953+
; ATOM-NEXT: cmovgel %eax, %ecx
954954
; ATOM-NEXT: movw %cx, (%rsi)
955955
; ATOM-NEXT: retq
956956
;
@@ -963,7 +963,7 @@ define void @clamp(i32 %src, i16* %dst) {
963963
; MCU-NEXT: movl %eax, %ecx
964964
; MCU-NEXT: .LBB23_2:
965965
; MCU-NEXT: cmpl $-32768, %ecx # imm = 0x8000
966-
; MCU-NEXT: movw $-32768, %ax # imm = 0x8000
966+
; MCU-NEXT: movl $32768, %eax # imm = 0x8000
967967
; MCU-NEXT: jl .LBB23_4
968968
; MCU-NEXT: # %bb.3:
969969
; MCU-NEXT: movl %ecx, %eax
@@ -1063,8 +1063,8 @@ define i16 @select_xor_1(i16 %A, i8 %cond) {
10631063
; CHECK-NEXT: movl %edi, %eax
10641064
; CHECK-NEXT: xorl $43, %eax
10651065
; CHECK-NEXT: testb $1, %sil
1066-
; CHECK-NEXT: cmovnew %ax, %di
1067-
; CHECK-NEXT: movl %edi, %eax
1066+
; CHECK-NEXT: cmovel %edi, %eax
1067+
; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax
10681068
; CHECK-NEXT: retq
10691069
;
10701070
; MCU-LABEL: select_xor_1:

test/CodeGen/X86/setcc-lowering.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,15 @@ define void @pr26232(i64 %a, <16 x i1> %b) {
7373
; KNL-32-NEXT: vptestmd %zmm0, %zmm0, %k0
7474
; KNL-32-NEXT: movl {{[0-9]+}}(%esp), %eax
7575
; KNL-32-NEXT: movl {{[0-9]+}}(%esp), %ecx
76-
; KNL-32-NEXT: movw $-1, %dx
76+
; KNL-32-NEXT: movl $65535, %edx # imm = 0xFFFF
7777
; KNL-32-NEXT: .p2align 4, 0x90
7878
; KNL-32-NEXT: .LBB1_1: # %for_loop599
7979
; KNL-32-NEXT: # =>This Inner Loop Header: Depth=1
8080
; KNL-32-NEXT: cmpl $65536, %ecx # imm = 0x10000
8181
; KNL-32-NEXT: movl %eax, %esi
8282
; KNL-32-NEXT: sbbl $0, %esi
8383
; KNL-32-NEXT: movl $0, %esi
84-
; KNL-32-NEXT: cmovlw %dx, %si
84+
; KNL-32-NEXT: cmovll %edx, %esi
8585
; KNL-32-NEXT: kmovw %esi, %k1
8686
; KNL-32-NEXT: kandw %k0, %k1, %k1
8787
; KNL-32-NEXT: kortestw %k1, %k1

0 commit comments

Comments
 (0)