summaryrefslogtreecommitdiff
path: root/src/jit/importer.cpp
diff options
context:
space:
mode:
authorSergey Andreenko <seandree@microsoft.com>2019-04-19 15:49:39 -0700
committerSergey Andreenko <seandree@microsoft.com>2019-04-19 18:05:04 -0700
commitb8916d5c8be8bd9701fa36b875f10721bde8ce16 (patch)
tree86b1d2c62d1531b29b88e981da2f6232ad2dc29b /src/jit/importer.cpp
parent533564b6f241ee733b30e71ab4f5fbb758c30aad (diff)
downloadcoreclr-b8916d5c8be8bd9701fa36b875f10721bde8ce16.tar.gz
coreclr-b8916d5c8be8bd9701fa36b875f10721bde8ce16.tar.bz2
coreclr-b8916d5c8be8bd9701fa36b875f10721bde8ce16.zip
Fix `impGetStructAddr`.
Diffstat (limited to 'src/jit/importer.cpp')
-rw-r--r--src/jit/importer.cpp46
1 files changed, 35 insertions, 11 deletions
diff --git a/src/jit/importer.cpp b/src/jit/importer.cpp
index db6b6df571..ba7eaa357d 100644
--- a/src/jit/importer.cpp
+++ b/src/jit/importer.cpp
@@ -687,18 +687,30 @@ GenTreeStmt* Compiler::impExtractLastStmt()
return stmt;
}
-/*****************************************************************************
- *
- * Insert the given GT_STMT "stmt" before GT_STMT "stmtBefore"
- */
-
+//-------------------------------------------------------------------------
+// impInsertStmtBefore: Insert the given GT_STMT "stmt" before GT_STMT "stmtBefore".
+//
+// Arguments:
+// stmt - a statement to insert;
+// stmtBefore - an insertion point to insert "stmt" before.
+//
inline void Compiler::impInsertStmtBefore(GenTreeStmt* stmt, GenTreeStmt* stmtBefore)
{
- GenTreeStmt* stmtPrev = stmtBefore->getPrevStmt();
- stmt->gtPrev = stmtPrev;
- stmt->gtNext = stmtBefore;
- stmtPrev->gtNext = stmt;
- stmtBefore->gtPrev = stmt;
+ assert(stmt != nullptr);
+ assert(stmtBefore != nullptr);
+
+ if (stmtBefore == impStmtList)
+ {
+ impStmtList = stmt;
+ }
+ else
+ {
+ GenTreeStmt* stmtPrev = stmtBefore->getPrevStmt();
+ stmt->gtPrev = stmtPrev;
+ stmtPrev->gtNext = stmt;
+ }
+ stmt->gtNext = stmtBefore;
+ stmtBefore->gtPrev = stmt;
}
/*****************************************************************************
@@ -1476,7 +1488,19 @@ GenTree* Compiler::impGetStructAddr(GenTree* structVal,
// for Op2, but that would be out of order with op1, so we need to
// spill op1 onto the statement list after whatever was last
// before we recursed on Op2 (i.e. before whatever Op2 appended).
- impInsertTreeBefore(structVal->gtOp.gtOp1, impCurStmtOffs, oldLastStmt->getNextStmt());
+ GenTreeStmt* beforeStmt;
+ if (oldLastStmt == nullptr)
+ {
+ // The op1 stmt should be the first in the list.
+ beforeStmt = impStmtList;
+ }
+ else
+ {
+ // Insert after the oldLastStmt before the first inserted for op2.
+ beforeStmt = oldLastStmt->getNextStmt();
+ }
+
+ impInsertTreeBefore(structVal->gtOp.gtOp1, impCurStmtOffs, beforeStmt);
structVal->gtOp.gtOp1 = gtNewNothingNode();
}