[Bug tree-optimization/106126] [12 Regression] tree check fail in useless_type_conversion_p, at gimple-expr.cc:87 since r13-1184-g57424087e82db140

luoxhu at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Thu Jun 30 02:21:43 GMT 2022


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

--- Comment #11 from luoxhu at gcc dot gnu.org ---
Sorry for breaking, my bugzilla account is luoxhu@gcc.gnu.org.

The patch seems reasonable to fold 65-90 ('A'-'Z') to switch statement, 

4,6c4,6
< ;; Canonical GIMPLE case clusters: 33 60 62 126
< ;; BT can be built: BT(values:3 comparisons:6 range:30 density: 20.00%):33-62
126
< pr106126.c:3:28: optimized: Condition chain with 4 BBs transformed into a
switch statement.
---
> ;; Canonical GIMPLE case clusters: 33 60 62 65-90 126
> ;; BT can be built: BT(values:3 comparisons:6 range:30 density: 20.00%):33-62 65-90 126
> pr106126.c:3:28: optimized: Condition chain with 5 BBs transformed into a switch statement.

...

96,97c108,109
<   <bb 8> :
<   switch (_13) <default: <L11> [INV], case 33: <L10> [INV], case 60: <L10>
[INV], case 62: <L10> [INV], case 126: <L10> [INV]>
---
>   <bb 7> :
>   switch (_13) <default: <L13> [INV], case 33: <L10> [INV], case 60: <L10> [INV], case 62: <L10> [INV], case 65 ... 90: <L14> [INV], case 126: <L10> [INV]>




complete pr106126.bad.c.046t.iftoswitch:

;; Function pool_conda_matchspec (pool_conda_matchspec, funcdef_no=0,
decl_uid=1979, cgraph_uid=1, symbol_order=1)

;; Canonical GIMPLE case clusters: 33 60 62 65-90 126
;; BT can be built: BT(values:3 comparisons:6 range:30 density: 20.00%):33-62
65-90 126

pr106126.c:3:28: optimized: Condition chain with 5 BBs transformed into a
switch statement.
Removing basic block 9
;; basic block 9, loop depth 2
;;  pred:
if (_13 != 62)
  goto <bb 10>; [INV]
else
  goto <bb 12>; [INV]
;;  succ:       10
;;              12


Removing basic block 10
;; basic block 10, loop depth 2
;;  pred:
if (_13 != 33)
  goto <bb 11>; [INV]
else
  goto <bb 12>; [INV]
;;  succ:       11
;;              12


Removing basic block 11
;; basic block 11, loop depth 2
;;  pred:
if (_13 != 126)
  goto <bb 3>; [INV]
else
  goto <bb 12>; [INV]
;;  succ:       3
;;              12


Removing basic block 3
;; basic block 3, loop depth 2
;;  pred:
_3 = (unsigned char) _13;
_4 = _3 + 191;
if (_4 <= 25)
  goto <bb 14>; [INV]
else
  goto <bb 13>; [INV]
;;  succ:       14
;;              13


Expanded into a new gimple STMT: switch (_13) <default: <L12> [INV], case 33:
<L10> [INV], case 60: <L10> [INV], case 62: <L10> [INV], case 65 ... 90: <L11>
[INV], case 126: <L10> [INV]>

Removing basic block 13
;; basic block 13, loop depth 2
;;  pred:
<L12>:
goto <bb 6>; [100.00%]
;;  succ:       6


Removing basic block 14
;; basic block 14, loop depth 1
;;  pred:
<L11>:
;;  succ:       4


fix_loop_structure: fixing up loops for function
void pool_conda_matchspec ()
{
  unsigned char _8;
  char _10;
  char * var_1.3_11;
  char _13;
  unsigned char _14;
  char * var_1.3_15;

  <bb 2> :
  goto <bb 4>; [INV]

  <bb 3> :
  # _14 = PHI <_3(7)>
  # var_1.3_15 = PHI <var_1.3_11(7)>
<L14>:
  _8 = _14 + 65;
  _10 = (char) _8;
  *var_1.3_15 = _10;

  <bb 4> :

  <bb 5> :
<L13>:
  var_1.3_11 = var_1;
  if (var_1.3_11 != 0B)
    goto <bb 6>; [INV]
  else
    goto <bb 8>; [INV]

  <bb 6> :
  _13 = *var_1.3_11;
  if (_13 != 0)
    goto <bb 7>; [INV]
  else
    goto <bb 8>; [INV]

  <bb 7> :
  switch (_13) <default: <L13> [INV], case 33: <L10> [INV], case 60: <L10>
[INV], case 62: <L10> [INV], case 65 ... 90: <L14> [INV], case 126: <L10>
[INV]>

  <bb 8> :
<L10>:
  return;
  _8 = _14 + 65;
  _10 = (char) _8;
  *var_1.3_15 = _10;

  <bb 4> :

  <bb 5> :
<L13>:
  var_1.3_11 = var_1;
  if (var_1.3_11 != 0B)
    goto <bb 6>; [INV]
  else
    goto <bb 8>; [INV]

  <bb 6> :
  _13 = *var_1.3_11;
  if (_13 != 0)
    goto <bb 7>; [INV]
  else
    goto <bb 8>; [INV]

  <bb 7> :
  switch (_13) <default: <L13> [INV], case 33: <L10> [INV], case 60: <L10>
[INV], case 62: <L10> [INV], case 65 ... 90: <L14> [INV], case 126: <L10>
[INV]>

  <bb 8> :
<L10>:
  return;

}


The problem is _3 is removed in basic block 3, but _14 is still using it.


More information about the Gcc-bugs mailing list