mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
Fix a miscompilation of:
long long foo(long long X) { return (long long)(signed char)(int)X; } Instead of: _foo: extsb r2, r4 srawi r3, r4, 31 mr r4, r2 blr we now produce: _foo: extsb r4, r4 srawi r3, r4, 31 blr This fixes a miscompilation in ConstantFolding.cpp. llvm-svn: 30768
This commit is contained in:
parent
d870b158b3
commit
0d39b3a4cf
@ -4349,12 +4349,14 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){
|
||||
|
||||
case ISD::SIGN_EXTEND_INREG:
|
||||
ExpandOp(Node->getOperand(0), Lo, Hi);
|
||||
// Sign extend the lo-part.
|
||||
// sext_inreg the low part if needed.
|
||||
Lo = DAG.getNode(ISD::SIGN_EXTEND_INREG, NVT, Lo, Node->getOperand(1));
|
||||
|
||||
// The high part gets the sign extension from the lo-part. This handles
|
||||
// things like sextinreg V:i64 from i8.
|
||||
Hi = DAG.getNode(ISD::SRA, NVT, Lo,
|
||||
DAG.getConstant(MVT::getSizeInBits(NVT)-1,
|
||||
TLI.getShiftAmountTy()));
|
||||
// sext_inreg the low part if needed.
|
||||
Lo = DAG.getNode(ISD::SIGN_EXTEND_INREG, NVT, Lo, Node->getOperand(1));
|
||||
break;
|
||||
|
||||
case ISD::BSWAP: {
|
||||
|
Loading…
Reference in New Issue
Block a user