diff options
author | Richard Biener <rguenther@suse.de> | 2025-01-01 16:07:03 +0100 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2025-01-02 14:46:27 +0100 |
commit | 6488d5b86126a538ebb8560556dd462ec3d5d62e (patch) | |
tree | e3ab12625897d71b236273fd8c5da75dc7ed7513 /gcc | |
parent | 2b687ad95de61091105d040d6bc06cb3d44ac3d1 (diff) | |
download | gcc-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.c | 12 | ||||
-rw-r--r-- | gcc/tree-ssa-pre.cc | 8 |
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: |