[llvm] [Xtensa] Implement lowering SELECT_CC, SETCC. (PR #97017)
Sergei Barannikov via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 10 06:23:30 PDT 2024
================
@@ -697,6 +752,86 @@ const char *XtensaTargetLowering::getTargetNodeName(unsigned Opcode) const {
return "XtensaISD::PCREL_WRAPPER";
case XtensaISD::RET:
return "XtensaISD::RET";
+ case XtensaISD::SELECT_CC:
+ return "XtensaISD::SELECT_CC";
}
return nullptr;
}
+
+//===----------------------------------------------------------------------===//
+// Custom insertion
+//===----------------------------------------------------------------------===//
+
+MachineBasicBlock *
+XtensaTargetLowering::emitSelectCC(MachineInstr &MI,
+ MachineBasicBlock *MBB) const {
+ const TargetInstrInfo &TII = *Subtarget.getInstrInfo();
+ DebugLoc DL = MI.getDebugLoc();
+
+ MachineOperand &LHS = MI.getOperand(1);
+ MachineOperand &RHS = MI.getOperand(2);
+ MachineOperand &TrueValue = MI.getOperand(3);
+ MachineOperand &FalseValue = MI.getOperand(4);
+ unsigned BrKind = MI.getOperand(5).getImm();
+
+ // To "insert" a SELECT_CC instruction, we actually have to insert
+ // CopyMBB and SinkMBB blocks and add branch to MBB. We build phi
+ // operation in SinkMBB like phi (TrueVakue,FalseValue), where TrueValue
+ // is passed from MMB and FalseValue is passed from CopyMBB.
+ // MBB
+ // | \
+ // | CopyMBB
+ // | /
+ // SinkMBB
+ // The incoming instruction knows the
+ // destination vreg to set, the condition code register to branch on, the
+ // true/false values to select between, and a branch opcode to use.
+ const BasicBlock *LLVM_BB = MBB->getBasicBlock();
+ MachineFunction::iterator It = ++MBB->getIterator();
+
+ MachineFunction *F = MBB->getParent();
+ MachineBasicBlock *CopyMBB = F->CreateMachineBasicBlock(LLVM_BB);
+ MachineBasicBlock *SinkMBB = F->CreateMachineBasicBlock(LLVM_BB);
----------------
s-barannikov wrote:
You will need a code like this here (for a future patch that adds related tests), see 2dcf0512:
```
// Set the call frame size on entry to the new basic blocks.
uint64_t CallFrameSize = TII.getCallFrameSizeAt(MI);
CopyMBB->setCallFrameSize(CallFrameSize);
SinkMBB->setCallFrameSize(CallFrameSize);
```
https://github.com/llvm/llvm-project/pull/97017
More information about the llvm-commits
mailing list