aboutsummaryrefslogtreecommitdiff
path: root/lib/Target
diff options
context:
space:
mode:
authorDerek Schuff <dschuff@chromium.org>2013-02-15 16:12:59 -0800
committerDerek Schuff <dschuff@chromium.org>2013-02-15 16:12:59 -0800
commit50c20006ea707be7e439c3093d4a064ccfe78b7a (patch)
treeb482850ca0a94a809d7396b4206b7e7a242993e7 /lib/Target
parentde82c04bfc33b44fc650cf7f330dbf26992faf8b (diff)
Don't fold negative constants into addresss displacements for memory references
This results in trying to reference a negative offset from r15. R=sehr@chromium.org,jvoung@chromium.org,eliben@chromium.org BUG= https://code.google.com/p/nativeclient/issues/detail?id=3302 Review URL: https://codereview.chromium.org/12277018
Diffstat (limited to 'lib/Target')
-rw-r--r--lib/Target/X86/X86ISelDAGToDAG.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/Target/X86/X86ISelDAGToDAG.cpp b/lib/Target/X86/X86ISelDAGToDAG.cpp
index 70cfa7d516..f4a9ca38d2 100644
--- a/lib/Target/X86/X86ISelDAGToDAG.cpp
+++ b/lib/Target/X86/X86ISelDAGToDAG.cpp
@@ -607,6 +607,14 @@ bool X86DAGToDAGISel::FoldOffsetIntoAddress(uint64_t Offset,
if (AM.BaseType == X86ISelAddressMode::FrameIndexBase &&
!isDispSafeForFrameIndex(Val))
return true;
+ // LOCALMOD-BEGIN
+ // Do not allow negative displacements to be folded into memory operations.
+ // This results in trying to dereference a negative offset from RZP
+ else if (Subtarget->isTargetNaCl64() &&
+ AM.BaseType == X86ISelAddressMode::RegBase && Val < 0 &&
+ selectingMemOp)
+ return true;
+ // LOCALMOD-END
}
AM.Disp = Val;
return false;