@@ -902,6 +902,8 @@ void CompileUnit::addScratchLocation(DIEBlock* Block, DbgDecoder::VarInfo* varIn
902
902
{
903
903
uint32_t offset = varInfo->lrs .front ().getSpillOffset ().memoryOffset + vectorOffset;
904
904
905
+ IGC_ASSERT_MESSAGE (IGC_IS_FLAG_ENABLED (EnableSIMDLaneDebugging), " SIMD lane expressions support only" );
906
+
905
907
if (IGC_IS_FLAG_ENABLED (EnableGTLocationDebugging))
906
908
{
907
909
// For spills to the scratch area at offset available as literal
@@ -911,7 +913,7 @@ void CompileUnit::addScratchLocation(DIEBlock* Block, DbgDecoder::VarInfo* varIn
911
913
addUInt (Block, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
912
914
addUInt (Block, dwarf::DW_FORM_udata, scratchBaseAddr); // Base address of surface or sampler
913
915
addSInt (Block, dwarf::DW_FORM_sdata, offset); // Offset to base address
914
- addUInt (Block, dwarf::DW_FORM_data1, dwarf:: DW_OP_deref);
916
+ // DW_OP_deref moved to the end of SIMD lane snippet
915
917
}
916
918
else
917
919
{
@@ -920,7 +922,7 @@ void CompileUnit::addScratchLocation(DIEBlock* Block, DbgDecoder::VarInfo* varIn
920
922
921
923
addUInt (Block, dwarf::DW_FORM_data1, dwarf::DW_OP_const8u);
922
924
addUInt (Block, dwarf::DW_FORM_data8, addr.GetAddress ());
923
- addUInt (Block, dwarf::DW_FORM_data1, dwarf:: DW_OP_deref);
925
+ // DW_OP_deref moved to the end of SIMD lane snippet
924
926
}
925
927
}
926
928
@@ -940,6 +942,30 @@ void CompileUnit::addSLMLocation(DIEBlock* Block, VISAVariableLocation* Loc)
940
942
941
943
// addSimdLane - add a sequence of attributes to calculate location of vectorized variable
942
944
// among SIMD lanes, e.g. a GRF subregister.
945
+ //
946
+ // Example of expression generated for 32-bit variables located in GRF:
947
+ // (note: DW_OP_regx N is generated earlier, i.e. prior to addSimdLane())
948
+ // DW_OP_INTEL_push_simd_lane
949
+ // DW_OP_lit5
950
+ // DW_OP_shl
951
+ // DW_OP_const1u 32
952
+ // DW_OP_INTEL_bit_piece_stack
953
+ //
954
+ // Example of expression generated for 64-bit variable, which is located in memory:
955
+ // (note: DW_OP_bregx N is generated earlier)
956
+ // DW_OP_INTEL_push_simd_lane
957
+ // DW_OP_lit6
958
+ // DW_OP_shl
959
+ // DW_OP_plus
960
+ // (note: no deref is emitted for bregx)
961
+
962
+ // Example of expression generated for (64-bit) ptr to a variable, which is located in scratch:
963
+ // (note: DW_OP_const8u address is generated earlier)
964
+ // DW_OP_INTEL_push_simd_lane
965
+ // DW_OP_lit6
966
+ // DW_OP_shl
967
+ // DW_OP_plus
968
+ // DW_OP_deref
943
969
void CompileUnit::addSimdLane (DIEBlock* Block, DbgVariable& DV, VISAVariableLocation *Loc, bool isPacked)
944
970
{
945
971
if (IGC_IS_FLAG_ENABLED (EnableSIMDLaneDebugging) && Loc->IsVectorized ())
@@ -1024,7 +1050,12 @@ void CompileUnit::addSimdLane(DIEBlock* Block, DbgVariable& DV, VISAVariableLoca
1024
1050
else
1025
1051
{
1026
1052
addUInt (Block, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1027
- addUInt (Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1053
+
1054
+ // Emit deref for const8u address not for bregx
1055
+ if (!isa<llvm::DbgDeclareInst>(DV.getDbgInst ()))
1056
+ {
1057
+ addUInt (Block, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1058
+ }
1028
1059
}
1029
1060
}
1030
1061
}
@@ -2040,9 +2071,7 @@ void CompileUnit::buildSLM(DbgVariable& var, DIE* die, VISAVariableLocation* loc
2040
2071
2041
2072
Address addr;
2042
2073
addr.Set (Address::Space::eLocal, 0 , offset);
2043
-
2044
2074
addUInt (Block, dwarf::DW_FORM_data1, dwarf::DW_OP_const8u);
2045
-
2046
2075
addUInt (Block, dwarf::DW_FORM_data8, addr.GetAddress ());
2047
2076
}
2048
2077
else
0 commit comments