Skip to content

Commit 1dc0c8a

Browse files
committed
[LegalizeTypes] Teach BitcastToInt_ATOMIC_SWAP to only create FP16_TO_FP when called from PromoteFloatResult.
There's also a call from SoftenFloatResult that should not be promoted. The change test case would fail with the new RUN line prior to this change.
1 parent 95ce8f9 commit 1dc0c8a

File tree

2 files changed

+184
-4
lines changed

2 files changed

+184
-4
lines changed

llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2360,7 +2360,6 @@ SDValue DAGTypeLegalizer::PromoteFloatRes_UNDEF(SDNode *N) {
23602360

23612361
SDValue DAGTypeLegalizer::BitcastToInt_ATOMIC_SWAP(SDNode *N) {
23622362
EVT VT = N->getValueType(0);
2363-
EVT NFPVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
23642363

23652364
AtomicSDNode *AM = cast<AtomicSDNode>(N);
23662365
SDLoc SL(N);
@@ -2374,13 +2373,19 @@ SDValue DAGTypeLegalizer::BitcastToInt_ATOMIC_SWAP(SDNode *N) {
23742373
{ AM->getChain(), AM->getBasePtr(), CastVal },
23752374
AM->getMemOperand());
23762375

2377-
SDValue ResultCast = DAG.getNode(GetPromotionOpcode(VT, NFPVT), SL, NFPVT,
2378-
NewAtomic);
2376+
SDValue Result = NewAtomic;
2377+
2378+
if (getTypeAction(VT) == TargetLowering::TypePromoteFloat) {
2379+
EVT NFPVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
2380+
Result = DAG.getNode(GetPromotionOpcode(VT, NFPVT), SL, NFPVT,
2381+
NewAtomic);
2382+
}
2383+
23792384
// Legalize the chain result by replacing uses of the old value chain with the
23802385
// new one
23812386
ReplaceValueWith(SDValue(N, 1), NewAtomic.getValue(1));
23822387

2383-
return ResultCast;
2388+
return Result;
23842389

23852390
}
23862391

llvm/test/CodeGen/X86/atomic32.ll

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
; RUN: llc < %s -O0 -mtriple=x86_64-unknown-unknown -mcpu=corei7 -verify-machineinstrs | FileCheck %s -check-prefixes=X64,X64-CMOV
33
; RUN: llc < %s -O0 -mtriple=i686-unknown-unknown -mcpu=corei7 -verify-machineinstrs | FileCheck %s -check-prefixes=X86,X86-CMOV
44
; RUN: llc < %s -O0 -mtriple=i686-unknown-unknown -mcpu=corei7 -mattr=-cmov,-sse -verify-machineinstrs | FileCheck %s --check-prefixes=X86,X86-NOCMOV
5+
; RUN: llc < %s -O0 -mtriple=i686-unknown-unknown -mcpu=corei7 -mattr=-cmov,-sse,-x87 -verify-machineinstrs | FileCheck %s --check-prefixes=X86,X86-NOX87
56

67
@sc32 = external global i32
78
@fsc32 = external global float
@@ -361,6 +362,48 @@ define void @atomic_fetch_max32(i32 %x) nounwind {
361362
; X86-NOCMOV-NEXT: popl %esi
362363
; X86-NOCMOV-NEXT: popl %ebx
363364
; X86-NOCMOV-NEXT: retl
365+
;
366+
; X86-NOX87-LABEL: atomic_fetch_max32:
367+
; X86-NOX87: # %bb.0:
368+
; X86-NOX87-NEXT: pushl %ebx
369+
; X86-NOX87-NEXT: pushl %esi
370+
; X86-NOX87-NEXT: subl $20, %esp
371+
; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax
372+
; X86-NOX87-NEXT: movl sc32, %ecx
373+
; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
374+
; X86-NOX87-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
375+
; X86-NOX87-NEXT: .LBB6_1: # %atomicrmw.start
376+
; X86-NOX87-NEXT: # =>This Inner Loop Header: Depth=1
377+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
378+
; X86-NOX87-NEXT: movl %eax, %ecx
379+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
380+
; X86-NOX87-NEXT: subl %edx, %ecx
381+
; X86-NOX87-NEXT: movl %eax, %esi
382+
; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
383+
; X86-NOX87-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
384+
; X86-NOX87-NEXT: jge .LBB6_4
385+
; X86-NOX87-NEXT: # %bb.3: # %atomicrmw.start
386+
; X86-NOX87-NEXT: # in Loop: Header=BB6_1 Depth=1
387+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
388+
; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
389+
; X86-NOX87-NEXT: .LBB6_4: # %atomicrmw.start
390+
; X86-NOX87-NEXT: # in Loop: Header=BB6_1 Depth=1
391+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
392+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
393+
; X86-NOX87-NEXT: movl %eax, (%esp) # 4-byte Spill
394+
; X86-NOX87-NEXT: movl %ecx, %eax
395+
; X86-NOX87-NEXT: movl (%esp), %edx # 4-byte Reload
396+
; X86-NOX87-NEXT: lock cmpxchgl %edx, sc32
397+
; X86-NOX87-NEXT: sete %bl
398+
; X86-NOX87-NEXT: testb $1, %bl
399+
; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
400+
; X86-NOX87-NEXT: jne .LBB6_2
401+
; X86-NOX87-NEXT: jmp .LBB6_1
402+
; X86-NOX87-NEXT: .LBB6_2: # %atomicrmw.end
403+
; X86-NOX87-NEXT: addl $20, %esp
404+
; X86-NOX87-NEXT: popl %esi
405+
; X86-NOX87-NEXT: popl %ebx
406+
; X86-NOX87-NEXT: retl
364407
%t1 = atomicrmw max i32* @sc32, i32 %x acquire
365408
ret void
366409
}
@@ -456,6 +499,48 @@ define void @atomic_fetch_min32(i32 %x) nounwind {
456499
; X86-NOCMOV-NEXT: popl %esi
457500
; X86-NOCMOV-NEXT: popl %ebx
458501
; X86-NOCMOV-NEXT: retl
502+
;
503+
; X86-NOX87-LABEL: atomic_fetch_min32:
504+
; X86-NOX87: # %bb.0:
505+
; X86-NOX87-NEXT: pushl %ebx
506+
; X86-NOX87-NEXT: pushl %esi
507+
; X86-NOX87-NEXT: subl $20, %esp
508+
; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax
509+
; X86-NOX87-NEXT: movl sc32, %ecx
510+
; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
511+
; X86-NOX87-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
512+
; X86-NOX87-NEXT: .LBB7_1: # %atomicrmw.start
513+
; X86-NOX87-NEXT: # =>This Inner Loop Header: Depth=1
514+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
515+
; X86-NOX87-NEXT: movl %eax, %ecx
516+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
517+
; X86-NOX87-NEXT: subl %edx, %ecx
518+
; X86-NOX87-NEXT: movl %eax, %esi
519+
; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
520+
; X86-NOX87-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
521+
; X86-NOX87-NEXT: jle .LBB7_4
522+
; X86-NOX87-NEXT: # %bb.3: # %atomicrmw.start
523+
; X86-NOX87-NEXT: # in Loop: Header=BB7_1 Depth=1
524+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
525+
; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
526+
; X86-NOX87-NEXT: .LBB7_4: # %atomicrmw.start
527+
; X86-NOX87-NEXT: # in Loop: Header=BB7_1 Depth=1
528+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
529+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
530+
; X86-NOX87-NEXT: movl %eax, (%esp) # 4-byte Spill
531+
; X86-NOX87-NEXT: movl %ecx, %eax
532+
; X86-NOX87-NEXT: movl (%esp), %edx # 4-byte Reload
533+
; X86-NOX87-NEXT: lock cmpxchgl %edx, sc32
534+
; X86-NOX87-NEXT: sete %bl
535+
; X86-NOX87-NEXT: testb $1, %bl
536+
; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
537+
; X86-NOX87-NEXT: jne .LBB7_2
538+
; X86-NOX87-NEXT: jmp .LBB7_1
539+
; X86-NOX87-NEXT: .LBB7_2: # %atomicrmw.end
540+
; X86-NOX87-NEXT: addl $20, %esp
541+
; X86-NOX87-NEXT: popl %esi
542+
; X86-NOX87-NEXT: popl %ebx
543+
; X86-NOX87-NEXT: retl
459544
%t1 = atomicrmw min i32* @sc32, i32 %x acquire
460545
ret void
461546
}
@@ -551,6 +636,48 @@ define void @atomic_fetch_umax32(i32 %x) nounwind {
551636
; X86-NOCMOV-NEXT: popl %esi
552637
; X86-NOCMOV-NEXT: popl %ebx
553638
; X86-NOCMOV-NEXT: retl
639+
;
640+
; X86-NOX87-LABEL: atomic_fetch_umax32:
641+
; X86-NOX87: # %bb.0:
642+
; X86-NOX87-NEXT: pushl %ebx
643+
; X86-NOX87-NEXT: pushl %esi
644+
; X86-NOX87-NEXT: subl $20, %esp
645+
; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax
646+
; X86-NOX87-NEXT: movl sc32, %ecx
647+
; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
648+
; X86-NOX87-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
649+
; X86-NOX87-NEXT: .LBB8_1: # %atomicrmw.start
650+
; X86-NOX87-NEXT: # =>This Inner Loop Header: Depth=1
651+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
652+
; X86-NOX87-NEXT: movl %eax, %ecx
653+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
654+
; X86-NOX87-NEXT: subl %edx, %ecx
655+
; X86-NOX87-NEXT: movl %eax, %esi
656+
; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
657+
; X86-NOX87-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
658+
; X86-NOX87-NEXT: ja .LBB8_4
659+
; X86-NOX87-NEXT: # %bb.3: # %atomicrmw.start
660+
; X86-NOX87-NEXT: # in Loop: Header=BB8_1 Depth=1
661+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
662+
; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
663+
; X86-NOX87-NEXT: .LBB8_4: # %atomicrmw.start
664+
; X86-NOX87-NEXT: # in Loop: Header=BB8_1 Depth=1
665+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
666+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
667+
; X86-NOX87-NEXT: movl %eax, (%esp) # 4-byte Spill
668+
; X86-NOX87-NEXT: movl %ecx, %eax
669+
; X86-NOX87-NEXT: movl (%esp), %edx # 4-byte Reload
670+
; X86-NOX87-NEXT: lock cmpxchgl %edx, sc32
671+
; X86-NOX87-NEXT: sete %bl
672+
; X86-NOX87-NEXT: testb $1, %bl
673+
; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
674+
; X86-NOX87-NEXT: jne .LBB8_2
675+
; X86-NOX87-NEXT: jmp .LBB8_1
676+
; X86-NOX87-NEXT: .LBB8_2: # %atomicrmw.end
677+
; X86-NOX87-NEXT: addl $20, %esp
678+
; X86-NOX87-NEXT: popl %esi
679+
; X86-NOX87-NEXT: popl %ebx
680+
; X86-NOX87-NEXT: retl
554681
%t1 = atomicrmw umax i32* @sc32, i32 %x acquire
555682
ret void
556683
}
@@ -646,6 +773,48 @@ define void @atomic_fetch_umin32(i32 %x) nounwind {
646773
; X86-NOCMOV-NEXT: popl %esi
647774
; X86-NOCMOV-NEXT: popl %ebx
648775
; X86-NOCMOV-NEXT: retl
776+
;
777+
; X86-NOX87-LABEL: atomic_fetch_umin32:
778+
; X86-NOX87: # %bb.0:
779+
; X86-NOX87-NEXT: pushl %ebx
780+
; X86-NOX87-NEXT: pushl %esi
781+
; X86-NOX87-NEXT: subl $20, %esp
782+
; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax
783+
; X86-NOX87-NEXT: movl sc32, %ecx
784+
; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
785+
; X86-NOX87-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
786+
; X86-NOX87-NEXT: .LBB9_1: # %atomicrmw.start
787+
; X86-NOX87-NEXT: # =>This Inner Loop Header: Depth=1
788+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
789+
; X86-NOX87-NEXT: movl %eax, %ecx
790+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
791+
; X86-NOX87-NEXT: subl %edx, %ecx
792+
; X86-NOX87-NEXT: movl %eax, %esi
793+
; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
794+
; X86-NOX87-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
795+
; X86-NOX87-NEXT: jbe .LBB9_4
796+
; X86-NOX87-NEXT: # %bb.3: # %atomicrmw.start
797+
; X86-NOX87-NEXT: # in Loop: Header=BB9_1 Depth=1
798+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
799+
; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
800+
; X86-NOX87-NEXT: .LBB9_4: # %atomicrmw.start
801+
; X86-NOX87-NEXT: # in Loop: Header=BB9_1 Depth=1
802+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
803+
; X86-NOX87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
804+
; X86-NOX87-NEXT: movl %eax, (%esp) # 4-byte Spill
805+
; X86-NOX87-NEXT: movl %ecx, %eax
806+
; X86-NOX87-NEXT: movl (%esp), %edx # 4-byte Reload
807+
; X86-NOX87-NEXT: lock cmpxchgl %edx, sc32
808+
; X86-NOX87-NEXT: sete %bl
809+
; X86-NOX87-NEXT: testb $1, %bl
810+
; X86-NOX87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
811+
; X86-NOX87-NEXT: jne .LBB9_2
812+
; X86-NOX87-NEXT: jmp .LBB9_1
813+
; X86-NOX87-NEXT: .LBB9_2: # %atomicrmw.end
814+
; X86-NOX87-NEXT: addl $20, %esp
815+
; X86-NOX87-NEXT: popl %esi
816+
; X86-NOX87-NEXT: popl %ebx
817+
; X86-NOX87-NEXT: retl
649818
%t1 = atomicrmw umin i32* @sc32, i32 %x acquire
650819
ret void
651820
}
@@ -721,6 +890,12 @@ define void @atomic_fetch_swapf32(float %x) nounwind {
721890
; X86-NOCMOV-NEXT: xchgl %eax, fsc32
722891
; X86-NOCMOV-NEXT: popl %eax
723892
; X86-NOCMOV-NEXT: retl
893+
;
894+
; X86-NOX87-LABEL: atomic_fetch_swapf32:
895+
; X86-NOX87: # %bb.0:
896+
; X86-NOX87-NEXT: movl {{[0-9]+}}(%esp), %eax
897+
; X86-NOX87-NEXT: xchgl %eax, fsc32
898+
; X86-NOX87-NEXT: retl
724899
%t1 = atomicrmw xchg float* @fsc32, float %x acquire
725900
ret void
726901
}

0 commit comments

Comments
 (0)