[PATCH] D139813: [PowerPC] Improve materialization for immediates which is almost a 32 bit splat.
Esme Yi via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 12 23:29:34 PST 2022
Esme updated this revision to Diff 482368.
Esme added a comment.
Address comments.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D139813/new/
https://reviews.llvm.org/D139813
Files:
llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
llvm/test/CodeGen/PowerPC/constants-i64.ll
Index: llvm/test/CodeGen/PowerPC/constants-i64.ll
===================================================================
--- llvm/test/CodeGen/PowerPC/constants-i64.ll
+++ llvm/test/CodeGen/PowerPC/constants-i64.ll
@@ -380,8 +380,7 @@
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis 3, -13105
; CHECK-NEXT: ori 3, 3, 52479
-; CHECK-NEXT: rldic 3, 3, 32, 0
-; CHECK-NEXT: oris 3, 3, 52431
+; CHECK-NEXT: rldimi 3, 3, 32, 0
; CHECK-NEXT: ori 3, 3, 291
; CHECK-NEXT: blr
entry:
@@ -393,9 +392,8 @@
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lis 3, -13057
; CHECK-NEXT: ori 3, 3, 52479
-; CHECK-NEXT: rldic 3, 3, 32, 0
+; CHECK-NEXT: rldimi 3, 3, 32, 0
; CHECK-NEXT: oris 3, 3, 291
-; CHECK-NEXT: ori 3, 3, 52479
; CHECK-NEXT: blr
entry:
ret i64 14771750698406366463 ;0xCCFFCCFF0123CCFF
Index: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
===================================================================
--- llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
+++ llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
@@ -1328,6 +1328,43 @@
getI32Imm(Lo16));
++InstCntDirect;
}
+
+ // Try to use 4 instructions to materialize the immediate which is "almost" a
+ // splat of a 32 bit immediate.
+ if (InstCntDirect > 4) {
+ uint32_t Hi16OfHi32 = (Hi_32(Imm) >> 16) & 0xffff;
+ uint32_t Lo16OfHi32 = Hi_32(Imm) & 0xffff;
+ uint32_t Hi16OfLo32 = (Lo_32(Imm) >> 16) & 0xffff;
+ uint32_t Lo16OfLo32 = Lo_32(Imm) & 0xffff;
+
+ auto getSplat = [CurDAG, dl](uint32_t Hi16, uint32_t Lo16) {
+ auto getI32Imm = [CurDAG, dl](unsigned Imm) {
+ return CurDAG->getTargetConstant(Imm, dl, MVT::i32);
+ };
+ SDNode *Result =
+ CurDAG->getMachineNode(PPC::LIS8, dl, MVT::i64, getI32Imm(Hi16));
+ Result = CurDAG->getMachineNode(PPC::ORI8, dl, MVT::i64,
+ SDValue(Result, 0), getI32Imm(Lo16));
+ SDValue Ops[] = {SDValue(Result, 0), SDValue(Result, 0), getI32Imm(32),
+ getI32Imm(0)};
+ return CurDAG->getMachineNode(PPC::RLDIMI, dl, MVT::i64, Ops);
+ };
+
+ if (Hi16OfHi32 == Hi16OfLo32) {
+ InstCntDirect = 4;
+ Result = getSplat(Hi16OfHi32, Lo16OfHi32);
+ Result = CurDAG->getMachineNode(
+ PPC::ORI8, dl, MVT::i64, SDValue(Result, 0),
+ CurDAG->getTargetConstant(Lo16OfLo32, dl, MVT::i32));
+ } else if (Lo16OfHi32 == Lo16OfLo32) {
+ InstCntDirect = 4;
+ Result = getSplat(Hi16OfHi32, Lo16OfHi32);
+ Result = CurDAG->getMachineNode(
+ PPC::ORIS8, dl, MVT::i64, SDValue(Result, 0),
+ CurDAG->getTargetConstant(Hi16OfLo32, dl, MVT::i32));
+ }
+ }
+
if (InstCnt)
*InstCnt = InstCntDirect;
return Result;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D139813.482368.patch
Type: text/x-patch
Size: 2758 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221213/5412d4a7/attachment.bin>
More information about the llvm-commits
mailing list