Looking into the history here, we used to use the original pointer
type for the IVs. That was changed with r0-67159-gd482f417e4445f
where then we started to use ptr_type_node. And then that changed
again with r0-76106-g2052721560b232.
BUT this was all before POINTER_PLUS_EXPR was around (r0-81506-g5be014d5b728cf).
In the case of pointers even though it is undefined if they wrap,
the wrapping would have happened anyways. Also the second
operand for pointer plus is treated as a signed integer
(even though it uses an unsigned integer type) so adding a value
that is negative for signed case but a big number of the
unsigned case is not undefined.
So the reason why I am proposing this is to fix up a regression
after r16-5975-gfae0c6262 where we get and overlapping live
range for 2 variables which are the same:
```
# ivtmp.7_12 = PHI <ivtmp.7_5(5), ivtmp.7_15(3)>
_3 = (int *) ivtmp.7_12;
_4 = MEM[(int *)_3];
if (_4 == val_10(D))
goto <bb 6>; [5.50%]
else
goto <bb 5>; [94.50%]
<bb 5> [local count: 958878295]:
ivtmp.7_5 = ivtmp.7_12 + 4;
if (ivtmp.7_5 != _20)
goto <bb 4>; [94.50%]
else
goto <bb 7>; [5.50%]
<bb 7> [local count: 59055800]:
goto <bb 6>; [100.00%]
<bb 6> [local count: 114863531]:
# _6 = PHI <_3(4), 0B(7)>
```
Sometimes cse2 fixes this up and other times it does not. I have
not figured out what conditions that cse2 will fix it up or not.
I also noticed sometimes doing the removal of the forwarder causes
cse2 in other cases not to resolve this. So I felt it is better
to try to fix this up at the source, ivopts.
Can anyone think of a reason why this might be wrong. I only think
if the pointer was used conditionally we might get an possible undefined
IV being selected. RFH: what is the best way to remove/change that
candidate when the pointer is used conditional.
Bootstrapped and tested on x86_64-linux-gnu with just 4 minor
testcases changes needed.
PR tree-optimization/123070
gcc/ChangeLog:
* tree-ssa-loop-ivopts.cc (generic_type_for): Use ptr_type_node
for pointer types.
gcc/testsuite/ChangeLog:
* gcc.dg/tree-ssa/ivopts-5.c: Update dump scan.
* gcc.dg/tree-ssa/ivopts-6.c: Likewise.
* gcc.dg/tree-ssa/ivopts-8.c: Likewise.
* gcc.dg/tree-ssa/ivopts-9.c: Likewise.
Signed-off-by: Andrew Pinski <[email protected]>
---
gcc/testsuite/gcc.dg/tree-ssa/ivopts-5.c | 2 +-
gcc/testsuite/gcc.dg/tree-ssa/ivopts-6.c | 2 +-
gcc/testsuite/gcc.dg/tree-ssa/ivopts-8.c | 2 +-
gcc/testsuite/gcc.dg/tree-ssa/ivopts-9.c | 2 +-
gcc/tree-ssa-loop-ivopts.cc | 2 +-
5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ivopts-5.c
b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-5.c
index 7b9615f07f3..2b061879fb7 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ivopts-5.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-5.c
@@ -12,4 +12,4 @@ foo (int* mem, int sz, int val)
return 0;
}
-/* { dg-final { scan-tree-dump "inv_expr \[0-9\]: \\t\\(unsigned long\\)
sz_\[0-9\]\\(D\\) \\* 4 \\+ \\(unsigned long\\) mem_\[0-9\]\\(D\\)" "ivopts" }
} */
+/* { dg-final { scan-tree-dump "inv_expr \[0-9\]: \\tmem_\[0-9\]\\(D\\) \\+
\\(sizetype\\) sz_\[0-9\]\\(D\\) \\* 4" "ivopts" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ivopts-6.c
b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-6.c
index 08304293140..7d4f339e60d 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ivopts-6.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-6.c
@@ -12,4 +12,4 @@ foo (int* mem, int sz, int val)
return 0;
}
-/* { dg-final { scan-tree-dump "inv_expr \[0-9\]: \\t\\(unsigned long\\)
sz_\[0-9\]\\(D\\) \\* 4 \\+ \\(unsigned long\\) mem_\[0-9\]\\(D\\)" "ivopts" }
} */
+/* { dg-final { scan-tree-dump "inv_expr \[0-9\]: \\tmem_\[0-9\]\\(D\\) \\+
\\(sizetype\\) sz_\[0-9\]\\(D\\) \\* 4" "ivopts" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ivopts-8.c
b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-8.c
index a7fd3c9de37..05b8d7550c1 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ivopts-8.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-8.c
@@ -12,4 +12,4 @@ foo (int* mem, char sz, int val)
return 0;
}
-/* { dg-final { scan-tree-dump "inv_expr \[0-9\]: \\t\\(unsigned (long|int)\\)
sz_\[0-9\]*\\(D\\) \\* 4 \\+ \\(unsigned (long|int)\\) mem_\[0-9\]*\\(D\\)"
"ivopts" } } */
+/* { dg-final { scan-tree-dump "inv_expr \[0-9\]: \\tmem_\[0-9\]*\\(D\\) \\+
\\(sizetype\\) sz_\[0-9\]*\\(D\\) \\* 4" "ivopts" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ivopts-9.c
b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-9.c
index fb9656b88d7..092413d8039 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ivopts-9.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-9.c
@@ -12,4 +12,4 @@ foo (int* mem, unsigned char sz, int val)
return 0;
}
-/* { dg-final { scan-tree-dump "inv_expr \[0-9\]: \\t\\(unsigned (long|int)\\)
sz_\[0-9\]\\(D\\) \\* 4 \\+ \\(unsigned (long|int)\\) mem_\[0-9\]\\(D\\)"
"ivopts" } } */
+/* { dg-final { scan-tree-dump "inv_expr \[0-9\]: \\tmem_\[0-9\]*\\(D\\) \\+
\\(sizetype\\) sz_\[0-9\]*\\(D\\) \\* 4" "ivopts" } } */
diff --git a/gcc/tree-ssa-loop-ivopts.cc b/gcc/tree-ssa-loop-ivopts.cc
index ba727adc808..deaa68de200 100644
--- a/gcc/tree-ssa-loop-ivopts.cc
+++ b/gcc/tree-ssa-loop-ivopts.cc
@@ -2927,7 +2927,7 @@ static tree
generic_type_for (tree type)
{
if (POINTER_TYPE_P (type))
- return unsigned_type_for (type);
+ return ptr_type_node;
if (TYPE_UNSIGNED (type))
return type;
--
2.43.0