[llvm] [DAG] getOperationAction - always return Custom action for target opcodes (PR #95401)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 13 05:30:39 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-x86
Author: Simon Pilgrim (RKSimon)
<details>
<summary>Changes</summary>
The target must be responsible for any expansion that needs to be performed for extended types etc.
Fixes #<!-- -->95274
---
Full diff: https://github.com/llvm/llvm-project/pull/95401.diff
2 Files Affected:
- (modified) llvm/include/llvm/CodeGen/TargetLowering.h (+2-1)
- (added) llvm/test/CodeGen/X86/pr95274.ll (+47)
``````````diff
diff --git a/llvm/include/llvm/CodeGen/TargetLowering.h b/llvm/include/llvm/CodeGen/TargetLowering.h
index 167e69afb548c..3074ece787a08 100644
--- a/llvm/include/llvm/CodeGen/TargetLowering.h
+++ b/llvm/include/llvm/CodeGen/TargetLowering.h
@@ -1255,11 +1255,12 @@ class TargetLoweringBase {
/// be promoted to a larger size, needs to be expanded to some other code
/// sequence, or the target has a custom expander for it.
LegalizeAction getOperationAction(unsigned Op, EVT VT) const {
- if (VT.isExtended()) return Expand;
// If a target-specific SDNode requires legalization, require the target
// to provide custom legalization for it.
if (Op >= std::size(OpActions[0]))
return Custom;
+ if (VT.isExtended())
+ return Expand;
return OpActions[(unsigned)VT.getSimpleVT().SimpleTy][Op];
}
diff --git a/llvm/test/CodeGen/X86/pr95274.ll b/llvm/test/CodeGen/X86/pr95274.ll
new file mode 100644
index 0000000000000..bc43a47a28538
--- /dev/null
+++ b/llvm/test/CodeGen/X86/pr95274.ll
@@ -0,0 +1,47 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc < %s -mtriple=x86_64-- -mcpu=skylake-avx512 | FileCheck %s
+
+define void @PR95274(ptr %p0) nounwind {
+; CHECK-LABEL: PR95274:
+; CHECK: # %bb.0:
+; CHECK-NEXT: vcvtps2ph $4, %zmm0, %ymm0
+; CHECK-NEXT: vinsertf64x4 $1, %ymm0, %zmm0, %zmm0
+; CHECK-NEXT: vmovups %zmm0, 1984(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 1920(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 1856(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 1792(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 1728(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 1664(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 1600(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 1536(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 1472(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 1408(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 1344(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 1280(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 1216(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 1152(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 1088(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 1024(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 960(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 896(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 832(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 768(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 704(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 640(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 576(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 512(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 448(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 384(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 320(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 256(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 192(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 128(%rdi)
+; CHECK-NEXT: vmovups %zmm0, 64(%rdi)
+; CHECK-NEXT: vmovups %zmm0, (%rdi)
+; CHECK-NEXT: vzeroupper
+; CHECK-NEXT: retq
+ %load = load <1024 x float>, ptr %p0, align 2
+ %trunc = fptrunc <1024 x float> poison to <1024 x half>
+ store <1024 x half> %trunc, ptr %p0, align 2
+ ret void
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/95401
More information about the llvm-commits
mailing list