From 8e758d8905e3603f20ad65fd00dd1037fd87079f Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Tue, 3 Aug 2021 17:39:55 -0700 Subject: [PATCH 1/3] Do not promote variables with ATTR_oneelem_simd to preg; do not copy propagate them --- src/mapleall/maple_me/src/me_ssa_lpre.cpp | 5 ++++- src/mapleall/maple_me/src/prop.cpp | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/mapleall/maple_me/src/me_ssa_lpre.cpp b/src/mapleall/maple_me/src/me_ssa_lpre.cpp index 9e18a6a496..6f07440ddd 100644 --- a/src/mapleall/maple_me/src/me_ssa_lpre.cpp +++ b/src/mapleall/maple_me/src/me_ssa_lpre.cpp @@ -241,7 +241,7 @@ void MeSSALPre::BuildWorkListLHSOcc(MeStmt &meStmt, int32 seqStmt) { (void)assignedFormals.insert(ost->GetIndex()); } CHECK_NULL_FATAL(meStmt.GetRHS()); - if (ost->IsVolatile()) { + if (ost->IsVolatile() || ost->GetMIRSymbol()->GetAttr(ATTR_oneelem_simd)) { return; } if (lhs->GetPrimType() == PTY_agg) { @@ -313,6 +313,9 @@ void MeSSALPre::BuildWorkListExpr(MeStmt &meStmt, int32 seqStmt, MeExpr &meExpr, break; } const MIRSymbol *sym = ost->GetMIRSymbol(); + if (sym->GetAttr(ATTR_oneelem_simd)) { + break; + } if (sym->IsInstrumented() && !(func->GetHints() & kPlacementRCed)) { // not doing because its SSA form is not complete break; diff --git a/src/mapleall/maple_me/src/prop.cpp b/src/mapleall/maple_me/src/prop.cpp index e2b154c468..59f52a4631 100644 --- a/src/mapleall/maple_me/src/prop.cpp +++ b/src/mapleall/maple_me/src/prop.cpp @@ -615,7 +615,7 @@ MeExpr *Prop::CheckTruncation(MeExpr *lhs, MeExpr *rhs) const { // return varMeExpr itself if no propagation opportunity MeExpr &Prop::PropVar(VarMeExpr &varMeExpr, bool atParm, bool checkPhi) { const MIRSymbol *st = varMeExpr.GetOst()->GetMIRSymbol(); - if (st->IsInstrumented() || varMeExpr.IsVolatile()) { + if (st->IsInstrumented() || varMeExpr.IsVolatile() || st->GetAttr(ATTR_oneelem_simd)) { return varMeExpr; } -- Gitee From d6b24527afd5161ef86b97b1855f1295b0eae69f Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Tue, 3 Aug 2021 17:39:55 -0700 Subject: [PATCH 2/3] Do not promote variables with ATTR_oneelem_simd to preg; do not copy propagate them --- src/mapleall/maple_me/src/me_ssa_lpre.cpp | 5 ++++- src/mapleall/maple_me/src/prop.cpp | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/mapleall/maple_me/src/me_ssa_lpre.cpp b/src/mapleall/maple_me/src/me_ssa_lpre.cpp index 9e18a6a496..6f07440ddd 100644 --- a/src/mapleall/maple_me/src/me_ssa_lpre.cpp +++ b/src/mapleall/maple_me/src/me_ssa_lpre.cpp @@ -241,7 +241,7 @@ void MeSSALPre::BuildWorkListLHSOcc(MeStmt &meStmt, int32 seqStmt) { (void)assignedFormals.insert(ost->GetIndex()); } CHECK_NULL_FATAL(meStmt.GetRHS()); - if (ost->IsVolatile()) { + if (ost->IsVolatile() || ost->GetMIRSymbol()->GetAttr(ATTR_oneelem_simd)) { return; } if (lhs->GetPrimType() == PTY_agg) { @@ -313,6 +313,9 @@ void MeSSALPre::BuildWorkListExpr(MeStmt &meStmt, int32 seqStmt, MeExpr &meExpr, break; } const MIRSymbol *sym = ost->GetMIRSymbol(); + if (sym->GetAttr(ATTR_oneelem_simd)) { + break; + } if (sym->IsInstrumented() && !(func->GetHints() & kPlacementRCed)) { // not doing because its SSA form is not complete break; diff --git a/src/mapleall/maple_me/src/prop.cpp b/src/mapleall/maple_me/src/prop.cpp index e2b154c468..59f52a4631 100644 --- a/src/mapleall/maple_me/src/prop.cpp +++ b/src/mapleall/maple_me/src/prop.cpp @@ -615,7 +615,7 @@ MeExpr *Prop::CheckTruncation(MeExpr *lhs, MeExpr *rhs) const { // return varMeExpr itself if no propagation opportunity MeExpr &Prop::PropVar(VarMeExpr &varMeExpr, bool atParm, bool checkPhi) { const MIRSymbol *st = varMeExpr.GetOst()->GetMIRSymbol(); - if (st->IsInstrumented() || varMeExpr.IsVolatile()) { + if (st->IsInstrumented() || varMeExpr.IsVolatile() || st->GetAttr(ATTR_oneelem_simd)) { return varMeExpr; } -- Gitee From ca95a29cc9a490ad407d564ba3a265d56349b395 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Wed, 4 Aug 2021 15:12:00 -0700 Subject: [PATCH 3/3] also check field attribute for FLDATTR_oneelem_simd when field ID is non-zero --- src/mapleall/maple_me/src/me_rename2preg.cpp | 7 +++++++ src/mapleall/maple_me/src/me_ssa_lpre.cpp | 15 +++++++++++++++ src/mapleall/maple_me/src/prop.cpp | 7 +++++++ 3 files changed, 29 insertions(+) diff --git a/src/mapleall/maple_me/src/me_rename2preg.cpp b/src/mapleall/maple_me/src/me_rename2preg.cpp index 2d75c13a3c..79ceb99144 100644 --- a/src/mapleall/maple_me/src/me_rename2preg.cpp +++ b/src/mapleall/maple_me/src/me_rename2preg.cpp @@ -34,6 +34,13 @@ RegMeExpr *SSARename2Preg::RenameVar(const VarMeExpr *varmeexpr) { if (mirst->GetAttr(ATTR_localrefvar) || mirst->GetAttr(ATTR_oneelem_simd)) { return nullptr; } + if (ost->GetFieldID() != 0 && mirModule->IsCModule()) { + MIRStructType *structType = static_cast(GlobalTables::GetTypeTable().GetTypeFromTyIdx(mirst->GetTyIdx())); + FieldAttrs fattrs = structType->GetFieldAttrs(ost->GetFieldID()); + if (fattrs.GetAttr(FLDATTR_oneelem_simd)) { + return nullptr; + } + } if (ost->IsFormal() && varmeexpr->GetPrimType() == PTY_ref) { return nullptr; } diff --git a/src/mapleall/maple_me/src/me_ssa_lpre.cpp b/src/mapleall/maple_me/src/me_ssa_lpre.cpp index 6f07440ddd..a8e9ca5420 100644 --- a/src/mapleall/maple_me/src/me_ssa_lpre.cpp +++ b/src/mapleall/maple_me/src/me_ssa_lpre.cpp @@ -244,6 +244,14 @@ void MeSSALPre::BuildWorkListLHSOcc(MeStmt &meStmt, int32 seqStmt) { if (ost->IsVolatile() || ost->GetMIRSymbol()->GetAttr(ATTR_oneelem_simd)) { return; } + if (ost->GetFieldID() != 0 && mirModule->IsCModule()) { + MIRStructType *structType = static_cast(GlobalTables::GetTypeTable().GetTypeFromTyIdx(ost->GetMIRSymbol()->GetTyIdx())); + FieldAttrs fattrs = structType->GetFieldAttrs(ost->GetFieldID()); + if (fattrs.GetAttr(FLDATTR_oneelem_simd)) { + return; + } + } + if (lhs->GetPrimType() == PTY_agg) { return; } @@ -316,6 +324,13 @@ void MeSSALPre::BuildWorkListExpr(MeStmt &meStmt, int32 seqStmt, MeExpr &meExpr, if (sym->GetAttr(ATTR_oneelem_simd)) { break; } + if (ost->GetFieldID() != 0 && mirModule->IsCModule()) { + MIRStructType *structType = static_cast(GlobalTables::GetTypeTable().GetTypeFromTyIdx(sym->GetTyIdx())); + FieldAttrs fattrs = structType->GetFieldAttrs(ost->GetFieldID()); + if (fattrs.GetAttr(FLDATTR_oneelem_simd)) { + break; + } + } if (sym->IsInstrumented() && !(func->GetHints() & kPlacementRCed)) { // not doing because its SSA form is not complete break; diff --git a/src/mapleall/maple_me/src/prop.cpp b/src/mapleall/maple_me/src/prop.cpp index 59f52a4631..0a6f43ea58 100644 --- a/src/mapleall/maple_me/src/prop.cpp +++ b/src/mapleall/maple_me/src/prop.cpp @@ -618,6 +618,13 @@ MeExpr &Prop::PropVar(VarMeExpr &varMeExpr, bool atParm, bool checkPhi) { if (st->IsInstrumented() || varMeExpr.IsVolatile() || st->GetAttr(ATTR_oneelem_simd)) { return varMeExpr; } + if (varMeExpr.GetOst()->GetFieldID() != 0 && mirModule.IsCModule()) { + MIRStructType *structType = static_cast(GlobalTables::GetTypeTable().GetTypeFromTyIdx(st->GetTyIdx())); + FieldAttrs fattrs = structType->GetFieldAttrs(varMeExpr.GetOst()->GetFieldID()); + if (fattrs.GetAttr(FLDATTR_oneelem_simd)) { + return varMeExpr; + } + } if (varMeExpr.GetDefBy() == kDefByStmt) { DassignMeStmt *defStmt = static_cast(varMeExpr.GetDefStmt()); -- Gitee