Skip to content

Commit a8e15ee

Browse files
committed
[CodeGen] Support freeze expand for ppc_fp128
Summary: The patch D29014 has added the new ISD::FREEZE and can deal with the integer. The patch D76980 has added SoftenFloatRes_FREEZE for float point. But we still lack of expand for ppc_fp128, this will cause assertion for some cases. This patch is to support freeze expand for ppc_fp128. Reviewed By: efriedma Differential Revision: https://reviews.llvm.org/D78278
1 parent ad9988f commit a8e15ee

File tree

3 files changed

+48
-0
lines changed

3 files changed

+48
-0
lines changed

llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1173,6 +1173,7 @@ void DAGTypeLegalizer::ExpandFloatResult(SDNode *N, unsigned ResNo) {
11731173
case ISD::FPOW: ExpandFloatRes_FPOW(N, Lo, Hi); break;
11741174
case ISD::STRICT_FPOWI:
11751175
case ISD::FPOWI: ExpandFloatRes_FPOWI(N, Lo, Hi); break;
1176+
case ISD::FREEZE: ExpandFloatRes_FREEZE(N, Lo, Hi); break;
11761177
case ISD::STRICT_FRINT:
11771178
case ISD::FRINT: ExpandFloatRes_FRINT(N, Lo, Hi); break;
11781179
case ISD::STRICT_FROUND:
@@ -1466,6 +1467,17 @@ void DAGTypeLegalizer::ExpandFloatRes_FPOWI(SDNode *N,
14661467
RTLIB::POWI_PPCF128), Lo, Hi);
14671468
}
14681469

1470+
void DAGTypeLegalizer::ExpandFloatRes_FREEZE(SDNode *N,
1471+
SDValue &Lo, SDValue &Hi) {
1472+
assert(N->getValueType(0) == MVT::ppcf128 &&
1473+
"Logic only correct for ppcf128!");
1474+
1475+
SDLoc dl(N);
1476+
GetExpandedFloat(N->getOperand(0), Lo, Hi);
1477+
Lo = DAG.getNode(ISD::FREEZE, dl, Lo.getValueType(), Lo);
1478+
Hi = DAG.getNode(ISD::FREEZE, dl, Hi.getValueType(), Hi);
1479+
}
1480+
14691481
void DAGTypeLegalizer::ExpandFloatRes_FREM(SDNode *N,
14701482
SDValue &Lo, SDValue &Hi) {
14711483
ExpandFloatRes_Binary(N, GetFPLibCall(N->getValueType(0),

llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
599599
void ExpandFloatRes_FP_EXTEND (SDNode *N, SDValue &Lo, SDValue &Hi);
600600
void ExpandFloatRes_FPOW (SDNode *N, SDValue &Lo, SDValue &Hi);
601601
void ExpandFloatRes_FPOWI (SDNode *N, SDValue &Lo, SDValue &Hi);
602+
void ExpandFloatRes_FREEZE (SDNode *N, SDValue &Lo, SDValue &Hi);
602603
void ExpandFloatRes_FREM (SDNode *N, SDValue &Lo, SDValue &Hi);
603604
void ExpandFloatRes_FRINT (SDNode *N, SDValue &Lo, SDValue &Hi);
604605
void ExpandFloatRes_FROUND (SDNode *N, SDValue &Lo, SDValue &Hi);
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# RUN: llc -mtriple powerpc64le-unknown-linux-gnu -start-after=codegenprepare \
2+
# RUN: -o - %s -verify-machineinstrs | FileCheck %s
3+
4+
--- |
5+
define ppc_fp128 @freeze_select(ppc_fp128 %a, ppc_fp128 %b) {
6+
%sel.frozen = freeze ppc_fp128 %a
7+
%cmp = fcmp one ppc_fp128 %sel.frozen, 0xM00000000000000000000000000000000
8+
br i1 %cmp, label %select.end, label %select.false
9+
10+
select.false: ; preds = %0
11+
br label %select.end
12+
13+
select.end: ; preds = %0, %select.false
14+
%sel = phi ppc_fp128 [ %a, %0 ], [ %b, %select.false ]
15+
ret ppc_fp128 %sel
16+
}
17+
18+
; CHECK-LABEL: freeze_select
19+
; CHECK: # %bb.0:
20+
; CHECK-NEXT: xxlxor 0, 0, 0
21+
; CHECK-NEXT: fcmpu 5, 2, 2
22+
; CHECK-NEXT: fcmpu 1, 1, 1
23+
; CHECK-NEXT: fcmpu 6, 2, 0
24+
; CHECK-NEXT: fcmpu 0, 1, 0
25+
; CHECK-NEXT: crnor 20, 23, 26
26+
; CHECK-NEXT: crand 20, 2, 20
27+
; CHECK-NEXT: bclr 12, 20, 0
28+
; CHECK-NEXT: # %bb.1:
29+
; CHECK-NEXT: crnor 20, 7, 2
30+
; CHECK-NEXT: bclr 12, 20, 0
31+
; CHECK-NEXT: # %bb.2: # %select.false
32+
; CHECK-NEXT: fmr 1, 3
33+
; CHECK-NEXT: fmr 2, 4
34+
; CHECK-NEXT: blr
35+
...

0 commit comments

Comments
 (0)