Skip to content

Conversation

@davemgreen
Copy link
Collaborator

With range and undef metadata on a call we can have vector AssertZExt generated on a target with no vector operations. The AssertZExt needs to scalarize to a normal AssertZext tin, ValueType. I have added AssertSext too, although I do not have a test case.

Fixes #110374

@llvmbot llvmbot added backend:ARM llvm:SelectionDAG SelectionDAGISel as well labels Jan 10, 2025
@llvmbot
Copy link
Member

llvmbot commented Jan 10, 2025

@llvm/pr-subscribers-llvm-selectiondag

Author: David Green (davemgreen)

Changes

With range and undef metadata on a call we can have vector AssertZExt generated on a target with no vector operations. The AssertZExt needs to scalarize to a normal AssertZext tin, ValueType. I have added AssertSext too, although I do not have a test case.

Fixes #110374


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

2 Files Affected:

  • (modified) llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp (+5-1)
  • (added) llvm/test/CodeGen/ARM/scalarize-assert-zext.ll (+28)
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
index 780eba16c9c498..137d662c79ca41 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
@@ -58,7 +58,11 @@ void DAGTypeLegalizer::ScalarizeVectorResult(SDNode *N, unsigned ResNo) {
   case ISD::BUILD_VECTOR:      R = ScalarizeVecRes_BUILD_VECTOR(N); break;
   case ISD::EXTRACT_SUBVECTOR: R = ScalarizeVecRes_EXTRACT_SUBVECTOR(N); break;
   case ISD::FP_ROUND:          R = ScalarizeVecRes_FP_ROUND(N); break;
-  case ISD::FPOWI:             R = ScalarizeVecRes_ExpOp(N); break;
+  case ISD::AssertZext:
+  case ISD::AssertSext:
+  case ISD::FPOWI:
+    R = ScalarizeVecRes_ExpOp(N);
+    break;
   case ISD::INSERT_VECTOR_ELT: R = ScalarizeVecRes_INSERT_VECTOR_ELT(N); break;
   case ISD::LOAD:           R = ScalarizeVecRes_LOAD(cast<LoadSDNode>(N));break;
   case ISD::SCALAR_TO_VECTOR:  R = ScalarizeVecRes_SCALAR_TO_VECTOR(N); break;
diff --git a/llvm/test/CodeGen/ARM/scalarize-assert-zext.ll b/llvm/test/CodeGen/ARM/scalarize-assert-zext.ll
new file mode 100644
index 00000000000000..47b49b5316ebfc
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/scalarize-assert-zext.ll
@@ -0,0 +1,28 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=armv7-unknown-linux-musleabihf -mattr=-neon %s -o - | FileCheck %s
+
+declare fastcc noundef range(i16 0, 256) <4 x i16> @other()
+
+define void @test(ptr %0) #0 {
+; CHECK-LABEL: test:
+; CHECK:       @ %bb.0: @ %entry
+; CHECK-NEXT:    .save {r4, lr}
+; CHECK-NEXT:    push {r4, lr}
+; CHECK-NEXT:    mov r4, r0
+; CHECK-NEXT:    bl other
+; CHECK-NEXT:    uxth r3, r3
+; CHECK-NEXT:    uxth r2, r2
+; CHECK-NEXT:    uxth r1, r1
+; CHECK-NEXT:    uxth r0, r0
+; CHECK-NEXT:    strb r3, [r4, #3]
+; CHECK-NEXT:    strb r2, [r4, #2]
+; CHECK-NEXT:    strb r1, [r4, #1]
+; CHECK-NEXT:    strb r0, [r4]
+; CHECK-NEXT:    pop {r4, pc}
+entry:
+  %call33.i70 = call fastcc <4 x i16> @other()
+  %conv.i.i.i71 = trunc <4 x i16> %call33.i70 to <4 x i8>
+  store <4 x i8> %conv.i.i.i71, ptr %0, align 1
+  ret void
+}
+

@llvmbot
Copy link
Member

llvmbot commented Jan 10, 2025

@llvm/pr-subscribers-backend-arm

Author: David Green (davemgreen)

Changes

With range and undef metadata on a call we can have vector AssertZExt generated on a target with no vector operations. The AssertZExt needs to scalarize to a normal AssertZext tin, ValueType. I have added AssertSext too, although I do not have a test case.

Fixes #110374


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

2 Files Affected:

  • (modified) llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp (+5-1)
  • (added) llvm/test/CodeGen/ARM/scalarize-assert-zext.ll (+28)
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
index 780eba16c9c498..137d662c79ca41 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
@@ -58,7 +58,11 @@ void DAGTypeLegalizer::ScalarizeVectorResult(SDNode *N, unsigned ResNo) {
   case ISD::BUILD_VECTOR:      R = ScalarizeVecRes_BUILD_VECTOR(N); break;
   case ISD::EXTRACT_SUBVECTOR: R = ScalarizeVecRes_EXTRACT_SUBVECTOR(N); break;
   case ISD::FP_ROUND:          R = ScalarizeVecRes_FP_ROUND(N); break;
-  case ISD::FPOWI:             R = ScalarizeVecRes_ExpOp(N); break;
+  case ISD::AssertZext:
+  case ISD::AssertSext:
+  case ISD::FPOWI:
+    R = ScalarizeVecRes_ExpOp(N);
+    break;
   case ISD::INSERT_VECTOR_ELT: R = ScalarizeVecRes_INSERT_VECTOR_ELT(N); break;
   case ISD::LOAD:           R = ScalarizeVecRes_LOAD(cast<LoadSDNode>(N));break;
   case ISD::SCALAR_TO_VECTOR:  R = ScalarizeVecRes_SCALAR_TO_VECTOR(N); break;
diff --git a/llvm/test/CodeGen/ARM/scalarize-assert-zext.ll b/llvm/test/CodeGen/ARM/scalarize-assert-zext.ll
new file mode 100644
index 00000000000000..47b49b5316ebfc
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/scalarize-assert-zext.ll
@@ -0,0 +1,28 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=armv7-unknown-linux-musleabihf -mattr=-neon %s -o - | FileCheck %s
+
+declare fastcc noundef range(i16 0, 256) <4 x i16> @other()
+
+define void @test(ptr %0) #0 {
+; CHECK-LABEL: test:
+; CHECK:       @ %bb.0: @ %entry
+; CHECK-NEXT:    .save {r4, lr}
+; CHECK-NEXT:    push {r4, lr}
+; CHECK-NEXT:    mov r4, r0
+; CHECK-NEXT:    bl other
+; CHECK-NEXT:    uxth r3, r3
+; CHECK-NEXT:    uxth r2, r2
+; CHECK-NEXT:    uxth r1, r1
+; CHECK-NEXT:    uxth r0, r0
+; CHECK-NEXT:    strb r3, [r4, #3]
+; CHECK-NEXT:    strb r2, [r4, #2]
+; CHECK-NEXT:    strb r1, [r4, #1]
+; CHECK-NEXT:    strb r0, [r4]
+; CHECK-NEXT:    pop {r4, pc}
+entry:
+  %call33.i70 = call fastcc <4 x i16> @other()
+  %conv.i.i.i71 = trunc <4 x i16> %call33.i70 to <4 x i8>
+  store <4 x i8> %conv.i.i.i71, ptr %0, align 1
+  ret void
+}
+

case ISD::AssertZext:
case ISD::AssertSext:
case ISD::FPOWI:
R = ScalarizeVecRes_ExpOp(N);
Copy link
Contributor

Choose a reason for hiding this comment

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

Function name doesnt' quite match anymore

With range and undef metadata on a call we can have vector AssertZExt generated
on a target with no vector operations. The AssertZExt needs to scalarize to a
normal `AssertZext tin, ValueType`. I have added AssertSext too, although I do
not have a test case.
@davemgreen davemgreen force-pushed the gh-arm-scalarizeassertzext branch from 012b53b to 5da345a Compare January 11, 2025 16:24
@davemgreen davemgreen merged commit ab9a80a into llvm:main Jan 11, 2025
5 of 8 checks passed
@davemgreen davemgreen deleted the gh-arm-scalarizeassertzext branch January 11, 2025 16:29
@glandium
Copy link
Contributor

Would it make sense to push to the 19.x branch and spin a 19.1.7?

@glandium
Copy link
Contributor

Cc: @tru

@nikic nikic added this to the LLVM 19.X Release milestone Jan 11, 2025
@nikic
Copy link
Contributor

nikic commented Jan 11, 2025

/cherry-pick ab9a80a

@llvmbot
Copy link
Member

llvmbot commented Jan 11, 2025

/pull-request #122617

BaiXilin pushed a commit to BaiXilin/llvm-project that referenced this pull request Jan 12, 2025
With range and undef metadata on a call we can have vector AssertZExt
generated on a target with no vector operations. The AssertZExt needs to
scalarize to a normal `AssertZext tin, ValueType`. I have added
AssertSext too, although I do not have a test case.

Fixes llvm#110374
tru pushed a commit to llvmbot/llvm-project that referenced this pull request Jan 13, 2025
With range and undef metadata on a call we can have vector AssertZExt
generated on a target with no vector operations. The AssertZExt needs to
scalarize to a normal `AssertZext tin, ValueType`. I have added
AssertSext too, although I do not have a test case.

Fixes llvm#110374

(cherry picked from commit ab9a80a)
tru pushed a commit to llvmbot/llvm-project that referenced this pull request Jan 14, 2025
With range and undef metadata on a call we can have vector AssertZExt
generated on a target with no vector operations. The AssertZExt needs to
scalarize to a normal `AssertZext tin, ValueType`. I have added
AssertSext too, although I do not have a test case.

Fixes llvm#110374

(cherry picked from commit ab9a80a)
tru pushed a commit to llvmbot/llvm-project that referenced this pull request Jan 14, 2025
With range and undef metadata on a call we can have vector AssertZExt
generated on a target with no vector operations. The AssertZExt needs to
scalarize to a normal `AssertZext tin, ValueType`. I have added
AssertSext too, although I do not have a test case.

Fixes llvm#110374

(cherry picked from commit ab9a80a)
neboat pushed a commit to neboat/opencilk-toolchain that referenced this pull request May 18, 2025
  Might fail on some archs
* Cherry-pick llvm/llvm-project#122463
  llvm/llvm-project#110374
  to be allow Firefox to build on armhf
dimitry-ishenko pushed a commit to dimitry-ishenko-cpp/llvm-toolchain that referenced this pull request Sep 20, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backend:ARM llvm:SelectionDAG SelectionDAGISel as well

Projects

Development

Successfully merging this pull request may close these issues.

firefox fails to build with ICE in src/gl.cc with clang-19

5 participants