aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTamar Christina <tamar.christina@arm.com>2024-07-17 16:22:14 +0100
committerTamar Christina <tamar.christina@arm.com>2024-07-17 16:22:14 +0100
commit0135a90de5a99b51001b6152d8b548151ebfa1c3 (patch)
tree98dd011c615771e494c984a2ed1c23181a9b85e5
parent247335823f420eb1dd56f4bf32ac78d441f5ccc2 (diff)
downloadgcc-0135a90de5a99b51001b6152d8b548151ebfa1c3.zip
gcc-0135a90de5a99b51001b6152d8b548151ebfa1c3.tar.gz
gcc-0135a90de5a99b51001b6152d8b548151ebfa1c3.tar.bz2
middle-end: fix 0 offset creation and folding [PR115936]
As shown in PR115936 SCEV and IVOPTS create an invalidate IV when the IV is a pointer type: ivtmp.39_65 = ivtmp.39_59 + 0B; where the IVs are DI mode and the offset is a pointer. This comes from this weird candidate: Candidate 8: Var befor: ivtmp.39_59 Var after: ivtmp.39_65 Incr POS: before exit test IV struct: Type: sizetype Base: 0 Step: 0B Biv: N Overflowness wrto loop niter: No-overflow This IV was always created just ended up not being used. This is created by SCEV. simple_iv_with_niters in the case where no CHREC is found creates an IV with base == ev, offset == 0; however in this case EV is a POINTER_PLUS_EXPR and so the type is a pointer. it ends up creating an unusable expression. gcc/ChangeLog: PR tree-optimization/115936 * tree-scalar-evolution.cc (simple_iv_with_niters): Use sizetype for pointers.
-rw-r--r--gcc/tree-scalar-evolution.cc6
1 files changed, 5 insertions, 1 deletions
diff --git a/gcc/tree-scalar-evolution.cc b/gcc/tree-scalar-evolution.cc
index 5aa95a2..abb2bad 100644
--- a/gcc/tree-scalar-evolution.cc
+++ b/gcc/tree-scalar-evolution.cc
@@ -3243,7 +3243,11 @@ simple_iv_with_niters (class loop *wrto_loop, class loop *use_loop,
if (tree_does_not_contain_chrecs (ev))
{
iv->base = ev;
- iv->step = build_int_cst (TREE_TYPE (ev), 0);
+ tree ev_type = TREE_TYPE (ev);
+ if (POINTER_TYPE_P (ev_type))
+ ev_type = sizetype;
+
+ iv->step = build_int_cst (ev_type, 0);
iv->no_overflow = true;
return true;
}