[PATCH] D82552: [CodeGen] Matching promoted type for 16-bit integer bitcasts from fp16 operand
Lucas Prates via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 25 08:00:52 PDT 2020
pratlucas created this revision.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.
pratlucas added reviewers: ostannard, efriedma, pirama, jmolloy, plotfi.
When legalizing a biscast operation from an fp16 operand to an i16 on a
target that requires both input and output types to be promoted to
32-bits, an assertion can fail when building the new node due to a
mismatch between the the operation's result size and the type specified to
the node.
This patches fix the issue by making sure the bit width of the types
match for the FP_TO_FP16 node, covering the difference with an extra
ANYEXTEND operation.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D82552
Files:
llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
llvm/test/CodeGen/ARM/arm-half-promote.ll
Index: llvm/test/CodeGen/ARM/arm-half-promote.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/ARM/arm-half-promote.ll
@@ -0,0 +1,53 @@
+; RUN: llc < %s -mtriple=thumbv7s-apple-ios7.0.0 | FileCheck %s
+
+define arm_aapcs_vfpcc { <8 x half>, <8 x half> } @f1() {
+; CHECK-LABLE: _f1
+; CHECK: vpush {d8}
+; CHECK-NEXT: vmov.f64 d8, #5.000000e-01
+; CHECK-NEXT: vmov.i32 d8, #0x0
+; CHECK-NEXT: vmov.i32 d0, #0x0
+; CHECK-NEXT: vmov.i32 d1, #0x0
+; CHECK-NEXT: vmov.i32 d2, #0x0
+; CHECK-NEXT: vmov.i32 d3, #0x0
+; CHECK-NEXT: vmov.i32 d4, #0x0
+; CHECK-NEXT: vmov.i32 d5, #0x0
+; CHECK-NEXT: vmov.i32 d6, #0x0
+; CHECK-NEXT: vmov.i32 d7, #0x0
+; CHECK-NEXT: vmov.f32 s1, s16
+; CHECK-NEXT: vmov.f32 s3, s16
+; CHECK-NEXT: vmov.f32 s5, s16
+; CHECK-NEXT: vmov.f32 s7, s16
+; CHECK-NEXT: vmov.f32 s9, s16
+; CHECK-NEXT: vmov.f32 s11, s16
+; CHECK-NEXT: vmov.f32 s13, s16
+; CHECK-NEXT: vmov.f32 s15, s16
+; CHECK-NEXT: vpop {d8}
+; CHECK-NEXT: bx lr
+ ret { <8 x half>, <8 x half> } zeroinitializer
+}
+
+define swiftcc { <8 x half>, <8 x half> } @f2() {
+; CHECK-LABLE: _f2
+; CHECK: vpush {d8}
+; CHECK-NEXT: vmov.f64 d8, #5.000000e-01
+; CHECK-NEXT: vmov.i32 d8, #0x0
+; CHECK-NEXT: vmov.i32 d0, #0x0
+; CHECK-NEXT: vmov.i32 d1, #0x0
+; CHECK-NEXT: vmov.i32 d2, #0x0
+; CHECK-NEXT: vmov.i32 d3, #0x0
+; CHECK-NEXT: vmov.i32 d4, #0x0
+; CHECK-NEXT: vmov.i32 d5, #0x0
+; CHECK-NEXT: vmov.i32 d6, #0x0
+; CHECK-NEXT: vmov.i32 d7, #0x0
+; CHECK-NEXT: vmov.f32 s1, s16
+; CHECK-NEXT: vmov.f32 s3, s16
+; CHECK-NEXT: vmov.f32 s5, s16
+; CHECK-NEXT: vmov.f32 s7, s16
+; CHECK-NEXT: vmov.f32 s9, s16
+; CHECK-NEXT: vmov.f32 s11, s16
+; CHECK-NEXT: vmov.f32 s13, s16
+; CHECK-NEXT: vmov.f32 s15, s16
+; CHECK-NEXT: vpop {d8}
+; CHECK-NEXT: bx lr
+ ret { <8 x half>, <8 x half> } zeroinitializer
+}
Index: llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
+++ llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
@@ -331,8 +331,11 @@
return DAG.getNode(ISD::ANY_EXTEND, dl, NOutVT, GetSoftPromotedHalf(InOp));
case TargetLowering::TypePromoteFloat: {
// Convert the promoted float by hand.
- if (!NOutVT.isVector())
- return DAG.getNode(ISD::FP_TO_FP16, dl, NOutVT, GetPromotedFloat(InOp));
+ if (!NOutVT.isVector()) {
+ SDValue Val =
+ DAG.getNode(ISD::FP_TO_FP16, dl, OutVT, GetPromotedFloat(InOp));
+ return DAG.getNode(ISD::ANY_EXTEND, dl, NOutVT, Val);
+ }
break;
}
case TargetLowering::TypeExpandInteger:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D82552.273354.patch
Type: text/x-patch
Size: 2924 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200625/0e388f3f/attachment.bin>
More information about the llvm-commits
mailing list