[llvm-commits] [llvm] r55325 - in /llvm/trunk: include/llvm/CodeGen/FastISel.h lib/CodeGen/SelectionDAG/FastISel.cpp test/CodeGen/X86/fast-isel.ll utils/TableGen/FastISelEmitter.cpp
Owen Anderson
resistor at mac.com
Mon Aug 25 13:20:33 PDT 2008
Author: resistor
Date: Mon Aug 25 15:20:32 2008
New Revision: 55325
URL: http://llvm.org/viewvc/llvm-project?rev=55325&view=rev
Log:
Add support for fast isel of (integer) immediate materialization pattens, and use them to support
bitcast of constants in fast isel.
Modified:
llvm/trunk/include/llvm/CodeGen/FastISel.h
llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp
llvm/trunk/test/CodeGen/X86/fast-isel.ll
llvm/trunk/utils/TableGen/FastISelEmitter.cpp
Modified: llvm/trunk/include/llvm/CodeGen/FastISel.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/FastISel.h?rev=55325&r1=55324&r2=55325&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/FastISel.h (original)
+++ llvm/trunk/include/llvm/CodeGen/FastISel.h Mon Aug 25 15:20:32 2008
@@ -81,11 +81,6 @@
ISD::NodeType Opcode,
unsigned Op0, unsigned Op1);
- /// FastEmit_i - This method is called by target-independent code
- /// to request that an instruction with the given type which materialize
- /// the specified immediate value.
- virtual unsigned FastEmit_i(MVT::SimpleValueType VT, uint64_t Imm);
-
/// FastEmit_ri - This method is called by target-independent code
/// to request that an instruction with the given type, opcode, and
/// register and immediate operands be emitted.
@@ -110,6 +105,13 @@
ISD::NodeType Opcode,
unsigned Op0, uint64_t Imm,
MVT::SimpleValueType ImmType);
+
+ /// FastEmit_i - This method is called by target-independent code
+ /// to request that an instruction with the given type, opcode, and
+ /// immediate operand be emitted.
+ virtual unsigned FastEmit_i(MVT::SimpleValueType VT,
+ ISD::NodeType Opcode,
+ uint64_t Imm);
/// FastEmitInst_ - Emit a MachineInstr with no operands and a
/// result register in the given register class.
@@ -144,6 +146,12 @@
unsigned FastEmitInst_rri(unsigned MachineInstOpcode,
const TargetRegisterClass *RC,
unsigned Op0, unsigned Op1, uint64_t Imm);
+
+ /// FastEmitInst_i - Emit a MachineInstr with a single immediate
+ /// operand, and a result register in the given register class.
+ unsigned FastEmitInst_i(unsigned MachineInstrOpcode,
+ const TargetRegisterClass *RC,
+ uint64_t Imm);
private:
unsigned createResultReg(const TargetRegisterClass *RC);
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp?rev=55325&r1=55324&r2=55325&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp Mon Aug 25 15:20:32 2008
@@ -221,6 +221,22 @@
case Instruction::PHI:
// PHI nodes are already emitted.
break;
+
+ case Instruction::BitCast:
+ // BitCast consists of either an immediate to register move
+ // or a register to register move.
+ if (ConstantInt* CI = dyn_cast<ConstantInt>(I->getOperand(0))) {
+ if (I->getType()->isInteger()) {
+ MVT VT = MVT::getMVT(I->getType(), /*HandleUnknown=*/false);
+ ValueMap[I] = FastEmit_i(VT.getSimpleVT(), ISD::Constant,
+ CI->getZExtValue());
+ break;
+ } else
+ // TODO: Support vector and fp constants.
+ return I;
+ } else
+ // TODO: Support non-constant bitcasts.
+ return I;
default:
// Unhandled instruction. Halt "fast" selection and bail.
@@ -256,7 +272,8 @@
return 0;
}
-unsigned FastISel::FastEmit_i(MVT::SimpleValueType, uint64_t /*Imm*/) {
+unsigned FastISel::FastEmit_i(MVT::SimpleValueType, ISD::NodeType,
+ uint64_t /*Imm*/) {
return 0;
}
@@ -284,7 +301,7 @@
ResultReg = FastEmit_ri(VT, Opcode, Op0, Imm);
if (ResultReg != 0)
return ResultReg;
- unsigned MaterialReg = FastEmit_i(ImmType, Imm);
+ unsigned MaterialReg = FastEmit_i(ImmType, ISD::Constant, Imm);
if (MaterialReg == 0)
return 0;
return FastEmit_rr(VT, Opcode, Op0, MaterialReg);
@@ -342,3 +359,13 @@
BuildMI(MBB, II, ResultReg).addReg(Op0).addReg(Op1).addImm(Imm);
return ResultReg;
}
+
+unsigned FastISel::FastEmitInst_i(unsigned MachineInstOpcode,
+ const TargetRegisterClass *RC,
+ uint64_t Imm) {
+ unsigned ResultReg = createResultReg(RC);
+ const TargetInstrDesc &II = TII.get(MachineInstOpcode);
+
+ BuildMI(MBB, II, ResultReg).addImm(Imm);
+ return ResultReg;
+}
\ No newline at end of file
Modified: llvm/trunk/test/CodeGen/X86/fast-isel.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/fast-isel.ll?rev=55325&r1=55324&r2=55325&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/fast-isel.ll (original)
+++ llvm/trunk/test/CodeGen/X86/fast-isel.ll Mon Aug 25 15:20:32 2008
@@ -41,3 +41,8 @@
ret double %t2
}
+define i32 @cast(){
+entry:
+ %tmp2 = bitcast i32 0 to i32
+ ret i32 %tmp2
+}
Modified: llvm/trunk/utils/TableGen/FastISelEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/FastISelEmitter.cpp?rev=55325&r1=55324&r2=55325&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/FastISelEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/FastISelEmitter.cpp Mon Aug 25 15:20:32 2008
@@ -64,6 +64,12 @@
const CodeGenTarget &Target,
MVT::SimpleValueType VT,
const CodeGenRegisterClass *DstRC) {
+ if (!InstPatNode->isLeaf() &&
+ InstPatNode->getOperator()->getName() == "imm") {
+ Operands.push_back("i");
+ return true;
+ }
+
for (unsigned i = 0, e = InstPatNode->getNumChildren(); i != e; ++i) {
TreePatternNode *Op = InstPatNode->getChild(i);
// For now, filter out any operand with a predicate.
@@ -219,9 +225,6 @@
// an Operand or an immediate, like MOV32ri.
if (InstPatOp->isSubClassOf("Operand"))
continue;
- if (InstPatOp->getName() == "imm" ||
- InstPatOp->getName() == "fpimm")
- continue;
// For now, filter out any instructions with predicates.
if (!InstPatNode->getPredicateFn().empty())
More information about the llvm-commits
mailing list