diff options
| author | Quentin Colombet <qcolombet@apple.com> | 2013-10-22 21:29:08 +0000 |
|---|---|---|
| committer | Quentin Colombet <qcolombet@apple.com> | 2013-10-22 21:29:08 +0000 |
| commit | f34568b0af4b1479727fd42101fb69b783ce4fe9 (patch) | |
| tree | 0907320290a1b8cded3f1532ceaefe9c84bfc38b /llvm | |
| parent | 65864e31824d0c9c4609eff1aba1b9f667a8e86d (diff) | |
| download | bcm5719-llvm-f34568b0af4b1479727fd42101fb69b783ce4fe9.tar.gz bcm5719-llvm-f34568b0af4b1479727fd42101fb69b783ce4fe9.zip | |
[X86][FastISel] Add a comment to help understanding changes made in r192636.
<rdar://problem/15192473>
llvm-svn: 193199
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/X86/X86FastISel.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp index 6bbc9840906..7984e76edd6 100644 --- a/llvm/lib/Target/X86/X86FastISel.cpp +++ b/llvm/lib/Target/X86/X86FastISel.cpp @@ -633,6 +633,29 @@ bool X86FastISel::X86SelectCallAddress(const Value *V, X86AddressMode &AM) { const User *U = NULL; unsigned Opcode = Instruction::UserOp1; const Instruction *I = dyn_cast<Instruction>(V); + // Record if the value is defined in the same basic block. + // + // This information is crucial to know whether or not folding an + // operand is valid. + // Indeed, FastISel generates or reuses a virtual register for all + // operands of all instructions it selects. Obviously, the definition and + // its uses must use the same virtual register otherwise the produced + // code is incorrect. + // Before instruction selection, FunctionLoweringInfo::set sets the virtual + // registers for values that are alive across basic blocks. This ensures + // that the values are consistently set between across basic block, even + // if different instruction selection mechanisms are used (e.g., a mix of + // SDISel and FastISel). + // For values local to a basic block, the instruction selection process + // generates these virtual registers with whatever method is appropriate + // for its needs. In particular, FastISel and SDISel do not share the way + // local virtual registers are set. + // Therefore, this is impossible (or at least unsafe) to share values + // between basic blocks unless they use the same instruction selection + // method, which is not guarantee for X86. + // Moreover, things like hasOneUse could not be used accurately, if we + // allow to reference values across basic blocks whereas they are not + // alive across basic blocks initially. bool InMBB = true; if (I) { Opcode = I->getOpcode(); |

