mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-22 10:24:26 +00:00
[DAGCombiner] DAG combine does not know how to combine indexed loads with
sign/zero/any extensions. However a few places were not checking properly the property of the load and were turning an indexed load into a regular extended load. Therefore the indexed value was lost during the process and this was triggering an assertion. <rdar://problem/16389332> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205923 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -4957,6 +4957,7 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {
|
||||
// on vectors in one instruction. We only perform this transformation on
|
||||
// scalars.
|
||||
if (ISD::isNON_EXTLoad(N0.getNode()) && !VT.isVector() &&
|
||||
ISD::isUNINDEXEDLoad(N0.getNode()) &&
|
||||
((!LegalOperations && !cast<LoadSDNode>(N0)->isVolatile()) ||
|
||||
TLI.isLoadExtLegal(ISD::SEXTLOAD, N0.getValueType()))) {
|
||||
bool DoXform = true;
|
||||
@ -5009,7 +5010,7 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {
|
||||
TLI.isLoadExtLegal(ISD::SEXTLOAD, N0.getValueType()) &&
|
||||
(!LegalOperations && TLI.isOperationLegal(N0.getOpcode(), VT))) {
|
||||
LoadSDNode *LN0 = cast<LoadSDNode>(N0.getOperand(0));
|
||||
if (LN0->getExtensionType() != ISD::ZEXTLOAD) {
|
||||
if (LN0->getExtensionType() != ISD::ZEXTLOAD && LN0->isUnindexed()) {
|
||||
bool DoXform = true;
|
||||
SmallVector<SDNode*, 4> SetCCs;
|
||||
if (!N0.hasOneUse())
|
||||
@ -5250,6 +5251,7 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {
|
||||
// on vectors in one instruction. We only perform this transformation on
|
||||
// scalars.
|
||||
if (ISD::isNON_EXTLoad(N0.getNode()) && !VT.isVector() &&
|
||||
ISD::isUNINDEXEDLoad(N0.getNode()) &&
|
||||
((!LegalOperations && !cast<LoadSDNode>(N0)->isVolatile()) ||
|
||||
TLI.isLoadExtLegal(ISD::ZEXTLOAD, N0.getValueType()))) {
|
||||
bool DoXform = true;
|
||||
@ -5282,7 +5284,7 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {
|
||||
TLI.isLoadExtLegal(ISD::ZEXTLOAD, N0.getValueType()) &&
|
||||
(!LegalOperations && TLI.isOperationLegal(N0.getOpcode(), VT))) {
|
||||
LoadSDNode *LN0 = cast<LoadSDNode>(N0.getOperand(0));
|
||||
if (LN0->getExtensionType() != ISD::SEXTLOAD) {
|
||||
if (LN0->getExtensionType() != ISD::SEXTLOAD && LN0->isUnindexed()) {
|
||||
bool DoXform = true;
|
||||
SmallVector<SDNode*, 4> SetCCs;
|
||||
if (!N0.hasOneUse())
|
||||
@ -5478,6 +5480,7 @@ SDValue DAGCombiner::visitANY_EXTEND(SDNode *N) {
|
||||
// on vectors in one instruction. We only perform this transformation on
|
||||
// scalars.
|
||||
if (ISD::isNON_EXTLoad(N0.getNode()) && !VT.isVector() &&
|
||||
ISD::isUNINDEXEDLoad(N0.getNode()) &&
|
||||
((!LegalOperations && !cast<LoadSDNode>(N0)->isVolatile()) ||
|
||||
TLI.isLoadExtLegal(ISD::EXTLOAD, N0.getValueType()))) {
|
||||
bool DoXform = true;
|
||||
|
Reference in New Issue
Block a user