diff options
author | Karl Schimpf <kschimpf@google.com> | 2013-08-02 09:46:26 -0700 |
---|---|---|
committer | Karl Schimpf <kschimpf@google.com> | 2013-08-02 09:46:26 -0700 |
commit | 7578d662dba568ead351604240cfd476993a67a4 (patch) | |
tree | 6c530fb7c4c4eca3545cf927c76fef4571881607 /lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp | |
parent | a7665e96f34c4a981d59c78b0b872b8f0b100cb9 (diff) |
Remove the bitcast (of global values) from load instructions.
Adds the eliding of bitcasts that are used as an argument to
instructions that expect normalized pointers. Currently, the checked
in code only checks normalized pointers for load instructions. Hence,
the restriction to load instructions. As more instructions are
modified to check for normalized pointers, this code will apply
to those instructions.
BUG= https://code.google.com/p/nativeclient/issues/detail?id=3544
R=mseaborn@chromium.org
Review URL: https://codereview.chromium.org/21614002
Diffstat (limited to 'lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp')
-rw-r--r-- | lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp index 40f8842b3b..ede06b2457 100644 --- a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp +++ b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp @@ -1315,28 +1315,28 @@ bool NaClBitcodeReader::InstallInstruction( } Value *NaClBitcodeReader::ConvertOpToType(Value *Op, Type *T, BasicBlock *BB) { - // Note: Currently only knows how to add inttoptr type conversion, since - // this is the only elided instruction in the bitcode writer. + // Note: Currently only knows how to add inttoptr and bitcast type + // conversions for non-phi nodes, since these are the only elided + // instructions in the bitcode writer. + // // TODO(kschimpf): Generalize this as we expand elided conversions. - Value *Conversion = 0; + Instruction *Conversion = 0; Type *OpTy = Op->getType(); if (OpTy == T) return Op; - // Following while loop is only run once. It is used to break on - // erroneous conditions. - while (true) { - if (!OpTy->isIntegerTy()) break; - if (!T->isPointerTy()) break; - Instruction *I = CastInst::Create(Instruction::IntToPtr, Op, T); - if (InstallInstruction(BB, I)) break; - Conversion = I; - break; + if (OpTy->isPointerTy()) { + Conversion = new BitCastInst(Op, T); + } else if (OpTy->isIntegerTy()) { + Conversion = new IntToPtrInst(Op, T); } + if (Conversion == 0) { std::string Message; raw_string_ostream StrM(Message); StrM << "Can't convert " << *Op << " to type " << *T << "\n"; Error(StrM.str()); + } else { + InstallInstruction(BB, Conversion); } return Conversion; } |