Skip to content

Commit 9c65e6a

Browse files
[HEXAGON] Add support to lower "FREEZE a half(f16)" instruction on Hexagon and fix the isel-buildvector-v2f16.ll assertion (llvm#130977)
1 parent 202137d commit 9c65e6a

File tree

3 files changed

+56
-11
lines changed

3 files changed

+56
-11
lines changed

llvm/lib/Target/Hexagon/HexagonISelLowering.h

+1
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,7 @@ class HexagonTargetLowering : public TargetLowering {
362362
shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const override {
363363
return AtomicExpansionKind::LLSC;
364364
}
365+
bool softPromoteHalfType() const override { return true; }
365366

366367
private:
367368
void initializeHVXLowering();

llvm/lib/Target/Hexagon/HexagonISelLoweringHVX.cpp

+11-11
Original file line numberDiff line numberDiff line change
@@ -1618,17 +1618,6 @@ HexagonTargetLowering::LowerHvxBuildVector(SDValue Op, SelectionDAG &DAG)
16181618
for (unsigned i = 0; i != Size; ++i)
16191619
Ops.push_back(Op.getOperand(i));
16201620

1621-
// First, split the BUILD_VECTOR for vector pairs. We could generate
1622-
// some pairs directly (via splat), but splats should be generated
1623-
// by the combiner prior to getting here.
1624-
if (VecTy.getSizeInBits() == 16*Subtarget.getVectorLength()) {
1625-
ArrayRef<SDValue> A(Ops);
1626-
MVT SingleTy = typeSplit(VecTy).first;
1627-
SDValue V0 = buildHvxVectorReg(A.take_front(Size/2), dl, SingleTy, DAG);
1628-
SDValue V1 = buildHvxVectorReg(A.drop_front(Size/2), dl, SingleTy, DAG);
1629-
return DAG.getNode(ISD::CONCAT_VECTORS, dl, VecTy, V0, V1);
1630-
}
1631-
16321621
if (VecTy.getVectorElementType() == MVT::i1)
16331622
return buildHvxVectorPred(Ops, dl, VecTy, DAG);
16341623

@@ -1645,6 +1634,17 @@ HexagonTargetLowering::LowerHvxBuildVector(SDValue Op, SelectionDAG &DAG)
16451634
return DAG.getBitcast(tyVector(VecTy, MVT::f16), T0);
16461635
}
16471636

1637+
// First, split the BUILD_VECTOR for vector pairs. We could generate
1638+
// some pairs directly (via splat), but splats should be generated
1639+
// by the combiner prior to getting here.
1640+
if (VecTy.getSizeInBits() == 16 * Subtarget.getVectorLength()) {
1641+
ArrayRef<SDValue> A(Ops);
1642+
MVT SingleTy = typeSplit(VecTy).first;
1643+
SDValue V0 = buildHvxVectorReg(A.take_front(Size / 2), dl, SingleTy, DAG);
1644+
SDValue V1 = buildHvxVectorReg(A.drop_front(Size / 2), dl, SingleTy, DAG);
1645+
return DAG.getNode(ISD::CONCAT_VECTORS, dl, VecTy, V0, V1);
1646+
}
1647+
16481648
return buildHvxVectorReg(Ops, dl, VecTy, DAG);
16491649
}
16501650

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -march=hexagon < %s | FileCheck %s
3+
4+
define half @freeze_half_undef() nounwind {
5+
; CHECK-LABEL: freeze_half_undef:
6+
; CHECK: // %bb.0:
7+
; CHECK-NEXT: {
8+
; CHECK-NEXT: call __truncsfhf2
9+
; CHECK-NEXT: r0 = #0
10+
; CHECK-NEXT: allocframe(#0)
11+
; CHECK-NEXT: }
12+
; CHECK-NEXT: {
13+
; CHECK-NEXT: call __extendhfsf2
14+
; CHECK-NEXT: }
15+
; CHECK-NEXT: {
16+
; CHECK-NEXT: call __truncsfhf2
17+
; CHECK-NEXT: r0 = sfadd(r0,r0)
18+
; CHECK-NEXT: }
19+
; CHECK-NEXT: {
20+
; CHECK-NEXT: r31:30 = dealloc_return(r30):raw
21+
; CHECK-NEXT: }
22+
%y1 = freeze half undef
23+
%t1 = fadd half %y1, %y1
24+
ret half %t1
25+
}
26+
27+
define half @freeze_half_poison(half %maybe.poison) {
28+
; CHECK-LABEL: freeze_half_poison:
29+
; CHECK: // %bb.0:
30+
; CHECK: {
31+
; CHECK-NEXT: call __extendhfsf2
32+
; CHECK-NEXT: allocframe(r29,#0):raw
33+
; CHECK-NEXT: }
34+
; CHECK-NEXT: {
35+
; CHECK-NEXT: call __truncsfhf2
36+
; CHECK-NEXT: r0 = sfadd(r0,r0)
37+
; CHECK-NEXT: }
38+
; CHECK-NEXT: {
39+
; CHECK-NEXT: r31:30 = dealloc_return(r30):raw
40+
; CHECK-NEXT: }
41+
%y1 = freeze half %maybe.poison
42+
%t1 = fadd half %y1, %y1
43+
ret half %t1
44+
}

0 commit comments

Comments
 (0)