forked from OSchip/llvm-project
Tighten iaddroff ComplexPattern.
The iaddroff ComplexPattern is supposed to recognize displacement expressions that have been processed by a SelectAddressRegImm, which means it needs to accept TargetConstant and TargetGlobalAddress nodes. Currently, it erroneously also accepts some other nodes, in particular Constant and PPCISD::Lo. While this problem is currently latent, it would cause wrong-code bugs with a follow-on patch I'm about to commit, so this patch tightens the ComplexPattern. The equivalent change is made in PPCDAGToDAGISel::Select, where pre-inc load patterns are handled (as opposed to store patterns, the loads are handled in C++ code without making use of the .td ComplexPattern). llvm-svn: 177732
This commit is contained in:
parent
e448badbb1
commit
d1b99d350c
|
@ -120,10 +120,10 @@ namespace {
|
|||
}
|
||||
|
||||
/// SelectAddrImmOffs - Return true if the operand is valid for a preinc
|
||||
/// immediate field. Because preinc imms have already been validated, just
|
||||
/// accept it.
|
||||
/// immediate field. Note that the operand at this point is already the
|
||||
/// result of a prior SelectAddressRegImm call.
|
||||
bool SelectAddrImmOffs(SDValue N, SDValue &Out) const {
|
||||
if (isa<ConstantSDNode>(N) || N.getOpcode() == PPCISD::Lo ||
|
||||
if (N.getOpcode() == ISD::TargetConstant ||
|
||||
N.getOpcode() == ISD::TargetGlobalAddress) {
|
||||
Out = N;
|
||||
return true;
|
||||
|
@ -1044,7 +1044,7 @@ SDNode *PPCDAGToDAGISel::Select(SDNode *N) {
|
|||
break;
|
||||
|
||||
SDValue Offset = LD->getOffset();
|
||||
if (isa<ConstantSDNode>(Offset) ||
|
||||
if (Offset.getOpcode() == ISD::TargetConstant ||
|
||||
Offset.getOpcode() == ISD::TargetGlobalAddress) {
|
||||
|
||||
unsigned Opcode;
|
||||
|
|
Loading…
Reference in New Issue