summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorQuentin Colombet <qcolombet@apple.com>2013-10-22 21:29:08 +0000
committerQuentin Colombet <qcolombet@apple.com>2013-10-22 21:29:08 +0000
commitf34568b0af4b1479727fd42101fb69b783ce4fe9 (patch)
tree0907320290a1b8cded3f1532ceaefe9c84bfc38b /llvm
parent65864e31824d0c9c4609eff1aba1b9f667a8e86d (diff)
downloadbcm5719-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.cpp23
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();
OpenPOWER on IntegriCloud