summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyInstrMemory.td10
1 files changed, 4 insertions, 6 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrMemory.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrMemory.td
index 521c664ca4a..5bd09bd5795 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrMemory.td
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrMemory.td
@@ -41,15 +41,13 @@ def or_is_add : PatFrag<(ops node:$lhs, node:$rhs), (or node:$lhs, node:$rhs),[{
}]>;
// GlobalAddresses are conceptually unsigned values, so we can also fold them
-// into immediate values as long as their offsets are non-negative.
+// into immediate values as long as the add is 'nuw'.
+// TODO: We'd like to also match GA offsets but there are cases where the
+// register can have a negative value. Find out what more we can do.
def regPlusGA : PatFrag<(ops node:$addr, node:$off),
(add node:$addr, node:$off),
[{
- return N->getFlags()->hasNoUnsignedWrap() ||
- (N->getOperand(1)->getOpcode() == WebAssemblyISD::Wrapper &&
- isa<GlobalAddressSDNode>(N->getOperand(1)->getOperand(0)) &&
- cast<GlobalAddressSDNode>(N->getOperand(1)->getOperand(0))
- ->getOffset() >= 0);
+ return N->getFlags()->hasNoUnsignedWrap();
}]>;
// We don't need a regPlusES because external symbols never have constant
OpenPOWER on IntegriCloud