aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2025-01-01 16:07:03 +0100
committerRichard Biener <rguenth@gcc.gnu.org>2025-01-02 14:46:27 +0100
commit6488d5b86126a538ebb8560556dd462ec3d5d62e (patch)
treee3ab12625897d71b236273fd8c5da75dc7ed7513 /gcc
parent2b687ad95de61091105d040d6bc06cb3d44ac3d1 (diff)
downloadgcc-6488d5b86126a538ebb8560556dd462ec3d5d62e.zip
gcc-6488d5b86126a538ebb8560556dd462ec3d5d62e.tar.gz
gcc-6488d5b86126a538ebb8560556dd462ec3d5d62e.tar.bz2
tree-optimization/118171 - GENERIC folding in PRE results in invalid GIMPLE
PRE applies GENERIC folding to some component ref components which might result in invalid GIMPLE, like a VIEW_CONVERT_EXPR wrapping a REALPART_EXPR as in the PR. The following removes all GENERIC folding in the code re-constructing a GENERIC component-ref from the PRE VN IL. PR tree-optimization/118171 * tree-ssa-pre.cc (create_component_ref_by_pieces_1): Do not fold any component ref parts. * gcc.dg/torture/pr118171.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr118171.c12
-rw-r--r--gcc/tree-ssa-pre.cc8
2 files changed, 16 insertions, 4 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr118171.c b/gcc/testsuite/gcc.dg/torture/pr118171.c
new file mode 100644
index 0000000..3cdf002
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr118171.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+
+_Complex float f;
+static int d;
+
+void
+foo(char *p)
+{
+ do {
+ __builtin_memcpy(&d, 3 + p, 2);
+ } while (*(_Complex char *)&f);
+}
diff --git a/gcc/tree-ssa-pre.cc b/gcc/tree-ssa-pre.cc
index fea060e..32bcd9b 100644
--- a/gcc/tree-ssa-pre.cc
+++ b/gcc/tree-ssa-pre.cc
@@ -2622,7 +2622,7 @@ create_component_ref_by_pieces_1 (basic_block block, vn_reference_t ref,
stmts);
if (!genop0)
return NULL_TREE;
- return fold_build1 (currop->opcode, currop->type, genop0);
+ return build1 (currop->opcode, currop->type, genop0);
}
case WITH_SIZE_EXPR:
@@ -2634,7 +2634,7 @@ create_component_ref_by_pieces_1 (basic_block block, vn_reference_t ref,
tree genop1 = find_or_generate_expression (block, currop->op0, stmts);
if (!genop1)
return NULL_TREE;
- return fold_build2 (currop->opcode, currop->type, genop0, genop1);
+ return build2 (currop->opcode, currop->type, genop0, genop1);
}
case BIT_FIELD_REF:
@@ -2647,7 +2647,7 @@ create_component_ref_by_pieces_1 (basic_block block, vn_reference_t ref,
tree op2 = currop->op1;
tree t = build3 (BIT_FIELD_REF, currop->type, genop0, op1, op2);
REF_REVERSE_STORAGE_ORDER (t) = currop->reverse;
- return fold (t);
+ return t;
}
/* For array ref vn_reference_op's, operand 1 of the array ref
@@ -2725,7 +2725,7 @@ create_component_ref_by_pieces_1 (basic_block block, vn_reference_t ref,
if (!genop2)
return NULL_TREE;
}
- return fold_build3 (COMPONENT_REF, TREE_TYPE (op1), op0, op1, genop2);
+ return build3 (COMPONENT_REF, TREE_TYPE (op1), op0, op1, genop2);
}
case SSA_NAME: