Commit b807e627 by Martin Jambor Committed by Martin Jambor

re PR tree-optimization/49516 (SRA generates memory references into its replacements)

2011-06-24  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimizations/49516
	* tree-sra.c (sra_modify_assign): Choose the safe path for
	aggregate copies if we also did scalar replacements.

	* testsuite/g++.dg/tree-ssa/pr49516.C: New test.

From-SVN: r175376
parent 9a1ea4b9
2011-06-24 Martin Jambor <mjambor@suse.cz>
PR tree-optimizations/49516
* tree-sra.c (sra_modify_assign): Choose the safe path for
aggregate copies if we also did scalar replacements.
2011-06-24 Ramana Radhakrishnan <ramana.radhakrishnan@linaro.org> 2011-06-24 Ramana Radhakrishnan <ramana.radhakrishnan@linaro.org>
PR target/49335 PR target/49335
......
2011-06-24 Martin Jambor <mjambor@suse.cz>
PR tree-optimizations/49516
* g++.dg/tree-ssa/pr49516.C: New test.
2011-06-23 Jason Merrill <jason@redhat.com> 2011-06-23 Jason Merrill <jason@redhat.com>
PR c++/35255 PR c++/35255
......
/* { dg-do run } */
/* { dg-options "-O2" } */
extern "C" void abort (void);
typedef int int32;
typedef unsigned int uint32;
typedef unsigned long long uint64;
typedef short int16;
class Tp {
public:
Tp(int, const int segment, const int index) __attribute__((noinline));
inline bool operator==(const Tp& other) const;
inline bool operator!=(const Tp& other) const;
int GetType() const { return type_; }
int GetSegment() const { return segment_; }
int GetIndex() const { return index_; }
private:
inline static bool IsValidSegment(const int segment);
static const int kSegmentBits = 28;
static const int kTypeBits = 4;
static const int kMaxSegment = (1 << kSegmentBits) - 1;
union {
struct {
int32 index_;
uint32 segment_ : kSegmentBits;
uint32 type_ : kTypeBits;
};
struct {
int32 dummy_;
uint32 type_and_segment_;
};
uint64 value_;
};
};
Tp::Tp(int t, const int segment, const int index)
: index_(index), segment_(segment), type_(t) {}
inline bool Tp::operator==(const Tp& other) const {
return value_ == other.value_;
}
inline bool Tp::operator!=(const Tp& other) const {
return value_ != other.value_;
}
class Range {
public:
inline Range(const Tp& position, const int count) __attribute__((always_inline));
inline Tp GetBeginTokenPosition() const;
inline Tp GetEndTokenPosition() const;
private:
Tp position_;
int count_;
int16 begin_index_;
int16 end_index_;
};
inline Range::Range(const Tp& position,
const int count)
: position_(position), count_(count), begin_index_(0), end_index_(0)
{ }
inline Tp Range::GetBeginTokenPosition() const {
return position_;
}
inline Tp Range::GetEndTokenPosition() const {
return Tp(position_.GetType(), position_.GetSegment(),
position_.GetIndex() + count_);
}
int main ()
{
Range range(Tp(0, 0, 3), 0);
if (!(range.GetBeginTokenPosition() == Tp(0, 0, 3)))
abort ();
if (!(range.GetEndTokenPosition() == Tp(0, 0, 3)))
abort();
return 0;
}
...@@ -2876,7 +2876,8 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi) ...@@ -2876,7 +2876,8 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi)
there to do the copying and then load the scalar replacements of the LHS. there to do the copying and then load the scalar replacements of the LHS.
This is what the first branch does. */ This is what the first branch does. */
if (gimple_has_volatile_ops (*stmt) if (modify_this_stmt
|| gimple_has_volatile_ops (*stmt)
|| contains_vce_or_bfcref_p (rhs) || contains_vce_or_bfcref_p (rhs)
|| contains_vce_or_bfcref_p (lhs)) || contains_vce_or_bfcref_p (lhs))
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment