diff --git a/src/mapleall/maple_me/src/me_rename2preg.cpp b/src/mapleall/maple_me/src/me_rename2preg.cpp index 2d75c13a3cbd89f3884b5d423e9c31811bd50389..79ceb99144b320653a4ef5768f50a0001102b134 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 9e18a6a496dde4a3a3c310505368180789537d17..a8e9ca542077c5d6674dc714f43d3936da3eb2b0 100644 --- a/src/mapleall/maple_me/src/me_ssa_lpre.cpp +++ b/src/mapleall/maple_me/src/me_ssa_lpre.cpp @@ -241,9 +241,17 @@ 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 (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; } @@ -313,6 +321,16 @@ void MeSSALPre::BuildWorkListExpr(MeStmt &meStmt, int32 seqStmt, MeExpr &meExpr, break; } const MIRSymbol *sym = ost->GetMIRSymbol(); + 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 e2b154c4688e9483da71c754d5d5b44dcf2ffe8b..0a6f43ea58395a6060ae7ef589a5a0ed2b809ec6 100644 --- a/src/mapleall/maple_me/src/prop.cpp +++ b/src/mapleall/maple_me/src/prop.cpp @@ -615,9 +615,16 @@ 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; } + 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());