Skip to content

Commit a3b0300

Browse files
committed
Use constant offset where possible
1 parent 09d80fa commit a3b0300

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

src/coreclr/jit/lowerarmarch.cpp

+17-7
Original file line numberDiff line numberDiff line change
@@ -1260,15 +1260,16 @@ GenTree* Lowering::LowerHWIntrinsic(GenTreeHWIntrinsic* node)
12601260
GenTree* op1 = node->Op(1);
12611261
GenTree* op2 = node->Op(2);
12621262

1263-
unsigned simdSize = node->GetSimdSize();
1264-
var_types simdBaseType = node->GetSimdBaseType();
1265-
var_types simdType = Compiler::getSIMDTypeForSize(simdSize);
1266-
unsigned scale = genTypeSize(simdBaseType);
1267-
12681263
bool isContainableMemory = IsContainableMemoryOp(op1) && IsSafeToContainMem(node, op1);
12691264

12701265
if (isContainableMemory || !op2->OperIsConst())
12711266
{
1267+
unsigned simdSize = node->GetSimdSize();
1268+
var_types simdBaseType = node->GetSimdBaseType();
1269+
var_types simdType = Compiler::getSIMDTypeForSize(simdSize);
1270+
unsigned scale = genTypeSize(simdBaseType);
1271+
ssize_t offset = 0;
1272+
12721273
// We're either already loading from memory or we need to since
12731274
// we don't know what actual index is going to be retrieved.
12741275

@@ -1295,15 +1296,24 @@ GenTree* Lowering::LowerHWIntrinsic(GenTreeHWIntrinsic* node)
12951296
if (lclNum != BAD_VAR_NUM)
12961297
{
12971298
// We need to get the address of the local
1298-
op1 = comp->gtNewLclVarAddrNode(lclNum, simdBaseType);
1299+
op1 = comp->gtNewLclVarAddrNode(lclNum, TYP_BYREF);
12991300
BlockRange().InsertBefore(node, op1);
13001301
LowerNode(op1);
13011302
}
13021303

13031304
// Now that we have a memory op, we need to offset it by op2 * scale
13041305
assert(op1->isMemoryOp());
13051306

1306-
GenTree* addr = new (comp, GT_LEA) GenTreeAddrMode(simdBaseType, op1, op2, scale, 0);
1307+
if (op2->OperIsConst())
1308+
{
1309+
offset = op2->AsIntCon()->IconValue() * scale;
1310+
scale = 0;
1311+
1312+
BlockRange().Remove(op2);
1313+
op2 = nullptr;
1314+
}
1315+
1316+
GenTree* addr = new (comp, GT_LEA) GenTreeAddrMode(op1->TypeGet(), op1, op2, scale, offset);
13071317
BlockRange().InsertBefore(node, addr);
13081318
LowerNode(addr);
13091319

0 commit comments

Comments
 (0)