void KNCVectorLegalization::visit(const Nodecl::VectorLoad& n) { const Nodecl::NodeclBase rhs = n.get_rhs(); const Nodecl::NodeclBase mask = n.get_mask(); const Nodecl::List flags = n.get_flags().as<Nodecl::List>(); walk(rhs); walk(mask); walk(flags); bool explicitly_aligned = !flags.find_first<Nodecl::AlignedFlag>().is_null(); // Turn unaligned load into gather if (!explicitly_aligned && (_prefer_gather_scatter || (_prefer_mask_gather_scatter && !mask.is_null()))) { VECTORIZATION_DEBUG() { fprintf(stderr, "KNC Legalization: Turn unaligned load '%s' into "\ "adjacent gather\n", rhs.prettyprint().c_str()); }
bool NodeclStaticInfo::is_simd_aligned_access( const Nodecl::NodeclBase& n, const TL::ObjectList<Nodecl::NodeclBase>* suitable_expressions, int unroll_factor, int alignment ) const { if( !n.is<Nodecl::ArraySubscript>( ) ) { std::cerr << "warning: returning false for is_simd_aligned_access when asking for nodecl '" << n.prettyprint( ) << "' which is not an array subscript" << std::endl; return false; } bool result = false; Nodecl::NodeclBase subscripted = n.as<Nodecl::ArraySubscript>( ).get_subscripted( ); int type_size = subscripted.get_type().basic_type().get_size(); SuitableAlignmentVisitor sa_v( _induction_variables, suitable_expressions, unroll_factor, type_size, alignment ); int subscript_alignment = sa_v.walk( n ); if( (subscript_alignment % alignment) == 0 ) result = true; return result; }
ObjectList<Nodecl::NodeclBase> ExtendedSymbol::get_nodecls_base( const Nodecl::NodeclBase& n ) { if (n.is<Nodecl::Symbol>() || n.is<Nodecl::PointerToMember>() || n.is<Nodecl::ObjectInit>() || n.is<Nodecl::FunctionCall>()) { return ObjectList<Nodecl::NodeclBase>(1, n); } else if (n.is<Nodecl::IntegerLiteral>() || n.is<Nodecl::FloatingLiteral>() || n.is<Nodecl::ComplexLiteral>() || n.is<Nodecl::StringLiteral>() || n.is<Nodecl::BooleanLiteral>()) { return ObjectList<Nodecl::NodeclBase>(); } else if (n.is<Nodecl::ClassMemberAccess>()) { Nodecl::ClassMemberAccess aux = n.as<Nodecl::ClassMemberAccess>(); return get_nodecls_base(aux.get_lhs()); } else if (n.is<Nodecl::ArraySubscript>()) { Nodecl::ArraySubscript aux = n.as<Nodecl::ArraySubscript>(); return get_nodecls_base(aux.get_subscripted()); } else if (n.is<Nodecl::Reference>()) { Nodecl::Reference aux = n.as<Nodecl::Reference>(); return get_nodecls_base(aux.get_rhs()); } else if (n.is<Nodecl::Dereference>()) { Nodecl::Dereference aux = n.as<Nodecl::Dereference>(); return get_nodecls_base(aux.get_rhs()); } else if (n.is<Nodecl::Conversion>()) { Nodecl::Conversion aux = n.as<Nodecl::Conversion>(); return get_nodecls_base(aux.get_nest()); } else if (n.is<Nodecl::Cast>()) { Nodecl::Cast aux = n.as<Nodecl::Cast>(); return get_nodecls_base(aux.get_rhs()); } /*! * We can have (pre- post-) in- de-crements and other arithmetic operations * Example: * T *curr_high = ...; * *curr_high-- = l; * "*curr_high--" is a _KILLED_VAR */ else if (n.is<Nodecl::Predecrement>()) { Nodecl::Predecrement aux = n.as<Nodecl::Predecrement>(); return get_nodecls_base(aux.get_rhs()); } else if (n.is<Nodecl::Postdecrement>()) { Nodecl::Postdecrement aux = n.as<Nodecl::Postdecrement>(); return get_nodecls_base(aux.get_rhs()); } else if (n.is<Nodecl::Preincrement>()) { Nodecl::Preincrement aux = n.as<Nodecl::Preincrement>(); return get_nodecls_base(aux.get_rhs()); } else if (n.is<Nodecl::Postincrement>()) { Nodecl::Postincrement aux = n.as<Nodecl::Postincrement>(); return get_nodecls_base(aux.get_rhs()); } else if (n.is<Nodecl::Add>()) { Nodecl::Add aux = n.as<Nodecl::Add>(); ObjectList<Nodecl::NodeclBase> rhs = get_nodecls_base(aux.get_rhs()); ObjectList<Nodecl::NodeclBase> lhs = get_nodecls_base(aux.get_lhs()); return rhs.append(lhs); } else { internal_error("Unexpected type of nodecl '%s' contained in an ExtendedSymbol '%s'", ast_print_node_type(n.get_kind()), n.prettyprint().c_str()); } }