[PATCH] D118222: [RISCV] Split f64 undef into two integer undefs

Wang Pengcheng via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 26 05:01:05 PST 2022


pcwang-thead updated this revision to Diff 403226.
pcwang-thead added a comment.

Address comment.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D118222/new/

https://reviews.llvm.org/D118222

Files:
  llvm/lib/Target/RISCV/RISCVISelLowering.cpp
  llvm/test/CodeGen/RISCV/calling-conv-ilp32d.ll


Index: llvm/test/CodeGen/RISCV/calling-conv-ilp32d.ll
===================================================================
--- llvm/test/CodeGen/RISCV/calling-conv-ilp32d.ll
+++ llvm/test/CodeGen/RISCV/calling-conv-ilp32d.ll
@@ -265,3 +265,10 @@
   %3 = trunc i64 %2 to i32
   ret i32 %3
 }
+
+define double @func_return_undef() {
+; RV32-ILP32D-LABEL: func_return_undef:
+; RV32-ILP32D:       # %bb.0:
+; RV32-ILP32D-NEXT:    ret
+  ret double undef
+}
Index: llvm/lib/Target/RISCV/RISCVISelLowering.cpp
===================================================================
--- llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -8353,27 +8353,37 @@
   DebugLoc DL = MI.getDebugLoc();
   const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo();
   const TargetRegisterInfo *RI = MF.getSubtarget().getRegisterInfo();
+  const MachineRegisterInfo &RegInfo = MF.getRegInfo();
   Register LoReg = MI.getOperand(0).getReg();
   Register HiReg = MI.getOperand(1).getReg();
   Register SrcReg = MI.getOperand(2).getReg();
-  const TargetRegisterClass *SrcRC = &RISCV::FPR64RegClass;
-  int FI = MF.getInfo<RISCVMachineFunctionInfo>()->getMoveF64FrameIndex(MF);
 
-  TII.storeRegToStackSlot(*BB, MI, SrcReg, MI.getOperand(2).isKill(), FI, SrcRC,
-                          RI);
-  MachinePointerInfo MPI = MachinePointerInfo::getFixedStack(MF, FI);
-  MachineMemOperand *MMOLo =
-      MF.getMachineMemOperand(MPI, MachineMemOperand::MOLoad, 4, Align(8));
-  MachineMemOperand *MMOHi = MF.getMachineMemOperand(
-      MPI.getWithOffset(4), MachineMemOperand::MOLoad, 4, Align(8));
-  BuildMI(*BB, MI, DL, TII.get(RISCV::LW), LoReg)
-      .addFrameIndex(FI)
-      .addImm(0)
-      .addMemOperand(MMOLo);
-  BuildMI(*BB, MI, DL, TII.get(RISCV::LW), HiReg)
-      .addFrameIndex(FI)
-      .addImm(4)
-      .addMemOperand(MMOHi);
+  // If the source is undef, we split it into two integer undefs. No need to
+  // remove SrcDef since the ProcessImplicitDefs pass will do it for us.
+  MachineInstr *SrcDef = RegInfo.getVRegDef(SrcReg);
+  if (SrcDef->isImplicitDef()) {
+    BuildMI(*BB, MI, DL, TII.get(TargetOpcode::IMPLICIT_DEF), LoReg);
+    BuildMI(*BB, MI, DL, TII.get(TargetOpcode::IMPLICIT_DEF), HiReg);
+  } else {
+    const TargetRegisterClass *SrcRC = &RISCV::FPR64RegClass;
+    int FI = MF.getInfo<RISCVMachineFunctionInfo>()->getMoveF64FrameIndex(MF);
+
+    TII.storeRegToStackSlot(*BB, MI, SrcReg, MI.getOperand(2).isKill(), FI,
+                            SrcRC, RI);
+    MachinePointerInfo MPI = MachinePointerInfo::getFixedStack(MF, FI);
+    MachineMemOperand *MMOLo =
+        MF.getMachineMemOperand(MPI, MachineMemOperand::MOLoad, 4, Align(8));
+    MachineMemOperand *MMOHi = MF.getMachineMemOperand(
+        MPI.getWithOffset(4), MachineMemOperand::MOLoad, 4, Align(8));
+    BuildMI(*BB, MI, DL, TII.get(RISCV::LW), LoReg)
+        .addFrameIndex(FI)
+        .addImm(0)
+        .addMemOperand(MMOLo);
+    BuildMI(*BB, MI, DL, TII.get(RISCV::LW), HiReg)
+        .addFrameIndex(FI)
+        .addImm(4)
+        .addMemOperand(MMOHi);
+  }
   MI.eraseFromParent(); // The pseudo instruction is gone now.
   return BB;
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D118222.403226.patch
Type: text/x-patch
Size: 3194 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220126/5cba387e/attachment.bin>


More information about the llvm-commits mailing list