mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-08 22:45:43 +00:00
89 lines
2.5 KiB
Diff
89 lines
2.5 KiB
Diff
|
Index: gcc/testsuite/gcc.c-torture/execute/pr90949.c
|
||
|
===================================================================
|
||
|
--- gcc/testsuite/gcc.c-torture/execute/pr90949.c (nonexistent)
|
||
|
+++ gcc/testsuite/gcc.c-torture/execute/pr90949.c (revision 272555)
|
||
|
@@ -0,0 +1,42 @@
|
||
|
+void __attribute__ ((noipa, noinline)) my_puts (const char *str) { }
|
||
|
+
|
||
|
+void __attribute__ ((noipa, noinline)) my_free (void *p) { }
|
||
|
+
|
||
|
+
|
||
|
+struct Node
|
||
|
+{
|
||
|
+ struct Node *child;
|
||
|
+};
|
||
|
+
|
||
|
+struct Node space[2] = { };
|
||
|
+
|
||
|
+struct Node * __attribute__ ((noipa, noinline)) my_malloc (int bytes)
|
||
|
+{
|
||
|
+ return &space[0];
|
||
|
+}
|
||
|
+
|
||
|
+void
|
||
|
+walk (struct Node *module, int cleanup)
|
||
|
+{
|
||
|
+ if (module == 0)
|
||
|
+ {
|
||
|
+ return;
|
||
|
+ }
|
||
|
+ if (!cleanup)
|
||
|
+ {
|
||
|
+ my_puts ("No cleanup");
|
||
|
+ }
|
||
|
+ walk (module->child, cleanup);
|
||
|
+ if (cleanup)
|
||
|
+ {
|
||
|
+ my_free (module);
|
||
|
+ }
|
||
|
+}
|
||
|
+
|
||
|
+int
|
||
|
+main ()
|
||
|
+{
|
||
|
+ struct Node *node = my_malloc (sizeof (struct Node));
|
||
|
+ node->child = 0;
|
||
|
+ walk (node, 1);
|
||
|
+}
|
||
|
Index: gcc/tree-ssa-copy.c
|
||
|
===================================================================
|
||
|
--- gcc/tree-ssa-copy.c (revision 272554)
|
||
|
+++ gcc/tree-ssa-copy.c (revision 272555)
|
||
|
@@ -545,13 +545,12 @@
|
||
|
duplicate_ssa_name_ptr_info (copy_of[i].value,
|
||
|
SSA_NAME_PTR_INFO (var));
|
||
|
/* Points-to information is cfg insensitive,
|
||
|
- but alignment info might be cfg sensitive, if it
|
||
|
- e.g. is derived from VRP derived non-zero bits.
|
||
|
- So, do not copy alignment info if the two SSA_NAMEs
|
||
|
- aren't defined in the same basic block. */
|
||
|
+ but [E]VRP might record context sensitive alignment
|
||
|
+ info, non-nullness, etc. So reset context sensitive
|
||
|
+ info if the two SSA_NAMEs aren't defined in the same
|
||
|
+ basic block. */
|
||
|
if (var_bb != copy_of_bb)
|
||
|
- mark_ptr_info_alignment_unknown
|
||
|
- (SSA_NAME_PTR_INFO (copy_of[i].value));
|
||
|
+ reset_flow_sensitive_info (copy_of[i].value);
|
||
|
}
|
||
|
else if (!POINTER_TYPE_P (TREE_TYPE (var))
|
||
|
&& SSA_NAME_RANGE_INFO (var)
|
||
|
Index: gcc/tree-ssanames.c
|
||
|
===================================================================
|
||
|
--- gcc/tree-ssanames.c (revision 272554)
|
||
|
+++ gcc/tree-ssanames.c (revision 272555)
|
||
|
@@ -820,7 +820,12 @@
|
||
|
{
|
||
|
/* points-to info is not flow-sensitive. */
|
||
|
if (SSA_NAME_PTR_INFO (name))
|
||
|
- mark_ptr_info_alignment_unknown (SSA_NAME_PTR_INFO (name));
|
||
|
+ {
|
||
|
+ /* [E]VRP can derive context sensitive alignment info and
|
||
|
+ non-nullness properties. We must reset both. */
|
||
|
+ mark_ptr_info_alignment_unknown (SSA_NAME_PTR_INFO (name));
|
||
|
+ SSA_NAME_PTR_INFO (name)->pt.null = 1;
|
||
|
+ }
|
||
|
}
|
||
|
else
|
||
|
SSA_NAME_RANGE_INFO (name) = NULL;
|