aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2014-10-24 13:57:58 +0200
committerMartin Liska <marxin@gcc.gnu.org>2014-10-24 11:57:58 +0000
commit59f084e03422e81adad7caa1eb9b60f603693b7d (patch)
treec120642c40db86983e91fd0ba6ed4156d4327bd2 /gcc
parent237d8521e918cd3e270b9efbd36bafc68140c731 (diff)
downloadgcc-59f084e03422e81adad7caa1eb9b60f603693b7d.zip
gcc-59f084e03422e81adad7caa1eb9b60f603693b7d.tar.gz
gcc-59f084e03422e81adad7caa1eb9b60f603693b7d.tar.bz2
re PR tree-optimization/63595 (Segmentation faults inside kernel)
Fix for PR63595 * gcc.dg/ipa/pr63595.c: New test. * ipa-icf.c (sem_function::compare_phi_node): PHI result comparison From-SVN: r216662
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/ipa-icf.c6
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/ipa/pr63595.c65
4 files changed, 80 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a0e43ae..3d46f4c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2014-10-24 Martin Liska <mliska@suse.cz>
+
+ * ipa-icf.c (sem_function::compare_phi_node): PHI result comparison
+ added.
+
2014-10-24 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/aarch64/aarch64-elf-raw.h (CA53_ERR_835769_SPEC): Define.
diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c
index e8c32c7..e99b3e6 100644
--- a/gcc/ipa-icf.c
+++ b/gcc/ipa-icf.c
@@ -869,6 +869,12 @@ sem_function::compare_phi_node (basic_block bb1, basic_block bb2)
phi1 = gsi_stmt (si1);
phi2 = gsi_stmt (si2);
+ tree phi_result1 = gimple_phi_result (phi1);
+ tree phi_result2 = gimple_phi_result (phi2);
+
+ if (!m_checker->compare_operand (phi_result1, phi_result2))
+ return return_false_with_msg ("PHI results are different");
+
size1 = gimple_phi_num_args (phi1);
size2 = gimple_phi_num_args (phi2);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e14f554..7ac14611 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2014-10-24 Martin Liska <mliska@suse.cz>
+
+ * gcc.dg/ipa/pr63595.c: New test.
+
2014-10-24 Christophe Lyon <christophe.lyon@linaro.org>
* gcc.target/aarch64/advsimd-intrinsics/vuzp.c: New file.
diff --git a/gcc/testsuite/gcc.dg/ipa/pr63595.c b/gcc/testsuite/gcc.dg/ipa/pr63595.c
new file mode 100644
index 0000000..52851fb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/pr63595.c
@@ -0,0 +1,65 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-ipa-icf-details" } */
+
+typedef int size_t;
+
+typedef struct TypHeader {
+ unsigned long size;
+ struct TypHeader * * ptr;
+ char name[3];
+ unsigned char type;
+} * TypHandle;
+
+__attribute__((noinline))
+static TypHandle Error(const char *str, unsigned long l1, unsigned long l2)
+{
+ return 0;
+}
+
+extern TypHandle (* EvTab[81]) ( TypHandle hd );
+extern TypHandle (*TabProd[28][28]) ( TypHandle, TypHandle );
+
+__attribute__((noinline))
+TypHandle FunOnRight (TypHandle hdCall)
+{
+ TypHandle hdRes;
+ TypHandle hdPnt;
+ TypHandle hdElm;
+
+
+ if ( ((hdCall)->size) != 3*((size_t)sizeof(TypHandle)) )
+ return Error("",0L,0L);
+ hdPnt = ((long)(((TypHandle*)((hdCall)->ptr))[1])&1 ? (((TypHandle*)((hdCall)->ptr))[1]) : (* EvTab[(((long)(((TypHandle*)((hdCall)->ptr))[1]) & 1) ? 1 : ((((TypHandle*)((hdCall)->ptr))[1])->type))])((((TypHandle*)((hdCall)->ptr))[1])));
+ hdElm = ((long)(((TypHandle*)((hdCall)->ptr))[2])&1 ? (((TypHandle*)((hdCall)->ptr))[2]) : (* EvTab[(((long)(((TypHandle*)((hdCall)->ptr))[2]) & 1) ? 1 : ((((TypHandle*)((hdCall)->ptr))[2])->type))])((((TypHandle*)((hdCall)->ptr))[2])));
+
+
+ hdRes = ((*TabProd[(((long)(hdPnt) & 1) ? 1 : ((hdPnt)->type))][(((long)(hdElm) & 1) ? 1 : ((hdElm)->type))])((hdPnt),(hdElm)));
+ return hdRes;
+}
+
+__attribute__((noinline))
+TypHandle FunOnLeft (TypHandle hdCall)
+{
+ TypHandle hdRes;
+ TypHandle hdPnt;
+ TypHandle hdElm;
+
+
+ if ( ((hdCall)->size) != 3*((size_t)sizeof(TypHandle)) )
+ return Error("",0L,0L);
+ hdPnt = ((long)(((TypHandle*)((hdCall)->ptr))[1])&1 ? (((TypHandle*)((hdCall)->ptr))[1]) : (* EvTab[(((long)(((TypHandle*)((hdCall)->ptr))[1]) & 1) ? 1 : ((((TypHandle*)((hdCall)->ptr))[1])->type))])((((TypHandle*)((hdCall)->ptr))[1])));
+ hdElm = ((long)(((TypHandle*)((hdCall)->ptr))[2])&1 ? (((TypHandle*)((hdCall)->ptr))[2]) : (* EvTab[(((long)(((TypHandle*)((hdCall)->ptr))[2]) & 1) ? 1 : ((((TypHandle*)((hdCall)->ptr))[2])->type))])((((TypHandle*)((hdCall)->ptr))[2])));
+
+
+ hdRes = ((*TabProd[(((long)(hdElm) & 1) ? 1 : ((hdElm)->type))][(((long)(hdPnt) & 1) ? 1 : ((hdPnt)->type))])((hdElm),(hdPnt)));
+ return hdRes;
+}
+
+int main()
+{
+ return 0;
+}
+
+/* { dg-final { scan-ipa-dump "Equal symbols: 0" "icf" } } */
+/* { dg-final { scan-ipa-dump "PHI results are different" "icf" } } */
+/* { dg-final { cleanup-ipa-dump "icf" } } */