summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>2014-09-03 16:16:28 +0000
committerjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>2014-09-03 16:16:28 +0000
commiteb2b2e5138ca9dec901a221a7043fd9981d65ebb (patch)
tree4bc9e47c2cf7b84c4e6ce583b0b0300767c2188b
parent4a0e28ec29aa5eb2f9f01ea04c0c04fa41e0f29b (diff)
downloadppe42-gcc-eb2b2e5138ca9dec901a221a7043fd9981d65ebb.tar.gz
ppe42-gcc-eb2b2e5138ca9dec901a221a7043fd9981d65ebb.zip
2014-09-03 Martin Jambor <mjambor@suse.cz>
PR ipa/62015 * ipa-cp.c (intersect_aggregates_with_edge): Handle impermissible pass-trough jump functions correctly. testsuite/ * g++.dg/ipa/pr62015.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@214883 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ipa-cp.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ipa/pr62015.C55
4 files changed, 76 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c3b59ef44ef..fabb693341c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2014-09-03 Martin Jambor <mjambor@suse.cz>
+ PR ipa/62015
+ * ipa-cp.c (intersect_aggregates_with_edge): Handle impermissible
+ pass-trough jump functions correctly.
+
+2014-09-03 Martin Jambor <mjambor@suse.cz>
+
PR ipa/61986
* ipa-cp.c (find_aggregate_values_for_callers_subset): Chain
created replacements in ascending order of offsets.
diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
index c1c1782e358..a6818ba8da1 100644
--- a/gcc/ipa-cp.c
+++ b/gcc/ipa-cp.c
@@ -3032,6 +3032,11 @@ intersect_aggregates_with_edge (struct cgraph_edge *cs, int index,
intersect_with_agg_replacements (cs->caller, src_idx,
&inter, 0);
}
+ else
+ {
+ inter.release ();
+ return vNULL;
+ }
}
else
{
@@ -3047,6 +3052,11 @@ intersect_aggregates_with_edge (struct cgraph_edge *cs, int index,
else
intersect_with_plats (src_plats, &inter, 0);
}
+ else
+ {
+ inter.release ();
+ return vNULL;
+ }
}
}
else if (jfunc->type == IPA_JF_ANCESTOR
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 055a7d27c89..0200c69a518 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2014-09-03 Martin Jambor <mjambor@suse.cz>
+ PR ipa/62015
+ * g++.dg/ipa/pr62015.C: New test.
+
+2014-09-03 Martin Jambor <mjambor@suse.cz>
+
PR ipa/61986
* gcc.dg/ipa/pr61986.c: New test.
diff --git a/gcc/testsuite/g++.dg/ipa/pr62015.C b/gcc/testsuite/g++.dg/ipa/pr62015.C
new file mode 100644
index 00000000000..950b46e759b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/pr62015.C
@@ -0,0 +1,55 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -std=c++11" } */
+
+
+extern "C" int printf(const char *fmt, ...);
+extern "C" void abort(void);
+
+struct Side {
+ enum _Value { Left, Right, Invalid };
+
+ constexpr Side() : _value(Invalid) {}
+ constexpr Side(_Value value) : _value(value) {}
+ operator _Value() const { return (_Value)_value; }
+
+ private:
+ char _value;
+};
+
+struct A {
+ void init();
+ void adjust(Side side, bool final);
+ void move(Side side);
+};
+
+void A::init()
+{
+ adjust(Side::Invalid, false);
+}
+
+static void __attribute__((noinline))
+check (int v, int final)
+{
+ if (v != 0)
+ abort();
+}
+
+
+__attribute__((noinline))
+void A::adjust(Side side, bool final)
+{
+ check ((int)side, final);
+}
+
+void A::move(Side side)
+{
+ adjust(side, false);
+ adjust(side, true);
+}
+
+int main()
+{
+ A t;
+ t.move(Side::Left);
+ return 0;
+}
OpenPOWER on IntegriCloud