https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95757

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |aldyh at gcc dot gnu.org,
                   |                            |jakub at gcc dot gnu.org

--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
We get only 3 warnings on the last function with
-O2 -Wall -Wno-array-bounds --param=logical-op-non-short-circuit=0
-ftrack-macro-expansion=0
while we get 4 with
-O2 -Wall -Wno-array-bounds --param=logical-op-non-short-circuit=1
-ftrack-macro-expansion=0
I think the important differences are that while we have in *.optimized pretty
much the same IL - I only see differences between SSA_NAME versions, in the
--param=logical-op-non-short-circuit=1 case we have more accurate
SSA_NAME_RANGE_INFO on 3 SSA_NAMEs
   <bb 2> [local count: 1073741824]:
-  _51 ={v} unsigned_value_source;
-  if (_51 > 1)
+  _57 ={v} unsigned_value_source;
+  if (_57 > 1)
     goto <bb 4>; [50.00%]
   else
     goto <bb 3>; [50.00%]

   <bb 3> [local count: 536870912]:
   # RANGE [1, 2] NONZERO 3
-  _55 = _51 + 1;
+  _55 = _57 + 1;

   <bb 4> [local count: 1073741824]:
   # RANGE [1, 2] NONZERO 3
-  # prephitmp_54 = PHI <_55(3), 1(2)>
-  _49 ={v} unsigned_value_source;
-  _48 = _49 + 18446744073709551615;
-  if (_48 > 1)
+  # prephitmp_50 = PHI <1(2), _55(3)>
+  _52 ={v} unsigned_value_source;
+  _59 = _52 + 18446744073709551615;
+  if (_59 > 1)
     goto <bb 6>; [50.00%]
   else
     goto <bb 5>; [50.00%]

-  <bb 5> [local count: 268435457]:
-  _53 = _49 + 1;
+  <bb 5> [local count: 536870913]:
+  # RANGE [2, 3] NONZERO 3
+  _53 = _52 + 1;

   <bb 6> [local count: 1073741824]:
-  # prephitmp_57 = PHI <2(4), _53(5)>
+  # RANGE [2, 3] NONZERO 3
+  # prephitmp_54 = PHI <2(4), _53(5)>
   _47 ={v} unsigned_value_source;
-  _52 = _47 + 18446744073709551614;
-  if (_52 > 1)
+  _61 = _47 + 18446744073709551614;
+  if (_61 > 1)
     goto <bb 8>; [50.00%]
   else
     goto <bb 7>; [50.00%]

-  <bb 7> [local count: 268435457]:
-  _59 = _47 + 1;
+  <bb 7> [local count: 536870913]:
+  # RANGE [3, 4] NONZERO 7
+  _48 = _47 + 1;

   <bb 8> [local count: 1073741824]:
...
I mean the _53, prephitmp_54 and _48 ranges above in the + lines (i.e. =1).
Early during optimizations we have the usual short-circuit vs.
non-short-circuit differences like:
-  # iftmp.0_52 = PHI <_51(3), 0(2)>
-  _49 ={v} unsigned_value_source;
-  if (_49 == 0)
-    goto <bb 7>; [50.00%]
+  # iftmp.0_58 = PHI <0(2), _57(3)>
+  _52 ={v} unsigned_value_source;
+  _53 = _52 == 0;
+  _54 = _52 > 2;
+  _55 = _53 | _54;
+  if (_55 != 0)
+    goto <bb 6>; [50.00%]
   else
     goto <bb 5>; [50.00%]

   <bb 5> [local count: 536870913]:
-  if (_49 > 2)
-    goto <bb 7>; [50.00%]
-  else
-    goto <bb 6>; [50.00%]
-
-  <bb 6> [local count: 268435456]:

-  <bb 7> [local count: 1073741824]:
-  # iftmp.0_50 = PHI <1(4), 1(5), _49(6)>
+  <bb 6> [local count: 1073741824]:
+  # iftmp.0_56 = PHI <1(4), _52(5)>
but they gradually disappear.
Right before *.dom3 the IL is already pretty much the same when ignoring
SSA_NAME version differences,
except:
-  # prephitmp_54 = PHI <_55(3), 1(2)>
-  _49 ={v} unsigned_value_source;
-  _48 = _49 + 18446744073709551615;
-  _1 = _48 > 1;
-  if (_1 != 0)
+  # prephitmp_50 = PHI <1(2), _55(3)>
+  _52 ={v} unsigned_value_source;
+  _59 = _52 + 18446744073709551615;
+  if (_59 > 1)
and
   _47 ={v} unsigned_value_source;
-  _52 = _47 + 18446744073709551614;
-  _50 = _52 > 1;
-  if (_50 != 0)
+  _61 = _47 + 18446744073709551614;
+  if (_61 > 1)
i.e. the - version (=0) doesn't have the comparisons folded into GIMPLE_CONDs
while the + version (=1) does.
And I believe that is the trigger on why during dom3 adds the more precise
ranges in the --param=logical-op-non-short-circuit=1 case and not in the
--param=logical-op-non-short-circuit=0 case.

Reply via email to