Skip to content

Commit cca4966

Browse files
authored
[FastISel][X86] Use getTypeForExtReturn in GetReturnInfo. (#80803)
The comment and code here seems to match getTypeForExtReturn. The history shows that at the time this code was added, similar code existed in SelectionDAGBuilder. SelectionDAGBuiler code has since been refactored into getTypeForExtReturn. This patch makes FastISel match SelectionDAGBuilder. The test changes are because X86 has customization of getTypeForExtReturn. So now we only extend returns to i8. Stumbled onto this difference by accident.
1 parent 6b2fd7a commit cca4966

11 files changed

+140
-297
lines changed

llvm/lib/CodeGen/TargetLoweringBase.cpp

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1738,15 +1738,8 @@ void llvm::GetReturnInfo(CallingConv::ID CC, Type *ReturnType,
17381738
else if (attr.hasRetAttr(Attribute::ZExt))
17391739
ExtendKind = ISD::ZERO_EXTEND;
17401740

1741-
// FIXME: C calling convention requires the return type to be promoted to
1742-
// at least 32-bit. But this is not necessary for non-C calling
1743-
// conventions. The frontend should mark functions whose return values
1744-
// require promoting with signext or zeroext attributes.
1745-
if (ExtendKind != ISD::ANY_EXTEND && VT.isInteger()) {
1746-
MVT MinVT = TLI.getRegisterType(MVT::i32);
1747-
if (VT.bitsLT(MinVT))
1748-
VT = MinVT;
1749-
}
1741+
if (ExtendKind != ISD::ANY_EXTEND && VT.isInteger())
1742+
VT = TLI.getTypeForExtReturn(ReturnType->getContext(), VT, ExtendKind);
17501743

17511744
unsigned NumParts =
17521745
TLI.getNumRegistersForCallingConv(ReturnType->getContext(), CC, VT);

llvm/lib/Target/X86/X86FastISel.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1250,19 +1250,18 @@ bool X86FastISel::X86SelectRet(const Instruction *I) {
12501250
if (!Outs[0].Flags.isZExt() && !Outs[0].Flags.isSExt())
12511251
return false;
12521252

1253-
assert(DstVT == MVT::i32 && "X86 should always ext to i32");
1254-
12551253
if (SrcVT == MVT::i1) {
12561254
if (Outs[0].Flags.isSExt())
12571255
return false;
1258-
// TODO
12591256
SrcReg = fastEmitZExtFromI1(MVT::i8, SrcReg);
12601257
SrcVT = MVT::i8;
12611258
}
1262-
unsigned Op = Outs[0].Flags.isZExt() ? ISD::ZERO_EXTEND :
1263-
ISD::SIGN_EXTEND;
1264-
// TODO
1265-
SrcReg = fastEmit_r(SrcVT.getSimpleVT(), DstVT.getSimpleVT(), Op, SrcReg);
1259+
if (SrcVT != DstVT) {
1260+
unsigned Op =
1261+
Outs[0].Flags.isZExt() ? ISD::ZERO_EXTEND : ISD::SIGN_EXTEND;
1262+
SrcReg =
1263+
fastEmit_r(SrcVT.getSimpleVT(), DstVT.getSimpleVT(), Op, SrcReg);
1264+
}
12661265
}
12671266

12681267
// Make the copy.

llvm/test/CodeGen/X86/avx512-intrinsics-fast-isel.ll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ define zeroext i16 @test_mm512_kunpackb(<8 x i64> %__A, <8 x i64> %__B, <8 x i64
2121
; X86-NEXT: kunpckbw %k0, %k1, %k1
2222
; X86-NEXT: vpcmpneqd 72(%ebp), %zmm3, %k0 {%k1}
2323
; X86-NEXT: kmovw %k0, %eax
24-
; X86-NEXT: movzwl %ax, %eax
24+
; X86-NEXT: # kill: def $ax killed $ax killed $eax
2525
; X86-NEXT: movl %ebp, %esp
2626
; X86-NEXT: popl %ebp
2727
; X86-NEXT: .cfi_def_cfa %esp, 4
@@ -35,7 +35,7 @@ define zeroext i16 @test_mm512_kunpackb(<8 x i64> %__A, <8 x i64> %__B, <8 x i64
3535
; X64-NEXT: kunpckbw %k0, %k1, %k1
3636
; X64-NEXT: vpcmpneqd %zmm5, %zmm4, %k0 {%k1}
3737
; X64-NEXT: kmovw %k0, %eax
38-
; X64-NEXT: movzwl %ax, %eax
38+
; X64-NEXT: # kill: def $ax killed $ax killed $eax
3939
; X64-NEXT: vzeroupper
4040
; X64-NEXT: retq
4141
entry:
@@ -367,7 +367,7 @@ define zeroext i16 @test_mm512_testn_epi32_mask(<8 x i64> %__A, <8 x i64> %__B)
367367
; CHECK: # %bb.0: # %entry
368368
; CHECK-NEXT: vptestnmd %zmm0, %zmm1, %k0
369369
; CHECK-NEXT: kmovw %k0, %eax
370-
; CHECK-NEXT: movzwl %ax, %eax
370+
; CHECK-NEXT: # kill: def $ax killed $ax killed $eax
371371
; CHECK-NEXT: vzeroupper
372372
; CHECK-NEXT: ret{{[l|q]}}
373373
entry:
@@ -385,7 +385,7 @@ define zeroext i16 @test_mm512_mask_testn_epi32_mask(i16 zeroext %__U, <8 x i64>
385385
; X86-NEXT: kmovw %eax, %k1
386386
; X86-NEXT: vptestnmd %zmm0, %zmm1, %k0 {%k1}
387387
; X86-NEXT: kmovw %k0, %eax
388-
; X86-NEXT: movzwl %ax, %eax
388+
; X86-NEXT: # kill: def $ax killed $ax killed $eax
389389
; X86-NEXT: vzeroupper
390390
; X86-NEXT: retl
391391
;
@@ -394,7 +394,7 @@ define zeroext i16 @test_mm512_mask_testn_epi32_mask(i16 zeroext %__U, <8 x i64>
394394
; X64-NEXT: kmovw %edi, %k1
395395
; X64-NEXT: vptestnmd %zmm0, %zmm1, %k0 {%k1}
396396
; X64-NEXT: kmovw %k0, %eax
397-
; X64-NEXT: movzwl %ax, %eax
397+
; X64-NEXT: # kill: def $ax killed $ax killed $eax
398398
; X64-NEXT: vzeroupper
399399
; X64-NEXT: retq
400400
entry:
@@ -412,7 +412,7 @@ define zeroext i8 @test_mm512_testn_epi64_mask(<8 x i64> %__A, <8 x i64> %__B) {
412412
; CHECK: # %bb.0: # %entry
413413
; CHECK-NEXT: vptestnmq %zmm0, %zmm1, %k0
414414
; CHECK-NEXT: kmovw %k0, %eax
415-
; CHECK-NEXT: movzbl %al, %eax
415+
; CHECK-NEXT: # kill: def $al killed $al killed $eax
416416
; CHECK-NEXT: vzeroupper
417417
; CHECK-NEXT: ret{{[l|q]}}
418418
entry:
@@ -429,7 +429,7 @@ define zeroext i8 @test_mm512_mask_testn_epi64_mask(i8 zeroext %__U, <8 x i64> %
429429
; X86-NEXT: kmovw %eax, %k1
430430
; X86-NEXT: vptestnmq %zmm0, %zmm1, %k0 {%k1}
431431
; X86-NEXT: kmovw %k0, %eax
432-
; X86-NEXT: movzbl %al, %eax
432+
; X86-NEXT: # kill: def $al killed $al killed $eax
433433
; X86-NEXT: vzeroupper
434434
; X86-NEXT: retl
435435
;
@@ -438,7 +438,7 @@ define zeroext i8 @test_mm512_mask_testn_epi64_mask(i8 zeroext %__U, <8 x i64> %
438438
; X64-NEXT: kmovw %edi, %k1
439439
; X64-NEXT: vptestnmq %zmm0, %zmm1, %k0 {%k1}
440440
; X64-NEXT: kmovw %k0, %eax
441-
; X64-NEXT: movzbl %al, %eax
441+
; X64-NEXT: # kill: def $al killed $al killed $eax
442442
; X64-NEXT: vzeroupper
443443
; X64-NEXT: retq
444444
entry:
@@ -457,7 +457,7 @@ define zeroext i16 @test_mm512_mask_test_epi32_mask(i16 zeroext %__U, <8 x i64>
457457
; X86-NEXT: kmovw %eax, %k1
458458
; X86-NEXT: vptestmd %zmm0, %zmm1, %k0 {%k1}
459459
; X86-NEXT: kmovw %k0, %eax
460-
; X86-NEXT: movzwl %ax, %eax
460+
; X86-NEXT: # kill: def $ax killed $ax killed $eax
461461
; X86-NEXT: vzeroupper
462462
; X86-NEXT: retl
463463
;
@@ -466,7 +466,7 @@ define zeroext i16 @test_mm512_mask_test_epi32_mask(i16 zeroext %__U, <8 x i64>
466466
; X64-NEXT: kmovw %edi, %k1
467467
; X64-NEXT: vptestmd %zmm0, %zmm1, %k0 {%k1}
468468
; X64-NEXT: kmovw %k0, %eax
469-
; X64-NEXT: movzwl %ax, %eax
469+
; X64-NEXT: # kill: def $ax killed $ax killed $eax
470470
; X64-NEXT: vzeroupper
471471
; X64-NEXT: retq
472472
entry:
@@ -486,7 +486,7 @@ define zeroext i8 @test_mm512_mask_test_epi64_mask(i8 zeroext %__U, <8 x i64> %_
486486
; X86-NEXT: kmovw %eax, %k1
487487
; X86-NEXT: vptestmq %zmm0, %zmm1, %k0 {%k1}
488488
; X86-NEXT: kmovw %k0, %eax
489-
; X86-NEXT: movzbl %al, %eax
489+
; X86-NEXT: # kill: def $al killed $al killed $eax
490490
; X86-NEXT: vzeroupper
491491
; X86-NEXT: retl
492492
;
@@ -495,7 +495,7 @@ define zeroext i8 @test_mm512_mask_test_epi64_mask(i8 zeroext %__U, <8 x i64> %_
495495
; X64-NEXT: kmovw %edi, %k1
496496
; X64-NEXT: vptestmq %zmm0, %zmm1, %k0 {%k1}
497497
; X64-NEXT: kmovw %k0, %eax
498-
; X64-NEXT: movzbl %al, %eax
498+
; X64-NEXT: # kill: def $al killed $al killed $eax
499499
; X64-NEXT: vzeroupper
500500
; X64-NEXT: retq
501501
entry:

llvm/test/CodeGen/X86/avx512bwvl-intrinsics-fast-isel.ll

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ define zeroext i16 @test_mm_test_epi8_mask(<2 x i64> %__A, <2 x i64> %__B) {
99
; CHECK: # %bb.0: # %entry
1010
; CHECK-NEXT: vptestmb %xmm0, %xmm1, %k0
1111
; CHECK-NEXT: kmovd %k0, %eax
12-
; CHECK-NEXT: movzwl %ax, %eax
12+
; CHECK-NEXT: # kill: def $ax killed $ax killed $eax
1313
; CHECK-NEXT: ret{{[l|q]}}
1414
entry:
1515
%and.i.i = and <2 x i64> %__B, %__A
@@ -25,15 +25,15 @@ define zeroext i16 @test_mm_mask_test_epi8_mask(i16 zeroext %__U, <2 x i64> %__A
2525
; X86-NEXT: kmovw {{[0-9]+}}(%esp), %k1
2626
; X86-NEXT: vptestmb %xmm0, %xmm1, %k0 {%k1}
2727
; X86-NEXT: kmovd %k0, %eax
28-
; X86-NEXT: movzwl %ax, %eax
28+
; X86-NEXT: # kill: def $ax killed $ax killed $eax
2929
; X86-NEXT: retl
3030
;
3131
; X64-LABEL: test_mm_mask_test_epi8_mask:
3232
; X64: # %bb.0: # %entry
3333
; X64-NEXT: kmovd %edi, %k1
3434
; X64-NEXT: vptestmb %xmm0, %xmm1, %k0 {%k1}
3535
; X64-NEXT: kmovd %k0, %eax
36-
; X64-NEXT: movzwl %ax, %eax
36+
; X64-NEXT: # kill: def $ax killed $ax killed $eax
3737
; X64-NEXT: retq
3838
entry:
3939
%and.i.i = and <2 x i64> %__B, %__A
@@ -91,7 +91,7 @@ define zeroext i8 @test_mm_test_epi16_mask(<2 x i64> %__A, <2 x i64> %__B) {
9191
; CHECK: # %bb.0: # %entry
9292
; CHECK-NEXT: vptestmw %xmm0, %xmm1, %k0
9393
; CHECK-NEXT: kmovd %k0, %eax
94-
; CHECK-NEXT: movzbl %al, %eax
94+
; CHECK-NEXT: # kill: def $al killed $al killed $eax
9595
; CHECK-NEXT: ret{{[l|q]}}
9696
entry:
9797
%and.i.i = and <2 x i64> %__B, %__A
@@ -108,15 +108,15 @@ define zeroext i8 @test_mm_mask_test_epi16_mask(i8 zeroext %__U, <2 x i64> %__A,
108108
; X86-NEXT: kmovd %eax, %k1
109109
; X86-NEXT: vptestmw %xmm0, %xmm1, %k0 {%k1}
110110
; X86-NEXT: kmovd %k0, %eax
111-
; X86-NEXT: movzbl %al, %eax
111+
; X86-NEXT: # kill: def $al killed $al killed $eax
112112
; X86-NEXT: retl
113113
;
114114
; X64-LABEL: test_mm_mask_test_epi16_mask:
115115
; X64: # %bb.0: # %entry
116116
; X64-NEXT: kmovd %edi, %k1
117117
; X64-NEXT: vptestmw %xmm0, %xmm1, %k0 {%k1}
118118
; X64-NEXT: kmovd %k0, %eax
119-
; X64-NEXT: movzbl %al, %eax
119+
; X64-NEXT: # kill: def $al killed $al killed $eax
120120
; X64-NEXT: retq
121121
entry:
122122
%and.i.i = and <2 x i64> %__B, %__A
@@ -133,7 +133,7 @@ define zeroext i16 @test_mm256_test_epi16_mask(<4 x i64> %__A, <4 x i64> %__B) {
133133
; CHECK: # %bb.0: # %entry
134134
; CHECK-NEXT: vptestmw %ymm0, %ymm1, %k0
135135
; CHECK-NEXT: kmovd %k0, %eax
136-
; CHECK-NEXT: movzwl %ax, %eax
136+
; CHECK-NEXT: # kill: def $ax killed $ax killed $eax
137137
; CHECK-NEXT: vzeroupper
138138
; CHECK-NEXT: ret{{[l|q]}}
139139
entry:
@@ -150,7 +150,7 @@ define zeroext i16 @test_mm256_mask_test_epi16_mask(i16 zeroext %__U, <4 x i64>
150150
; X86-NEXT: kmovw {{[0-9]+}}(%esp), %k1
151151
; X86-NEXT: vptestmw %ymm0, %ymm1, %k0 {%k1}
152152
; X86-NEXT: kmovd %k0, %eax
153-
; X86-NEXT: movzwl %ax, %eax
153+
; X86-NEXT: # kill: def $ax killed $ax killed $eax
154154
; X86-NEXT: vzeroupper
155155
; X86-NEXT: retl
156156
;
@@ -159,7 +159,7 @@ define zeroext i16 @test_mm256_mask_test_epi16_mask(i16 zeroext %__U, <4 x i64>
159159
; X64-NEXT: kmovd %edi, %k1
160160
; X64-NEXT: vptestmw %ymm0, %ymm1, %k0 {%k1}
161161
; X64-NEXT: kmovd %k0, %eax
162-
; X64-NEXT: movzwl %ax, %eax
162+
; X64-NEXT: # kill: def $ax killed $ax killed $eax
163163
; X64-NEXT: vzeroupper
164164
; X64-NEXT: retq
165165
entry:
@@ -177,7 +177,7 @@ define zeroext i16 @test_mm_testn_epi8_mask(<2 x i64> %__A, <2 x i64> %__B) {
177177
; CHECK: # %bb.0: # %entry
178178
; CHECK-NEXT: vptestnmb %xmm0, %xmm1, %k0
179179
; CHECK-NEXT: kmovd %k0, %eax
180-
; CHECK-NEXT: movzwl %ax, %eax
180+
; CHECK-NEXT: # kill: def $ax killed $ax killed $eax
181181
; CHECK-NEXT: ret{{[l|q]}}
182182
entry:
183183
%and.i.i = and <2 x i64> %__B, %__A
@@ -193,15 +193,15 @@ define zeroext i16 @test_mm_mask_testn_epi8_mask(i16 zeroext %__U, <2 x i64> %__
193193
; X86-NEXT: kmovw {{[0-9]+}}(%esp), %k1
194194
; X86-NEXT: vptestnmb %xmm0, %xmm1, %k0 {%k1}
195195
; X86-NEXT: kmovd %k0, %eax
196-
; X86-NEXT: movzwl %ax, %eax
196+
; X86-NEXT: # kill: def $ax killed $ax killed $eax
197197
; X86-NEXT: retl
198198
;
199199
; X64-LABEL: test_mm_mask_testn_epi8_mask:
200200
; X64: # %bb.0: # %entry
201201
; X64-NEXT: kmovd %edi, %k1
202202
; X64-NEXT: vptestnmb %xmm0, %xmm1, %k0 {%k1}
203203
; X64-NEXT: kmovd %k0, %eax
204-
; X64-NEXT: movzwl %ax, %eax
204+
; X64-NEXT: # kill: def $ax killed $ax killed $eax
205205
; X64-NEXT: retq
206206
entry:
207207
%and.i.i = and <2 x i64> %__B, %__A
@@ -259,7 +259,7 @@ define zeroext i8 @test_mm_testn_epi16_mask(<2 x i64> %__A, <2 x i64> %__B) {
259259
; CHECK: # %bb.0: # %entry
260260
; CHECK-NEXT: vptestnmw %xmm0, %xmm1, %k0
261261
; CHECK-NEXT: kmovd %k0, %eax
262-
; CHECK-NEXT: movzbl %al, %eax
262+
; CHECK-NEXT: # kill: def $al killed $al killed $eax
263263
; CHECK-NEXT: ret{{[l|q]}}
264264
entry:
265265
%and.i.i = and <2 x i64> %__B, %__A
@@ -276,15 +276,15 @@ define zeroext i8 @test_mm_mask_testn_epi16_mask(i8 zeroext %__U, <2 x i64> %__A
276276
; X86-NEXT: kmovd %eax, %k1
277277
; X86-NEXT: vptestnmw %xmm0, %xmm1, %k0 {%k1}
278278
; X86-NEXT: kmovd %k0, %eax
279-
; X86-NEXT: movzbl %al, %eax
279+
; X86-NEXT: # kill: def $al killed $al killed $eax
280280
; X86-NEXT: retl
281281
;
282282
; X64-LABEL: test_mm_mask_testn_epi16_mask:
283283
; X64: # %bb.0: # %entry
284284
; X64-NEXT: kmovd %edi, %k1
285285
; X64-NEXT: vptestnmw %xmm0, %xmm1, %k0 {%k1}
286286
; X64-NEXT: kmovd %k0, %eax
287-
; X64-NEXT: movzbl %al, %eax
287+
; X64-NEXT: # kill: def $al killed $al killed $eax
288288
; X64-NEXT: retq
289289
entry:
290290
%and.i.i = and <2 x i64> %__B, %__A
@@ -301,7 +301,7 @@ define zeroext i16 @test_mm256_testn_epi16_mask(<4 x i64> %__A, <4 x i64> %__B)
301301
; CHECK: # %bb.0: # %entry
302302
; CHECK-NEXT: vptestnmw %ymm0, %ymm1, %k0
303303
; CHECK-NEXT: kmovd %k0, %eax
304-
; CHECK-NEXT: movzwl %ax, %eax
304+
; CHECK-NEXT: # kill: def $ax killed $ax killed $eax
305305
; CHECK-NEXT: vzeroupper
306306
; CHECK-NEXT: ret{{[l|q]}}
307307
entry:
@@ -318,7 +318,7 @@ define zeroext i16 @test_mm256_mask_testn_epi16_mask(i16 zeroext %__U, <4 x i64>
318318
; X86-NEXT: kmovw {{[0-9]+}}(%esp), %k1
319319
; X86-NEXT: vptestnmw %ymm0, %ymm1, %k0 {%k1}
320320
; X86-NEXT: kmovd %k0, %eax
321-
; X86-NEXT: movzwl %ax, %eax
321+
; X86-NEXT: # kill: def $ax killed $ax killed $eax
322322
; X86-NEXT: vzeroupper
323323
; X86-NEXT: retl
324324
;
@@ -327,7 +327,7 @@ define zeroext i16 @test_mm256_mask_testn_epi16_mask(i16 zeroext %__U, <4 x i64>
327327
; X64-NEXT: kmovd %edi, %k1
328328
; X64-NEXT: vptestnmw %ymm0, %ymm1, %k0 {%k1}
329329
; X64-NEXT: kmovd %k0, %eax
330-
; X64-NEXT: movzwl %ax, %eax
330+
; X64-NEXT: # kill: def $ax killed $ax killed $eax
331331
; X64-NEXT: vzeroupper
332332
; X64-NEXT: retq
333333
entry:

0 commit comments

Comments
 (0)