From c702e0bc6304f86b83cb0f35ee15606db82f0279 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Mon, 4 Dec 2023 20:31:47 -0800 Subject: [PATCH] [ARM][AArch64] Use SelectionDAG::SplitScalar to simplify some code. We know we're splitting a type in half to two legal values. Instead of using shift and truncate that need to be legalized, we can use two ISD::EXTRACT_ELEMENTs. Spotted while reviewing #67918 for RISC-V which copied this code. --- llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 5 +---- llvm/lib/Target/ARM/ARMISelLowering.cpp | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp index f6e64c49ef05e..f36607b03e76f 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -24301,10 +24301,7 @@ void AArch64TargetLowering::ReplaceExtractSubVectorResults( // Create an even/odd pair of X registers holding integer value V. static SDValue createGPRPairNode(SelectionDAG &DAG, SDValue V) { SDLoc dl(V.getNode()); - SDValue VLo = DAG.getAnyExtOrTrunc(V, dl, MVT::i64); - SDValue VHi = DAG.getAnyExtOrTrunc( - DAG.getNode(ISD::SRL, dl, MVT::i128, V, DAG.getConstant(64, dl, MVT::i64)), - dl, MVT::i64); + auto [VLo, VHi] = DAG.SplitScalar(V, dl, MVT::i64, MVT::i64); if (DAG.getDataLayout().isBigEndian()) std::swap (VLo, VHi); SDValue RegClass = diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 36e3d1fbf856f..db63facca870f 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -10402,10 +10402,7 @@ static void ReplaceREADCYCLECOUNTER(SDNode *N, static SDValue createGPRPairNode(SelectionDAG &DAG, SDValue V) { SDLoc dl(V.getNode()); - SDValue VLo = DAG.getAnyExtOrTrunc(V, dl, MVT::i32); - SDValue VHi = DAG.getAnyExtOrTrunc( - DAG.getNode(ISD::SRL, dl, MVT::i64, V, DAG.getConstant(32, dl, MVT::i32)), - dl, MVT::i32); + auto [VLo, VHi] = DAG.SplitScalar(V, dl, MVT::i32, MVT::i32); bool isBigEndian = DAG.getDataLayout().isBigEndian(); if (isBigEndian) std::swap (VLo, VHi);