Skip to content

Commit 87d478c

Browse files
committed
[X86] Manage atomic load of fp -> int promotion in DAG
When lowering atomic <1 x T> vector types with floats, selection can fail since this pattern is unsupported. To support this, floats can be casted to an integer type of the same size. commit-id:f9d761c5
1 parent 85e5dc5 commit 87d478c

File tree

2 files changed

+121
-0
lines changed

2 files changed

+121
-0
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2653,6 +2653,10 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
26532653
setOperationAction(Op, MVT::f32, Promote);
26542654
}
26552655

2656+
setOperationPromotedToType(ISD::ATOMIC_LOAD, MVT::f16, MVT::i16);
2657+
setOperationPromotedToType(ISD::ATOMIC_LOAD, MVT::f32, MVT::i32);
2658+
setOperationPromotedToType(ISD::ATOMIC_LOAD, MVT::f64, MVT::i64);
2659+
26562660
// We have target-specific dag combine patterns for the following nodes:
26572661
setTargetDAGCombine({ISD::VECTOR_SHUFFLE,
26582662
ISD::SCALAR_TO_VECTOR,

llvm/test/CodeGen/X86/atomic-load-store.ll

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,3 +269,120 @@ define <1 x i64> @atomic_vec1_i64_align(ptr %x) nounwind {
269269
%ret = load atomic <1 x i64>, ptr %x acquire, align 8
270270
ret <1 x i64> %ret
271271
}
272+
273+
define <1 x half> @atomic_vec1_half(ptr %x) {
274+
; CHECK-O3-LABEL: atomic_vec1_half:
275+
; CHECK-O3: # %bb.0:
276+
; CHECK-O3-NEXT: movzwl (%rdi), %eax
277+
; CHECK-O3-NEXT: pinsrw $0, %eax, %xmm0
278+
; CHECK-O3-NEXT: retq
279+
;
280+
; CHECK-SSE-O3-LABEL: atomic_vec1_half:
281+
; CHECK-SSE-O3: # %bb.0:
282+
; CHECK-SSE-O3-NEXT: movzwl (%rdi), %eax
283+
; CHECK-SSE-O3-NEXT: pinsrw $0, %eax, %xmm0
284+
; CHECK-SSE-O3-NEXT: retq
285+
;
286+
; CHECK-AVX-O3-LABEL: atomic_vec1_half:
287+
; CHECK-AVX-O3: # %bb.0:
288+
; CHECK-AVX-O3-NEXT: movzwl (%rdi), %eax
289+
; CHECK-AVX-O3-NEXT: vpinsrw $0, %eax, %xmm0, %xmm0
290+
; CHECK-AVX-O3-NEXT: retq
291+
;
292+
; CHECK-O0-LABEL: atomic_vec1_half:
293+
; CHECK-O0: # %bb.0:
294+
; CHECK-O0-NEXT: movw (%rdi), %cx
295+
; CHECK-O0-NEXT: # implicit-def: $eax
296+
; CHECK-O0-NEXT: movw %cx, %ax
297+
; CHECK-O0-NEXT: # implicit-def: $xmm0
298+
; CHECK-O0-NEXT: pinsrw $0, %eax, %xmm0
299+
; CHECK-O0-NEXT: retq
300+
;
301+
; CHECK-SSE-O0-LABEL: atomic_vec1_half:
302+
; CHECK-SSE-O0: # %bb.0:
303+
; CHECK-SSE-O0-NEXT: movw (%rdi), %cx
304+
; CHECK-SSE-O0-NEXT: # implicit-def: $eax
305+
; CHECK-SSE-O0-NEXT: movw %cx, %ax
306+
; CHECK-SSE-O0-NEXT: # implicit-def: $xmm0
307+
; CHECK-SSE-O0-NEXT: pinsrw $0, %eax, %xmm0
308+
; CHECK-SSE-O0-NEXT: retq
309+
;
310+
; CHECK-AVX-O0-LABEL: atomic_vec1_half:
311+
; CHECK-AVX-O0: # %bb.0:
312+
; CHECK-AVX-O0-NEXT: movw (%rdi), %cx
313+
; CHECK-AVX-O0-NEXT: # implicit-def: $eax
314+
; CHECK-AVX-O0-NEXT: movw %cx, %ax
315+
; CHECK-AVX-O0-NEXT: # implicit-def: $xmm0
316+
; CHECK-AVX-O0-NEXT: vpinsrw $0, %eax, %xmm0, %xmm0
317+
; CHECK-AVX-O0-NEXT: retq
318+
%ret = load atomic <1 x half>, ptr %x acquire, align 2
319+
ret <1 x half> %ret
320+
}
321+
322+
define <1 x float> @atomic_vec1_float(ptr %x) {
323+
; CHECK-O3-LABEL: atomic_vec1_float:
324+
; CHECK-O3: # %bb.0:
325+
; CHECK-O3-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
326+
; CHECK-O3-NEXT: retq
327+
;
328+
; CHECK-SSE-O3-LABEL: atomic_vec1_float:
329+
; CHECK-SSE-O3: # %bb.0:
330+
; CHECK-SSE-O3-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
331+
; CHECK-SSE-O3-NEXT: retq
332+
;
333+
; CHECK-AVX-O3-LABEL: atomic_vec1_float:
334+
; CHECK-AVX-O3: # %bb.0:
335+
; CHECK-AVX-O3-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
336+
; CHECK-AVX-O3-NEXT: retq
337+
;
338+
; CHECK-O0-LABEL: atomic_vec1_float:
339+
; CHECK-O0: # %bb.0:
340+
; CHECK-O0-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
341+
; CHECK-O0-NEXT: retq
342+
;
343+
; CHECK-SSE-O0-LABEL: atomic_vec1_float:
344+
; CHECK-SSE-O0: # %bb.0:
345+
; CHECK-SSE-O0-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
346+
; CHECK-SSE-O0-NEXT: retq
347+
;
348+
; CHECK-AVX-O0-LABEL: atomic_vec1_float:
349+
; CHECK-AVX-O0: # %bb.0:
350+
; CHECK-AVX-O0-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
351+
; CHECK-AVX-O0-NEXT: retq
352+
%ret = load atomic <1 x float>, ptr %x acquire, align 4
353+
ret <1 x float> %ret
354+
}
355+
356+
define <1 x double> @atomic_vec1_double_align(ptr %x) nounwind {
357+
; CHECK-O3-LABEL: atomic_vec1_double_align:
358+
; CHECK-O3: # %bb.0:
359+
; CHECK-O3-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
360+
; CHECK-O3-NEXT: retq
361+
;
362+
; CHECK-SSE-O3-LABEL: atomic_vec1_double_align:
363+
; CHECK-SSE-O3: # %bb.0:
364+
; CHECK-SSE-O3-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
365+
; CHECK-SSE-O3-NEXT: retq
366+
;
367+
; CHECK-AVX-O3-LABEL: atomic_vec1_double_align:
368+
; CHECK-AVX-O3: # %bb.0:
369+
; CHECK-AVX-O3-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
370+
; CHECK-AVX-O3-NEXT: retq
371+
;
372+
; CHECK-O0-LABEL: atomic_vec1_double_align:
373+
; CHECK-O0: # %bb.0:
374+
; CHECK-O0-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
375+
; CHECK-O0-NEXT: retq
376+
;
377+
; CHECK-SSE-O0-LABEL: atomic_vec1_double_align:
378+
; CHECK-SSE-O0: # %bb.0:
379+
; CHECK-SSE-O0-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
380+
; CHECK-SSE-O0-NEXT: retq
381+
;
382+
; CHECK-AVX-O0-LABEL: atomic_vec1_double_align:
383+
; CHECK-AVX-O0: # %bb.0:
384+
; CHECK-AVX-O0-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
385+
; CHECK-AVX-O0-NEXT: retq
386+
%ret = load atomic <1 x double>, ptr %x acquire, align 8
387+
ret <1 x double> %ret
388+
}

0 commit comments

Comments
 (0)