https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103855
--- Comment #1 from Zhao Wei Liew <zhaoweiliew at gmail dot com> ---
After some research, I decided to look into value range propagation (VRP). I
compiled with `-fdump-tree-vrp` and the VRP files contained the following for
`optimized()`:
For the file ending in .vrp1,
```
;; Function unoptimized (_Z11unoptimizedjj, funcdef_no=1, decl_uid=2121,
cgraph_uid=2, symbol_order=1)
;; 1 loops found
;;
;; Loop 0
;; header 0, latch 1
;; depth 0, outer -1
;; nodes: 0 1 2
;; 2 succs { 1 }
Value ranges after VRP:
_1: long long unsigned int [0, 4294967295]
_2: long long unsigned int [0, 4294967295]
a_3(D): unsigned int VARYING
all_4: long long unsigned int [0, 4294967295]
b_5(D): unsigned int VARYING
_6: unsigned int VARYING
unsigned int unoptimized (unsigned int a, unsigned int b)
{
long long unsigned int all;
long long unsigned int _1;
long long unsigned int _2;
unsigned int _6;
<bb 2> [local count: 1073741824]:
all_4 = (long long unsigned int) a_3(D);
_1 = (long long unsigned int) b_5(D);
_2 = all_4 / _1;
_6 = (unsigned int) _2;
return _6;
}
```
and for the file ending in .vrp2,
```
;; Function unoptimized (_Z11unoptimizedjj, funcdef_no=1, decl_uid=2121,
cgraph_uid=2, symbol_order=1)
;; 1 loops found
;;
;; Loop 0
;; header 0, latch 1
;; depth 0, outer -1
;; nodes: 0 1 2
;; 2 succs { 1 }
Exported global range table:
============================
_1 : long long unsigned int [0, 4294967295]
_2 : long long unsigned int [0, 4294967295]
all_4 : long long unsigned int [0, 4294967295]
unsigned int unoptimized (unsigned int a, unsigned int b)
{
long long unsigned int all;
long long unsigned int _1;
long long unsigned int _2;
unsigned int _6;
<bb 2> [local count: 1073741824]:
all_4 = (long long unsigned int) a_3(D);
_1 = (long long unsigned int) b_5(D);
_2 = all_4 / _1;
_6 = (unsigned int) _2;
return _6;
}
```
If I'm interpreting the above correctly, the optimizer seems to think all_4 can
be in the range [0, 4294967295], which is correct.
Hence, I suppose it's safe to conclude that VRP isn't the issue here? Please
correct me if I'm wrong.