Skip to content

Commit 291ebaf

Browse files
jfuentessys_zuul
authored andcommitted
Perform regular cast when pointer is immediate and null
Change-Id: I00e96a1a4b84d389aadd2ce61615dcbd923d723e
1 parent ffb1503 commit 291ebaf

File tree

1 file changed

+68
-65
lines changed

1 file changed

+68
-65
lines changed

IGC/Compiler/CISACodeGen/EmitVISAPass.cpp

Lines changed: 68 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -8342,6 +8342,14 @@ void EmitPass::emitAddrSpaceCast(llvm::AddrSpaceCastInst* addrSpaceCast)
83428342
unsigned sourceAddrSpace = addrSpaceCast->getSrcAddressSpace();
83438343
unsigned destAddrSpace = addrSpaceCast->getDestAddressSpace();
83448344

8345+
if (srcV->IsImmediate() && srcV->GetImmediateValue() == 0x0)
8346+
{
8347+
// If casting from null, don't do tagging
8348+
m_encoder->Cast(m_destination, srcV);
8349+
m_encoder->Push();
8350+
return;
8351+
}
8352+
83458353
if (destAddrSpace == ADDRESS_SPACE_GENERIC)
83468354
{
83478355
// Address space cast is in the form of {private, local, global} -> generic
@@ -8385,7 +8393,6 @@ void EmitPass::emitAddrSpaceCast(llvm::AddrSpaceCastInst* addrSpaceCast)
83858393
m_encoder->Copy(srcHigh, srcAlias);
83868394
m_encoder->Push();
83878395

8388-
83898396
// Add tag to high part
83908397
m_encoder->Or(srcHigh, srcHigh, m_currShader->ImmToVariable(0x20000000, ISA_TYPE_UD));
83918398
m_encoder->Push();
@@ -8452,7 +8459,6 @@ void EmitPass::emitAddrSpaceCast(llvm::AddrSpaceCastInst* addrSpaceCast)
84528459
m_encoder->Copy(srcHigh, srcAlias);
84538460
m_encoder->Push();
84548461

8455-
84568462
// Add tag to high part
84578463
m_encoder->Or(srcHigh, srcHigh, m_currShader->ImmToVariable(0x40000000, ISA_TYPE_UD));
84588464
m_encoder->Push();
@@ -8486,87 +8492,84 @@ void EmitPass::emitAddrSpaceCast(llvm::AddrSpaceCastInst* addrSpaceCast)
84868492
m_encoder->Push();
84878493
}
84888494
}
8489-
else // clear up the tag
8495+
else if (sourceAddrSpace == ADDRESS_SPACE_GENERIC &&
8496+
(destAddrSpace == ADDRESS_SPACE_PRIVATE || destAddrSpace == ADDRESS_SPACE_LOCAL))
84908497
{
84918498
// Address space cast is in the form of generic -> {private, local, global}
84928499
// Tag is removed according to the address space of the destination
84938500

8494-
if (destAddrSpace == ADDRESS_SPACE_PRIVATE || destAddrSpace == ADDRESS_SPACE_LOCAL)
8501+
if (m_pCtx->m_hasEmu64BitInsts && m_currShader->m_Platform->hasNo64BitInst())
84958502
{
8496-
if (m_pCtx->m_hasEmu64BitInsts && m_currShader->m_Platform->hasNo64BitInst())
8503+
if (m_currShader->GetContext()->getRegisterPointerSizeInBits(destAddrSpace) == 32)
84978504
{
8498-
if (m_currShader->GetContext()->getRegisterPointerSizeInBits(destAddrSpace) == 32)
8499-
{
8500-
// Src
8501-
CVariable* srcAlias = m_currShader->GetNewAlias(srcV, ISA_TYPE_UD, 0, 0);
8502-
CVariable* srcLow = m_currShader->GetNewVariable(numLanes(m_currShader->m_SIMDSize),
8503-
ISA_TYPE_UD, EALIGN_GRF, m_destination->IsUniform());
8504-
8505-
// Get low part of srcV
8506-
m_encoder->SetSrcSubReg(0, 0);
8507-
m_encoder->SetSrcRegion(0, 2, 1, 0);
8508-
m_encoder->Copy(srcLow, srcAlias);
8509-
m_encoder->Push();
8510-
8511-
// Copy result to Dst
8512-
m_encoder->Cast(m_destination, srcLow);
8513-
m_encoder->Push();
8514-
8515-
}
8516-
else
8517-
{
8518-
// Src
8519-
CVariable* srcAlias = m_currShader->GetNewAlias(srcV, ISA_TYPE_UD, 0, 0);
8520-
CVariable* srcLow = m_currShader->GetNewVariable(numLanes(m_currShader->m_SIMDSize),
8521-
ISA_TYPE_UD, EALIGN_GRF, m_destination->IsUniform());
8522-
CVariable* srcHigh = m_currShader->GetNewVariable(numLanes(m_currShader->m_SIMDSize),
8523-
ISA_TYPE_UD, EALIGN_GRF, m_destination->IsUniform());
8524-
8525-
// Split Src into {Low, High}
8526-
// Low:
8527-
m_encoder->SetSrcSubReg(0, 0);
8528-
m_encoder->SetSrcRegion(0, 2, 1, 0);
8529-
m_encoder->Copy(srcLow, srcAlias);
8530-
m_encoder->Push();
8531-
// High:
8532-
m_encoder->SetSrcSubReg(0, 1);
8533-
m_encoder->SetSrcRegion(0, 2, 1, 0);
8534-
m_encoder->Copy(srcHigh, srcAlias);
8535-
m_encoder->Push();
8505+
// Src
8506+
CVariable* srcAlias = m_currShader->GetNewAlias(srcV, ISA_TYPE_UD, 0, 0);
8507+
CVariable* srcLow = m_currShader->GetNewVariable(numLanes(m_currShader->m_SIMDSize),
8508+
ISA_TYPE_UD, EALIGN_GRF, m_destination->IsUniform());
85368509

8537-
// Add tag to high part
8538-
m_encoder->And(srcHigh, srcHigh, m_currShader->ImmToVariable(0xFFFFFFF, ISA_TYPE_UD));
8539-
m_encoder->Push();
8510+
// Get low part of srcV
8511+
m_encoder->SetSrcSubReg(0, 0);
8512+
m_encoder->SetSrcRegion(0, 2, 1, 0);
8513+
m_encoder->Copy(srcLow, srcAlias);
8514+
m_encoder->Push();
85408515

8541-
// Copy to Dst
8542-
CVariable* dstAlias = m_currShader->BitCast(m_destination, ISA_TYPE_UD);
8543-
// Low:
8544-
m_encoder->SetDstRegion(2);
8545-
m_encoder->Copy(dstAlias, srcLow);
8546-
m_encoder->Push();
8547-
// High:
8548-
m_encoder->SetDstSubReg(1);
8549-
m_encoder->SetDstRegion(2);
8550-
m_encoder->Copy(dstAlias, srcHigh);
8551-
m_encoder->Push();
8552-
}
8516+
// Copy result to Dst
8517+
m_encoder->Cast(m_destination, srcLow);
8518+
m_encoder->Push();
85538519
}
85548520
else
85558521
{
8556-
CVariable* pTempVar = m_currShader->GetNewVariable(
8557-
numLanes(m_currShader->m_SIMDSize),
8558-
ISA_TYPE_UQ, m_currShader->getGRFAlignment(), m_destination->IsUniform());
8559-
m_encoder->And(pTempVar, srcV, m_currShader->ImmToVariable(0xFFFFFFFFFFFFFFF, ISA_TYPE_UQ));
8560-
m_encoder->Cast(m_destination, pTempVar);
8522+
// Src
8523+
CVariable* srcAlias = m_currShader->GetNewAlias(srcV, ISA_TYPE_UD, 0, 0);
8524+
CVariable* srcLow = m_currShader->GetNewVariable(numLanes(m_currShader->m_SIMDSize),
8525+
ISA_TYPE_UD, EALIGN_GRF, m_destination->IsUniform());
8526+
CVariable* srcHigh = m_currShader->GetNewVariable(numLanes(m_currShader->m_SIMDSize),
8527+
ISA_TYPE_UD, EALIGN_GRF, m_destination->IsUniform());
8528+
8529+
// Split Src into {Low, High}
8530+
// Low:
8531+
m_encoder->SetSrcSubReg(0, 0);
8532+
m_encoder->SetSrcRegion(0, 2, 1, 0);
8533+
m_encoder->Copy(srcLow, srcAlias);
8534+
m_encoder->Push();
8535+
// High:
8536+
m_encoder->SetSrcSubReg(0, 1);
8537+
m_encoder->SetSrcRegion(0, 2, 1, 0);
8538+
m_encoder->Copy(srcHigh, srcAlias);
8539+
m_encoder->Push();
8540+
8541+
// Add tag to high part
8542+
m_encoder->And(srcHigh, srcHigh, m_currShader->ImmToVariable(0xFFFFFFF, ISA_TYPE_UD));
8543+
m_encoder->Push();
8544+
8545+
// Copy to Dst
8546+
CVariable* dstAlias = m_currShader->BitCast(m_destination, ISA_TYPE_UD);
8547+
// Low:
8548+
m_encoder->SetDstRegion(2);
8549+
m_encoder->Copy(dstAlias, srcLow);
8550+
m_encoder->Push();
8551+
// High:
8552+
m_encoder->SetDstSubReg(1);
8553+
m_encoder->SetDstRegion(2);
8554+
m_encoder->Copy(dstAlias, srcHigh);
85618555
m_encoder->Push();
85628556
}
85638557
}
8564-
else // ADDRESS_SPACE_GLOBAL
8558+
else
85658559
{
8566-
m_encoder->Cast(m_destination, srcV);
8560+
CVariable* pTempVar = m_currShader->GetNewVariable(
8561+
numLanes(m_currShader->m_SIMDSize),
8562+
ISA_TYPE_UQ, m_currShader->getGRFAlignment(), m_destination->IsUniform());
8563+
m_encoder->And(pTempVar, srcV, m_currShader->ImmToVariable(0xFFFFFFFFFFFFFFF, ISA_TYPE_UQ));
8564+
m_encoder->Cast(m_destination, pTempVar);
85678565
m_encoder->Push();
85688566
}
85698567
}
8568+
else // ADDRESS_SPACE_GLOBAL
8569+
{
8570+
m_encoder->Cast(m_destination, srcV);
8571+
m_encoder->Push();
8572+
}
85708573
}
85718574

85728575
void EmitPass::emitExtract(llvm::Instruction* inst)

0 commit comments

Comments
 (0)