Skip to content

Commit 733fddb

Browse files
authored
[AVR] Change half to use softPromoteHalfType (#152783)
The default `half` legalization has some issues with quieting NaNs and carrying excess precision. As has been done for various other targets, update AVR to use `softPromoteHalfType` which avoids these issues. The most obvious corrected test below is `test_load_store`, which no longer contains calls to extend and trunc (this passing through libcalls means that `f16` does not round trip). Fixes the AVR part of #97975 Fixes the AVR part of #97981
1 parent 72a1fd1 commit 733fddb

File tree

3 files changed

+71
-138
lines changed

3 files changed

+71
-138
lines changed

llvm/lib/Target/AVR/AVRISelLowering.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ class AVRTargetLowering : public TargetLowering {
9494
return ShiftLegalizationStrategy::LowerToLibcall;
9595
}
9696

97+
bool softPromoteHalfType() const override { return true; }
98+
9799
private:
98100
SDValue getAVRCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC, SDValue &AVRcc,
99101
SelectionDAG &DAG, SDLoc dl) const;

llvm/test/CodeGen/AVR/half.ll

Lines changed: 39 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
define void @store(half %x, ptr %p) nounwind {
88
; CHECK-LABEL: store:
99
; CHECK: ; %bb.0:
10-
; CHECK-NEXT: mov r30, r20
11-
; CHECK-NEXT: mov r31, r21
12-
; CHECK-NEXT: std Z+1, r23
13-
; CHECK-NEXT: st Z, r22
10+
; CHECK-NEXT: mov r30, r22
11+
; CHECK-NEXT: mov r31, r23
12+
; CHECK-NEXT: std Z+1, r25
13+
; CHECK-NEXT: st Z, r24
1414
; CHECK-NEXT: ret
1515
store half %x, ptr %p
1616
ret void
@@ -21,8 +21,8 @@ define half @return(ptr %p) nounwind {
2121
; CHECK: ; %bb.0:
2222
; CHECK-NEXT: mov r30, r24
2323
; CHECK-NEXT: mov r31, r25
24-
; CHECK-NEXT: ld r22, Z
25-
; CHECK-NEXT: ldd r23, Z+1
24+
; CHECK-NEXT: ld r24, Z
25+
; CHECK-NEXT: ldd r25, Z+1
2626
; CHECK-NEXT: ret
2727
%r = load half, ptr %p
2828
ret half %r
@@ -79,8 +79,6 @@ define dso_local void @stored(ptr nocapture %a, double %b) local_unnamed_addr no
7979
; CHECK-NEXT: mov r24, r30
8080
; CHECK-NEXT: mov r25, r31
8181
; CHECK-NEXT: rcall __truncdfhf2
82-
; CHECK-NEXT: rcall __extendhfsf2
83-
; CHECK-NEXT: rcall __truncsfhf2
8482
; CHECK-NEXT: mov r30, r16
8583
; CHECK-NEXT: mov r31, r17
8684
; CHECK-NEXT: std Z+1, r25
@@ -108,8 +106,6 @@ define dso_local void @storef(ptr nocapture %a, float %b) local_unnamed_addr nou
108106
; CHECK-NEXT: mov r24, r18
109107
; CHECK-NEXT: mov r25, r19
110108
; CHECK-NEXT: rcall __truncsfhf2
111-
; CHECK-NEXT: rcall __extendhfsf2
112-
; CHECK-NEXT: rcall __truncsfhf2
113109
; CHECK-NEXT: mov r30, r16
114110
; CHECK-NEXT: mov r31, r17
115111
; CHECK-NEXT: std Z+1, r25
@@ -126,22 +122,14 @@ entry:
126122
define void @test_load_store(ptr %in, ptr %out) nounwind {
127123
; CHECK-LABEL: test_load_store:
128124
; CHECK: ; %bb.0:
129-
; CHECK-NEXT: push r16
130-
; CHECK-NEXT: push r17
131-
; CHECK-NEXT: mov r16, r22
132-
; CHECK-NEXT: mov r17, r23
133125
; CHECK-NEXT: mov r30, r24
134126
; CHECK-NEXT: mov r31, r25
135127
; CHECK-NEXT: ld r24, Z
136128
; CHECK-NEXT: ldd r25, Z+1
137-
; CHECK-NEXT: rcall __extendhfsf2
138-
; CHECK-NEXT: rcall __truncsfhf2
139-
; CHECK-NEXT: mov r30, r16
140-
; CHECK-NEXT: mov r31, r17
129+
; CHECK-NEXT: mov r30, r22
130+
; CHECK-NEXT: mov r31, r23
141131
; CHECK-NEXT: std Z+1, r25
142132
; CHECK-NEXT: st Z, r24
143-
; CHECK-NEXT: pop r17
144-
; CHECK-NEXT: pop r16
145133
; CHECK-NEXT: ret
146134
%val = load half, ptr %in
147135
store half %val, ptr %out
@@ -177,8 +165,6 @@ define void @test_bitcast_to_half(ptr %addr, i16 %in) nounwind {
177165
define half @from_bits(i16 %x) nounwind {
178166
; CHECK-LABEL: from_bits:
179167
; CHECK: ; %bb.0:
180-
; CHECK-NEXT: mov r22, r24
181-
; CHECK-NEXT: mov r23, r25
182168
; CHECK-NEXT: ret
183169
%res = bitcast i16 %x to half
184170
ret half %res
@@ -187,8 +173,6 @@ define half @from_bits(i16 %x) nounwind {
187173
define i16 @to_bits(half %x) nounwind {
188174
; CHECK-LABEL: to_bits:
189175
; CHECK: ; %bb.0:
190-
; CHECK-NEXT: mov r24, r22
191-
; CHECK-NEXT: mov r25, r23
192176
; CHECK-NEXT: ret
193177
%res = bitcast half %x to i16
194178
ret i16 %res
@@ -231,8 +215,6 @@ define void @test_trunc32(float %in, ptr %addr) nounwind {
231215
; CHECK-NEXT: mov r16, r20
232216
; CHECK-NEXT: mov r17, r21
233217
; CHECK-NEXT: rcall __truncsfhf2
234-
; CHECK-NEXT: rcall __extendhfsf2
235-
; CHECK-NEXT: rcall __truncsfhf2
236218
; CHECK-NEXT: mov r30, r16
237219
; CHECK-NEXT: mov r31, r17
238220
; CHECK-NEXT: std Z+1, r25
@@ -249,8 +231,6 @@ define void @test_trunc64(double %in, ptr %addr) nounwind {
249231
; CHECK-LABEL: test_trunc64:
250232
; CHECK: ; %bb.0:
251233
; CHECK-NEXT: rcall __truncdfhf2
252-
; CHECK-NEXT: rcall __extendhfsf2
253-
; CHECK-NEXT: rcall __truncsfhf2
254234
; CHECK-NEXT: mov r30, r16
255235
; CHECK-NEXT: mov r31, r17
256236
; CHECK-NEXT: std Z+1, r25
@@ -281,8 +261,6 @@ define void @test_sitofp_i64(i64 %a, ptr %p) nounwind {
281261
; CHECK: ; %bb.0:
282262
; CHECK-NEXT: rcall __floatdisf
283263
; CHECK-NEXT: rcall __truncsfhf2
284-
; CHECK-NEXT: rcall __extendhfsf2
285-
; CHECK-NEXT: rcall __truncsfhf2
286264
; CHECK-NEXT: mov r30, r16
287265
; CHECK-NEXT: mov r31, r17
288266
; CHECK-NEXT: std Z+1, r25
@@ -313,8 +291,6 @@ define void @test_uitofp_i64(i64 %a, ptr %p) nounwind {
313291
; CHECK: ; %bb.0:
314292
; CHECK-NEXT: rcall __floatundisf
315293
; CHECK-NEXT: rcall __truncsfhf2
316-
; CHECK-NEXT: rcall __extendhfsf2
317-
; CHECK-NEXT: rcall __truncsfhf2
318294
; CHECK-NEXT: mov r30, r16
319295
; CHECK-NEXT: mov r31, r17
320296
; CHECK-NEXT: std Z+1, r25
@@ -393,8 +369,6 @@ define void @test_trunc32_vec2(<2 x float> %a, ptr %p) nounwind {
393369
; CHECK-NEXT: mov r12, r18
394370
; CHECK-NEXT: mov r13, r19
395371
; CHECK-NEXT: rcall __truncsfhf2
396-
; CHECK-NEXT: rcall __extendhfsf2
397-
; CHECK-NEXT: rcall __truncsfhf2
398372
; CHECK-NEXT: mov r30, r16
399373
; CHECK-NEXT: mov r31, r17
400374
; CHECK-NEXT: std Z+3, r25
@@ -404,8 +378,6 @@ define void @test_trunc32_vec2(<2 x float> %a, ptr %p) nounwind {
404378
; CHECK-NEXT: mov r24, r14
405379
; CHECK-NEXT: mov r25, r15
406380
; CHECK-NEXT: rcall __truncsfhf2
407-
; CHECK-NEXT: rcall __extendhfsf2
408-
; CHECK-NEXT: rcall __truncsfhf2
409381
; CHECK-NEXT: mov r30, r16
410382
; CHECK-NEXT: mov r31, r17
411383
; CHECK-NEXT: std Z+1, r25
@@ -424,8 +396,6 @@ define void @test_trunc64_vec1(<1 x double> %a, ptr %p) nounwind {
424396
; CHECK-LABEL: test_trunc64_vec1:
425397
; CHECK: ; %bb.0:
426398
; CHECK-NEXT: rcall __truncdfhf2
427-
; CHECK-NEXT: rcall __extendhfsf2
428-
; CHECK-NEXT: rcall __truncsfhf2
429399
; CHECK-NEXT: mov r30, r16
430400
; CHECK-NEXT: mov r31, r17
431401
; CHECK-NEXT: std Z+1, r25
@@ -439,51 +409,47 @@ define void @test_trunc64_vec1(<1 x double> %a, ptr %p) nounwind {
439409
define float @test_sitofp_fadd_i32(i32 %a, ptr %b) nounwind {
440410
; CHECK-LABEL: test_sitofp_fadd_i32:
441411
; CHECK: ; %bb.0:
442-
; CHECK-NEXT: push r10
443-
; CHECK-NEXT: push r11
444412
; CHECK-NEXT: push r12
445413
; CHECK-NEXT: push r13
446414
; CHECK-NEXT: push r14
447415
; CHECK-NEXT: push r15
448416
; CHECK-NEXT: push r16
449417
; CHECK-NEXT: push r17
450-
; CHECK-NEXT: mov r16, r24
451-
; CHECK-NEXT: mov r17, r25
452-
; CHECK-NEXT: mov r14, r22
453-
; CHECK-NEXT: mov r15, r23
454-
; CHECK-NEXT: mov r30, r20
455-
; CHECK-NEXT: mov r31, r21
418+
; CHECK-NEXT: mov r16, r20
419+
; CHECK-NEXT: mov r17, r21
420+
; CHECK-NEXT: rcall __floatsisf
421+
; CHECK-NEXT: rcall __truncsfhf2
422+
; CHECK-NEXT: mov r14, r24
423+
; CHECK-NEXT: mov r15, r25
424+
; CHECK-NEXT: mov r30, r16
425+
; CHECK-NEXT: mov r31, r17
456426
; CHECK-NEXT: ld r24, Z
457427
; CHECK-NEXT: ldd r25, Z+1
458428
; CHECK-NEXT: rcall __extendhfsf2
459-
; CHECK-NEXT: mov r12, r22
460-
; CHECK-NEXT: mov r13, r23
461-
; CHECK-NEXT: mov r10, r24
462-
; CHECK-NEXT: mov r11, r25
463-
; CHECK-NEXT: mov r22, r14
464-
; CHECK-NEXT: mov r23, r15
465-
; CHECK-NEXT: mov r24, r16
466-
; CHECK-NEXT: mov r25, r17
467-
; CHECK-NEXT: rcall __floatsisf
468-
; CHECK-NEXT: rcall __truncsfhf2
429+
; CHECK-NEXT: mov r16, r22
430+
; CHECK-NEXT: mov r17, r23
431+
; CHECK-NEXT: mov r12, r24
432+
; CHECK-NEXT: mov r13, r25
433+
; CHECK-NEXT: mov r24, r14
434+
; CHECK-NEXT: mov r25, r15
469435
; CHECK-NEXT: rcall __extendhfsf2
470436
; CHECK-NEXT: mov r18, r22
471437
; CHECK-NEXT: mov r19, r23
472438
; CHECK-NEXT: mov r20, r24
473439
; CHECK-NEXT: mov r21, r25
474-
; CHECK-NEXT: mov r22, r12
475-
; CHECK-NEXT: mov r23, r13
476-
; CHECK-NEXT: mov r24, r10
477-
; CHECK-NEXT: mov r25, r11
440+
; CHECK-NEXT: mov r22, r16
441+
; CHECK-NEXT: mov r23, r17
442+
; CHECK-NEXT: mov r24, r12
443+
; CHECK-NEXT: mov r25, r13
478444
; CHECK-NEXT: rcall __addsf3
445+
; CHECK-NEXT: rcall __truncsfhf2
446+
; CHECK-NEXT: rcall __extendhfsf2
479447
; CHECK-NEXT: pop r17
480448
; CHECK-NEXT: pop r16
481449
; CHECK-NEXT: pop r15
482450
; CHECK-NEXT: pop r14
483451
; CHECK-NEXT: pop r13
484452
; CHECK-NEXT: pop r12
485-
; CHECK-NEXT: pop r11
486-
; CHECK-NEXT: pop r10
487453
; CHECK-NEXT: ret
488454
%tmp0 = load half, ptr %b
489455
%tmp1 = sitofp i32 %a to half
@@ -495,22 +461,20 @@ define float @test_sitofp_fadd_i32(i32 %a, ptr %b) nounwind {
495461
define half @chained_fp_ops(half %x) {
496462
; CHECK-LABEL: chained_fp_ops:
497463
; CHECK: ; %bb.0: ; %start
498-
; CHECK-NEXT: mov r24, r22
499-
; CHECK-NEXT: mov r25, r23
500464
; CHECK-NEXT: rcall __extendhfsf2
501465
; CHECK-NEXT: mov r18, r22
502466
; CHECK-NEXT: mov r19, r23
503467
; CHECK-NEXT: mov r20, r24
504468
; CHECK-NEXT: mov r21, r25
505469
; CHECK-NEXT: rcall __addsf3
470+
; CHECK-NEXT: rcall __truncsfhf2
471+
; CHECK-NEXT: rcall __extendhfsf2
506472
; CHECK-NEXT: ldi r18, 0
507473
; CHECK-NEXT: ldi r19, 0
508474
; CHECK-NEXT: ldi r20, 0
509475
; CHECK-NEXT: ldi r21, 63
510476
; CHECK-NEXT: rcall __mulsf3
511477
; CHECK-NEXT: rcall __truncsfhf2
512-
; CHECK-NEXT: mov r22, r24
513-
; CHECK-NEXT: mov r23, r25
514478
; CHECK-NEXT: ret
515479
start:
516480
%y = fmul half %x, 0xH4000
@@ -523,8 +487,6 @@ define half @test_select_cc(half) nounwind {
523487
; CHECK: ; %bb.0:
524488
; CHECK-NEXT: push r16
525489
; CHECK-NEXT: push r17
526-
; CHECK-NEXT: mov r24, r22
527-
; CHECK-NEXT: mov r25, r23
528490
; CHECK-NEXT: rcall __extendhfsf2
529491
; CHECK-NEXT: ldi r16, 0
530492
; CHECK-NEXT: ldi r17, 0
@@ -534,20 +496,13 @@ define half @test_select_cc(half) nounwind {
534496
; CHECK-NEXT: mov r21, r17
535497
; CHECK-NEXT: rcall __nesf2
536498
; CHECK-NEXT: cpi r24, 0
537-
; CHECK-NEXT: brne .LBB25_2
499+
; CHECK-NEXT: breq .LBB25_2
538500
; CHECK-NEXT: ; %bb.1:
501+
; CHECK-NEXT: ldi r16, 0
502+
; CHECK-NEXT: ldi r17, 60
503+
; CHECK-NEXT: .LBB25_2:
539504
; CHECK-NEXT: mov r24, r16
540505
; CHECK-NEXT: mov r25, r17
541-
; CHECK-NEXT: rjmp .LBB25_3
542-
; CHECK-NEXT: .LBB25_2:
543-
; CHECK-NEXT: ldi r24, 128
544-
; CHECK-NEXT: ldi r25, 63
545-
; CHECK-NEXT: .LBB25_3:
546-
; CHECK-NEXT: mov r22, r16
547-
; CHECK-NEXT: mov r23, r17
548-
; CHECK-NEXT: rcall __truncsfhf2
549-
; CHECK-NEXT: mov r22, r24
550-
; CHECK-NEXT: mov r23, r25
551506
; CHECK-NEXT: pop r17
552507
; CHECK-NEXT: pop r16
553508
; CHECK-NEXT: ret
@@ -559,9 +514,7 @@ define half @test_select_cc(half) nounwind {
559514
define half @fabs(half %x) nounwind {
560515
; CHECK-LABEL: fabs:
561516
; CHECK: ; %bb.0:
562-
; CHECK-NEXT: andi r23, 127
563-
; CHECK-NEXT: ldi r24, 0
564-
; CHECK-NEXT: ldi r25, 0
517+
; CHECK-NEXT: andi r25, 127
565518
; CHECK-NEXT: ret
566519
%a = call half @llvm.fabs.f16(half %x)
567520
ret half %a
@@ -570,23 +523,11 @@ define half @fabs(half %x) nounwind {
570523
define half @fcopysign(half %x, half %y) nounwind {
571524
; CHECK-LABEL: fcopysign:
572525
; CHECK: ; %bb.0:
573-
; CHECK-NEXT: push r16
574-
; CHECK-NEXT: push r17
575-
; CHECK-NEXT: mov r16, r18
576-
; CHECK-NEXT: mov r17, r19
577-
; CHECK-NEXT: mov r24, r22
578-
; CHECK-NEXT: mov r25, r23
579-
; CHECK-NEXT: rcall __extendhfsf2
580-
; CHECK-NEXT: andi r16, 0
581-
; CHECK-NEXT: andi r17, 128
526+
; CHECK-NEXT: andi r22, 0
527+
; CHECK-NEXT: andi r23, 128
582528
; CHECK-NEXT: andi r25, 127
583-
; CHECK-NEXT: or r24, r16
584-
; CHECK-NEXT: or r25, r17
585-
; CHECK-NEXT: rcall __truncsfhf2
586-
; CHECK-NEXT: mov r22, r24
587-
; CHECK-NEXT: mov r23, r25
588-
; CHECK-NEXT: pop r17
589-
; CHECK-NEXT: pop r16
529+
; CHECK-NEXT: or r24, r22
530+
; CHECK-NEXT: or r25, r23
590531
; CHECK-NEXT: ret
591532
%a = call half @llvm.copysign.f16(half %x, half %y)
592533
ret half %a

0 commit comments

Comments
 (0)