diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc index f6c9f7755a4c4dbd0154ad62b1c1a2dda1498838..2b27076658fdc31439845ec824084c86991e8cef 100644 --- a/gcc/cfgexpand.cc +++ b/gcc/cfgexpand.cc @@ -728,7 +728,7 @@ vars_ssa_cache::operator() (tree name) gcc_assert (TREE_CODE (name) == SSA_NAME); if (!POINTER_TYPE_P (TREE_TYPE (name)) - && !INTEGRAL_TYPE_P (TREE_TYPE (name))) + && !ANY_INTEGRAL_TYPE_P (TREE_TYPE (name))) return empty; if (exists (name)) @@ -758,7 +758,7 @@ vars_ssa_cache::operator() (tree name) continue; if (!POINTER_TYPE_P (TREE_TYPE (use)) - && !INTEGRAL_TYPE_P (TREE_TYPE (use))) + && !ANY_INTEGRAL_TYPE_P (TREE_TYPE (use))) continue; /* Mark the old ssa name needs to be update from the use. */ @@ -772,10 +772,22 @@ vars_ssa_cache::operator() (tree name) so we don't go into an infinite loop for some phi nodes with loops. */ create (use); + gimple *g = SSA_NAME_DEF_STMT (use); + + /* CONSTRUCTOR here is always a vector initialization, + walk each element too. */ + if (gimple_assign_single_p (g) + && TREE_CODE (gimple_assign_rhs1 (g)) == CONSTRUCTOR) + { + tree ctr = gimple_assign_rhs1 (g); + unsigned i; + tree elm; + FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctr), i, elm) + work_list.safe_push (std::make_pair (elm, use)); + } /* For assignments, walk each operand for possible addresses. For PHI nodes, walk each argument. */ - gimple *g = SSA_NAME_DEF_STMT (use); - if (gassign *a = dyn_cast <gassign *> (g)) + else if (gassign *a = dyn_cast <gassign *> (g)) { /* operand 0 is the lhs. */ for (unsigned i = 1; i < gimple_num_ops (g); i++) diff --git a/gcc/testsuite/g++.dg/torture/pr105769-1.C b/gcc/testsuite/g++.dg/torture/pr105769-1.C new file mode 100644 index 0000000000000000000000000000000000000000..3fe973656b845acb5f672b2663679a9ef237a650 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr105769-1.C @@ -0,0 +1,67 @@ +// { dg-do run } + +// PR tree-optimization/105769 + +// The partitioning code would incorrectly have bias +// and a temporary in the same partitioning because +// it was thought bias was not alive when those were alive +// do to vectorization of a store of pointers (that included bias). + +#include <functional> + +template<size_t n, class T> +struct vec { + T dat[n]; + vec() {} + explicit vec(const T& x) { for(size_t i = 0; i < n; i++) dat[i] = x; } + T& operator [](size_t i) { return dat[i]; } + const T& operator [](size_t i) const { return dat[i]; } +}; + +template<size_t m, size_t n, class T> +using mat = vec<m, vec<n, T>>; +template<size_t n, class T> +using sq_mat = mat<n, n, T>; +using map_t = std::function<size_t(size_t)>; +template<class T_v> +using est_t = std::function<T_v(map_t map)>; +template<class T_v> using est2_t = std::function<T_v(map_t map)>; +map_t id_map() { return [](size_t j) -> size_t { return j; }; } + +template<size_t n, class T> +est2_t<void> jacknife(const est_t<vec<n, T>> est, sq_mat<n, T>& cov, vec<n, T>& bias) { + return [est, &cov, &bias](map_t map) -> void + { + bias = est(map); + for(size_t i = 0; i < n; i++) + { + bias[i].print(); + } + }; +} + +template<class T> +void print_cov_ratio() { + sq_mat<2, T> cov_jn; + vec<2, T> bias; + jacknife<2, T>([](map_t map) -> vec<2, T> { vec<2, T> retv; retv[0] = 1; retv[1] = 1; return retv; }, cov_jn, bias)(id_map()); +} +struct ab { + long long unsigned a; + short unsigned b; + double operator()() { return a; } + ab& operator=(double rhs) { a = rhs; return *this; } + void print(); +}; + +void +ab::print() +{ + +} + +int main() { + print_cov_ratio<ab>(); + return 0; +} +