diff options
author | Eric Christopher <echristo@gmail.com> | 2015-07-25 00:48:08 +0000 |
---|---|---|
committer | Eric Christopher <echristo@gmail.com> | 2015-07-25 00:48:08 +0000 |
commit | f0024d14f10564532eec392a7c468ad79143f6b0 (patch) | |
tree | d95d894a5f14f88e5d860cc86849c98852f2ea00 /llvm/lib/Target/PowerPC/PPCFastISel.cpp | |
parent | 03df7ac8a9788b2fdd6e30184adb689dafab8bdd (diff) | |
download | bcm5719-llvm-f0024d14f10564532eec392a7c468ad79143f6b0.tar.gz bcm5719-llvm-f0024d14f10564532eec392a7c468ad79143f6b0.zip |
Fix PPCMaterializeInt to check the size of the integer based on the
extension property we're requesting - zero or sign extended.
This fixes cases where we want to return a zero extended 32-bit -1
and not be sign extended for the entire register. Also updated the
already out of date comment with the current behavior.
llvm-svn: 243192
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCFastISel.cpp')
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCFastISel.cpp | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCFastISel.cpp b/llvm/lib/Target/PowerPC/PPCFastISel.cpp index 7c184f4bdd0..700df20f8aa 100644 --- a/llvm/lib/Target/PowerPC/PPCFastISel.cpp +++ b/llvm/lib/Target/PowerPC/PPCFastISel.cpp @@ -1608,17 +1608,16 @@ bool PPCFastISel::SelectRet(const Instruction *I) { if (ValLocs.size() > 1) return false; - // Special case for returning a constant integer of any size. - // Materialize the constant as an i64 and copy it to the return - // register. We still need to worry about properly extending the sign. E.g: - // If the constant has only one bit, it means it is a boolean. Therefore - // we can't use PPCMaterializeInt because it extends the sign which will - // cause negations of the returned value to be incorrect as they are - // implemented as the flip of the least significant bit. + // Special case for returning a constant integer of any size - materialize + // the constant as an i64 and copy it to the return register. if (const ConstantInt *CI = dyn_cast<ConstantInt>(RV)) { CCValAssign &VA = ValLocs[0]; unsigned RetReg = VA.getLocReg(); + // We still need to worry about properly extending the sign. For example, + // we could have only a single bit or a constant that needs zero + // extension rather than sign extension. Make sure we pass the return + // value extension property to integer materialization. unsigned SrcReg = PPCMaterializeInt(CI, MVT::i64, VA.getLocInfo() == CCValAssign::SExt); @@ -2103,11 +2102,17 @@ unsigned PPCFastISel::PPCMaterializeInt(const ConstantInt *CI, MVT VT, &PPC::GPRCRegClass); // If the constant is in range, use a load-immediate. - if (isInt<16>(CI->getSExtValue())) { + if (UseSExt && isInt<16>(CI->getSExtValue())) { unsigned Opc = (VT == MVT::i64) ? PPC::LI8 : PPC::LI; unsigned ImmReg = createResultReg(RC); BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(Opc), ImmReg) - .addImm( (UseSExt) ? CI->getSExtValue() : CI->getZExtValue() ); + .addImm(CI->getSExtValue()); + return ImmReg; + } else if (!UseSExt && isUInt<16>(CI->getZExtValue())) { + unsigned Opc = (VT == MVT::i64) ? PPC::LI8 : PPC::LI; + unsigned ImmReg = createResultReg(RC); + BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(Opc), ImmReg) + .addImm(CI->getZExtValue()); return ImmReg; } |