Skip to content

[X86] Manage atomic load of fp -> int promotion in DAG #120386

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

jofrn
Copy link
Contributor

@jofrn jofrn commented Dec 18, 2024

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.


Stack:

⚠️ Part of a stack created by spr. Do not merge manually using the UI - doing so may have unexpected results.

@llvmbot
Copy link
Member

llvmbot commented Dec 18, 2024

@llvm/pr-subscribers-llvm-ir
@llvm/pr-subscribers-llvm-selectiondag

@llvm/pr-subscribers-backend-x86

Author: None (jofrn)

Changes

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.


Stack:

  • #120387
  • #120386 ⬅
  • #120385
  • #120384

⚠️ Part of a stack created by spr. Do not merge manually using the UI - doing so may have unexpected results.


Full diff: https://github.com/llvm/llvm-project/pull/120386.diff

2 Files Affected:

  • (modified) llvm/lib/Target/X86/X86ISelLowering.cpp (+4)
  • (modified) llvm/test/CodeGen/X86/atomic-load-store.ll (+74-1)
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 2571873dba8483..8006d32d077a65 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -2595,6 +2595,10 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
         setOperationAction(Op, MVT::f32, Promote);
   }
 
+  setOperationPromotedToType(ISD::ATOMIC_LOAD, MVT::f16, MVT::i16);
+  setOperationPromotedToType(ISD::ATOMIC_LOAD, MVT::f32, MVT::i32);
+  setOperationPromotedToType(ISD::ATOMIC_LOAD, MVT::f64, MVT::i64);
+
   // We have target-specific dag combine patterns for the following nodes:
   setTargetDAGCombine({ISD::VECTOR_SHUFFLE,
                        ISD::SCALAR_TO_VECTOR,
diff --git a/llvm/test/CodeGen/X86/atomic-load-store.ll b/llvm/test/CodeGen/X86/atomic-load-store.ll
index 9cac8167542d8b..2bde0d2ffd06ad 100644
--- a/llvm/test/CodeGen/X86/atomic-load-store.ll
+++ b/llvm/test/CodeGen/X86/atomic-load-store.ll
@@ -1,12 +1,17 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
 ; RUN: llc < %s -mtriple=x86_64-apple-macosx10.7.0 -verify-machineinstrs | FileCheck %s
-; RUN: llc < %s -mtriple=x86_64-apple-macosx10.7.0 -verify-machineinstrs -O0 | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-apple-macosx10.7.0 -verify-machineinstrs -O0 | FileCheck %s --check-prefix=CHECK0
 
 define void @test1(ptr %ptr, i32 %val1) {
 ; CHECK-LABEL: test1:
 ; CHECK:       ## %bb.0:
 ; CHECK-NEXT:    xchgl %esi, (%rdi)
 ; CHECK-NEXT:    retq
+;
+; CHECK0-LABEL: test1:
+; CHECK0:       ## %bb.0:
+; CHECK0-NEXT:    xchgl %esi, (%rdi)
+; CHECK0-NEXT:    retq
   store atomic i32 %val1, ptr %ptr seq_cst, align 4
   ret void
 }
@@ -16,6 +21,11 @@ define void @test2(ptr %ptr, i32 %val1) {
 ; CHECK:       ## %bb.0:
 ; CHECK-NEXT:    movl %esi, (%rdi)
 ; CHECK-NEXT:    retq
+;
+; CHECK0-LABEL: test2:
+; CHECK0:       ## %bb.0:
+; CHECK0-NEXT:    movl %esi, (%rdi)
+; CHECK0-NEXT:    retq
   store atomic i32 %val1, ptr %ptr release, align 4
   ret void
 }
@@ -25,6 +35,11 @@ define i32 @test3(ptr %ptr) {
 ; CHECK:       ## %bb.0:
 ; CHECK-NEXT:    movl (%rdi), %eax
 ; CHECK-NEXT:    retq
+;
+; CHECK0-LABEL: test3:
+; CHECK0:       ## %bb.0:
+; CHECK0-NEXT:    movl (%rdi), %eax
+; CHECK0-NEXT:    retq
   %val = load atomic i32, ptr %ptr seq_cst, align 4
   ret i32 %val
 }
@@ -34,6 +49,64 @@ define <1 x i32> @atomic_vec1_i32(ptr %x) {
 ; CHECK:       ## %bb.0:
 ; CHECK-NEXT:    movl (%rdi), %eax
 ; CHECK-NEXT:    retq
+;
+; CHECK0-LABEL: atomic_vec1_i32:
+; CHECK0:       ## %bb.0:
+; CHECK0-NEXT:    movl (%rdi), %eax
+; CHECK0-NEXT:    retq
   %ret = load atomic <1 x i32>, ptr %x acquire, align 4
   ret <1 x i32> %ret
 }
+
+define <1 x half> @atomic_vec1_half(ptr %x) {
+; CHECK-LABEL: atomic_vec1_half:
+; CHECK:       ## %bb.0:
+; CHECK-NEXT:    movzwl (%rdi), %eax
+; CHECK-NEXT:    pinsrw $0, %eax, %xmm0
+; CHECK-NEXT:    retq
+;
+; CHECK0-LABEL: atomic_vec1_half:
+; CHECK0:       ## %bb.0:
+; CHECK0-NEXT:    movw (%rdi), %cx
+; CHECK0-NEXT:    ## implicit-def: $eax
+; CHECK0-NEXT:    movw %cx, %ax
+; CHECK0-NEXT:    ## implicit-def: $xmm0
+; CHECK0-NEXT:    pinsrw $0, %eax, %xmm0
+; CHECK0-NEXT:    retq
+  %ret = load atomic <1 x half>, ptr %x acquire, align 4
+  ret <1 x half> %ret
+}
+
+define <1 x float> @atomic_vec1_float(ptr %x) {
+; CHECK-LABEL: atomic_vec1_float:
+; CHECK:       ## %bb.0:
+; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
+; CHECK-NEXT:    retq
+;
+; CHECK0-LABEL: atomic_vec1_float:
+; CHECK0:       ## %bb.0:
+; CHECK0-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
+; CHECK0-NEXT:    retq
+  %ret = load atomic <1 x float>, ptr %x acquire, align 4
+  ret <1 x float> %ret
+}
+
+define <1 x bfloat> @atomic_vec1_bfloat(ptr %x) {
+; CHECK-LABEL: atomic_vec1_bfloat:
+; CHECK:       ## %bb.0:
+; CHECK-NEXT:    movzwl (%rdi), %eax
+; CHECK-NEXT:    pinsrw $0, %eax, %xmm0
+; CHECK-NEXT:    retq
+;
+; CHECK0-LABEL: atomic_vec1_bfloat:
+; CHECK0:       ## %bb.0:
+; CHECK0-NEXT:    movw (%rdi), %cx
+; CHECK0-NEXT:    ## implicit-def: $eax
+; CHECK0-NEXT:    movw %cx, %ax
+; CHECK0-NEXT:    ## implicit-def: $xmm0
+; CHECK0-NEXT:    pinsrw $0, %eax, %xmm0
+; CHECK0-NEXT:    retq
+  %ret = load atomic <1 x bfloat>, ptr %x acquire, align 4
+  ret <1 x bfloat> %ret
+}
+

@jofrn jofrn force-pushed the users/jofrn/spr/main/f9d761c5 branch from f799ee0 to 141279f Compare December 18, 2024 08:54
@jofrn jofrn changed the title [SelectionDAG][X86] Add floating point promotion. [X86] Manage atomic load of fp -> int promotion in DAG Dec 18, 2024
@jofrn jofrn force-pushed the users/jofrn/spr/main/f9d761c5 branch from 141279f to 70bb5b9 Compare December 18, 2024 11:45
@jofrn jofrn force-pushed the users/jofrn/spr/main/5c36cc8c branch from 7263545 to 5a3a12d Compare December 18, 2024 19:11
@jofrn jofrn force-pushed the users/jofrn/spr/main/f9d761c5 branch 2 times, most recently from dac7f1e to df5e28c Compare December 18, 2024 20:47
@@ -2595,6 +2595,10 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
setOperationAction(Op, MVT::f32, Promote);
}

setOperationPromotedToType(ISD::ATOMIC_LOAD, MVT::f16, MVT::i16);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Presumably similar changes to other backends are also required?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Handle bf16 as well?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bf16 is already lowered properly without promotion.

And yes, other backends would either have to promote these here or implement them explicitly.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SelectionDAG making anything legal by default was a terrible mistake but we're not going to fix that here

@jofrn jofrn force-pushed the users/jofrn/spr/main/5c36cc8c branch from 66eca4b to 4d3fcb3 Compare December 19, 2024 02:29
@jofrn jofrn force-pushed the users/jofrn/spr/main/f9d761c5 branch 4 times, most recently from b336c25 to 7ef2576 Compare December 19, 2024 16:01
@jofrn jofrn force-pushed the users/jofrn/spr/main/5c36cc8c branch from 4d0be71 to 601c009 Compare December 19, 2024 16:01
@jofrn jofrn force-pushed the users/jofrn/spr/main/f9d761c5 branch from 7ef2576 to b4f0562 Compare December 19, 2024 16:24
@jofrn jofrn force-pushed the users/jofrn/spr/main/5c36cc8c branch from 601c009 to 3796cf7 Compare December 19, 2024 16:24
@jofrn jofrn force-pushed the users/jofrn/spr/main/5c36cc8c branch from 3796cf7 to 5f30edf Compare December 19, 2024 16:42
@jofrn jofrn force-pushed the users/jofrn/spr/main/f9d761c5 branch from b4f0562 to e0a02b6 Compare December 19, 2024 16:42
@jofrn jofrn force-pushed the users/jofrn/spr/main/5c36cc8c branch from 5f30edf to 99296f3 Compare December 19, 2024 19:15
@jofrn jofrn force-pushed the users/jofrn/spr/main/f9d761c5 branch 2 times, most recently from 40392eb to 7ca91cc Compare December 19, 2024 19:36
@jofrn jofrn force-pushed the users/jofrn/spr/main/5c36cc8c branch from 99296f3 to 245acf7 Compare December 19, 2024 19:36
@jofrn jofrn force-pushed the users/jofrn/spr/main/f9d761c5 branch from 7ca91cc to 0d6882e Compare December 19, 2024 19:43
@jofrn jofrn force-pushed the users/jofrn/spr/main/5c36cc8c branch 2 times, most recently from a3e83cb to faa0e03 Compare December 19, 2024 21:28
@jofrn jofrn force-pushed the users/jofrn/spr/main/f9d761c5 branch from 5005b94 to c7d4433 Compare May 6, 2025 15:04
@jofrn jofrn force-pushed the users/jofrn/spr/main/5c36cc8c branch from 1e2a179 to 08e39f2 Compare May 7, 2025 12:53
@jofrn jofrn force-pushed the users/jofrn/spr/main/f9d761c5 branch from c7d4433 to 531bc05 Compare May 7, 2025 12:53
@jofrn jofrn force-pushed the users/jofrn/spr/main/5c36cc8c branch from 08e39f2 to c476a24 Compare May 8, 2025 01:53
@jofrn jofrn force-pushed the users/jofrn/spr/main/f9d761c5 branch from 531bc05 to 70a0cad Compare May 8, 2025 01:53
@jofrn jofrn force-pushed the users/jofrn/spr/main/5c36cc8c branch from c476a24 to f5cd42b Compare May 8, 2025 23:38
@jofrn jofrn force-pushed the users/jofrn/spr/main/f9d761c5 branch from 70a0cad to 0219785 Compare May 8, 2025 23:38
@jofrn jofrn force-pushed the users/jofrn/spr/main/5c36cc8c branch from f5cd42b to fd8afbf Compare May 9, 2025 12:53
@jofrn jofrn force-pushed the users/jofrn/spr/main/f9d761c5 branch 3 times, most recently from 4843957 to 5d4d774 Compare May 9, 2025 20:03
@jofrn jofrn force-pushed the users/jofrn/spr/main/5c36cc8c branch from 30182fb to 2ac0180 Compare May 9, 2025 20:03
@jofrn jofrn force-pushed the users/jofrn/spr/main/f9d761c5 branch 2 times, most recently from e9066ea to b24b74b Compare May 11, 2025 00:05
@jofrn jofrn force-pushed the users/jofrn/spr/main/5c36cc8c branch from 8671aa6 to 192b17c Compare May 12, 2025 05:34
@jofrn jofrn force-pushed the users/jofrn/spr/main/f9d761c5 branch from b24b74b to ce52d52 Compare May 12, 2025 05:34
@jofrn jofrn force-pushed the users/jofrn/spr/main/5c36cc8c branch from 192b17c to 85e5dc5 Compare May 27, 2025 17:34
@jofrn jofrn force-pushed the users/jofrn/spr/main/f9d761c5 branch from ce52d52 to 87d478c Compare May 27, 2025 17:34
@jofrn jofrn changed the base branch from users/jofrn/spr/main/5c36cc8c to main June 1, 2025 20:46
@jofrn jofrn force-pushed the users/jofrn/spr/main/f9d761c5 branch from 87d478c to 1e14381 Compare June 1, 2025 20:46
@jofrn jofrn changed the base branch from main to users/jofrn/spr/main/5c36cc8c June 1, 2025 20:46
@jofrn jofrn changed the base branch from users/jofrn/spr/main/5c36cc8c to main June 2, 2025 04:12
jofrn added 3 commits June 2, 2025 00:15
Vector types on atomics are assumed to be invalid by the verifier. However,
this type can be valid if it is lowered by codegen.

commit-id:72529270
`load atomic <1 x T>` is not valid. This change legalizes
vector types of atomic load via scalarization in SelectionDAG
so that it can, for example, translate from `v1i32` to `i32`.

commit-id:5c36cc8c
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
@jofrn jofrn force-pushed the users/jofrn/spr/main/f9d761c5 branch from 1e14381 to 9a088dc Compare June 2, 2025 04:15
@llvmbot llvmbot added llvm:SelectionDAG SelectionDAGISel as well llvm:ir labels Jun 2, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants