Skip to content

Commit 5da345a

Browse files
committed
[DAG] Allow AssertZExt to scalarize.
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.
1 parent d291e45 commit 5da345a

File tree

3 files changed

+53
-3
lines changed

3 files changed

+53
-3
lines changed

Diff for: llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -858,7 +858,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
858858
SDValue ScalarizeVecRes_BUILD_VECTOR(SDNode *N);
859859
SDValue ScalarizeVecRes_EXTRACT_SUBVECTOR(SDNode *N);
860860
SDValue ScalarizeVecRes_FP_ROUND(SDNode *N);
861-
SDValue ScalarizeVecRes_ExpOp(SDNode *N);
861+
SDValue ScalarizeVecRes_UnaryOpWithExtraInput(SDNode *N);
862862
SDValue ScalarizeVecRes_INSERT_VECTOR_ELT(SDNode *N);
863863
SDValue ScalarizeVecRes_LOAD(LoadSDNode *N);
864864
SDValue ScalarizeVecRes_SCALAR_TO_VECTOR(SDNode *N);

Diff for: llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,11 @@ void DAGTypeLegalizer::ScalarizeVectorResult(SDNode *N, unsigned ResNo) {
5858
case ISD::BUILD_VECTOR: R = ScalarizeVecRes_BUILD_VECTOR(N); break;
5959
case ISD::EXTRACT_SUBVECTOR: R = ScalarizeVecRes_EXTRACT_SUBVECTOR(N); break;
6060
case ISD::FP_ROUND: R = ScalarizeVecRes_FP_ROUND(N); break;
61-
case ISD::FPOWI: R = ScalarizeVecRes_ExpOp(N); break;
61+
case ISD::AssertZext:
62+
case ISD::AssertSext:
63+
case ISD::FPOWI:
64+
R = ScalarizeVecRes_UnaryOpWithExtraInput(N);
65+
break;
6266
case ISD::INSERT_VECTOR_ELT: R = ScalarizeVecRes_INSERT_VECTOR_ELT(N); break;
6367
case ISD::LOAD: R = ScalarizeVecRes_LOAD(cast<LoadSDNode>(N));break;
6468
case ISD::SCALAR_TO_VECTOR: R = ScalarizeVecRes_SCALAR_TO_VECTOR(N); break;
@@ -436,7 +440,7 @@ SDValue DAGTypeLegalizer::ScalarizeVecRes_FP_ROUND(SDNode *N) {
436440
N->getOperand(1));
437441
}
438442

439-
SDValue DAGTypeLegalizer::ScalarizeVecRes_ExpOp(SDNode *N) {
443+
SDValue DAGTypeLegalizer::ScalarizeVecRes_UnaryOpWithExtraInput(SDNode *N) {
440444
SDValue Op = GetScalarizedVector(N->getOperand(0));
441445
return DAG.getNode(N->getOpcode(), SDLoc(N), Op.getValueType(), Op,
442446
N->getOperand(1));

Diff for: llvm/test/CodeGen/ARM/scalarize-assert-zext.ll

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple=armv7-unknown-linux-musleabihf -mattr=-neon %s -o - | FileCheck %s
3+
4+
declare fastcc noundef range(i16 0, 256) <4 x i16> @other()
5+
6+
define void @test(ptr %0) #0 {
7+
; CHECK-LABEL: test:
8+
; CHECK: @ %bb.0: @ %entry
9+
; CHECK-NEXT: .save {r4, lr}
10+
; CHECK-NEXT: push {r4, lr}
11+
; CHECK-NEXT: mov r4, r0
12+
; CHECK-NEXT: bl other
13+
; CHECK-NEXT: uxth r3, r3
14+
; CHECK-NEXT: uxth r2, r2
15+
; CHECK-NEXT: uxth r1, r1
16+
; CHECK-NEXT: uxth r0, r0
17+
; CHECK-NEXT: strb r3, [r4, #3]
18+
; CHECK-NEXT: strb r2, [r4, #2]
19+
; CHECK-NEXT: strb r1, [r4, #1]
20+
; CHECK-NEXT: strb r0, [r4]
21+
; CHECK-NEXT: pop {r4, pc}
22+
entry:
23+
%call = call fastcc <4 x i16> @other()
24+
%t = trunc <4 x i16> %call to <4 x i8>
25+
store <4 x i8> %t, ptr %0, align 1
26+
ret void
27+
}
28+
29+
define <4 x i16> @test2() #0 {
30+
; CHECK-LABEL: test2:
31+
; CHECK: @ %bb.0: @ %entry
32+
; CHECK-NEXT: .save {r11, lr}
33+
; CHECK-NEXT: push {r11, lr}
34+
; CHECK-NEXT: bl other
35+
; CHECK-NEXT: movw r1, #65408
36+
; CHECK-NEXT: and r0, r0, r1
37+
; CHECK-NEXT: and r2, r2, r1
38+
; CHECK-NEXT: mov r1, #0
39+
; CHECK-NEXT: mov r3, #0
40+
; CHECK-NEXT: pop {r11, pc}
41+
entry:
42+
%call = call fastcc <4 x i16> @other()
43+
%a = and <4 x i16> %call, <i16 u0x80, i16 u0x100, i16 u0x80, i16 u0x100>
44+
ret <4 x i16> %a
45+
}
46+

0 commit comments

Comments
 (0)