https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109462
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Under debugger (trunk) what I see is that the block_result.intersect
(equiv_range)
in the code added by r13-1938 is only true in the VisitObjCMessageExpr function
twice, each time on the
# Result$16_552 = PHI <Result$16_670(144), Result$16_453(D)(138)>
SSA_NAME, on the
<bb 120> [local count: 251634481]:
if (p_count_732 == 1)
goto <bb 124>; [5.50%]
else
goto <bb 121>; [94.50%]
block (i.e. one guarded with _143 == 22 condition),
which has originally VARYING block_result, but equiv_name is strangely
_143 set by
_143 = I.Kind;
earlier. Obviously the range for _143 in that bb is [22, 22], that is correct,
what isn't correct is that it would be equivalent to Result$16_552.
The IL of the loop is:
<bb 139> [local count: 740101405]:
_143 = I.Kind;
if (_143 == 21)
goto <bb 140>; [34.00%]
else
goto <bb 141>; [66.00%]
<bb 140> [local count: 251634481]:
# RANGE [irange] int [-2147483647, +INF]
p_count_87 = p_count_732 + 1;
goto <bb 144>; [100.00%]
<bb 141> [local count: 488466924]:
if (_143 == 22)
goto <bb 142>; [70.13%]
else
goto <bb 144>; [29.87%]
<bb 142> [local count: 251634481]:
if (p_count_732 == 1)
goto <bb 147>; [5.50%]
else
goto <bb 143>; [94.50%]
<bb 143> [local count: 237794584]:
# RANGE [irange] int [-INF, -1][1, 2147483646]
p_count_88 = p_count_732 + -1;
<bb 144> [local count: 726261510]:
# p_count_45 = PHI <p_count_732(141), p_count_88(143), p_count_87(140)>
MEM <unsigned char[20]> [(struct Token *)&Result] = MEM <unsigned char[20]>
[(struct Token *)&I];
Result$UintData_449 = MEM <const UIntTy> [(struct Token *)&I + 4B];
Result$PtrData_172 = MEM <void * const> [(struct Token *)&I + 8B];
Result$16_670 = MEM <unsigned short> [(struct Token *)&I + 16B];
_439 = TheLexer.D.700857.LexingRawMode;
if (_439 != 0)
goto <bb 146>; [99.96%]
else
goto <bb 145>; [0.04%]
<bb 145> [local count: 313395]:
# USE = nonlocal escaped
# CLB = nonlocal escaped
__assert_fail ("LexingRawMode && \"Not already in raw mode!\"",
"/usr/src/llvm-project/clang/include/clang/Lex/Lexer.h", 237, "bool
clang::Lexer::LexFromRawLexer(clang::Token&)");
<bb 146> [local count: 783176091]:
# p_count_732 = PHI <p_count_45(144), 0(138)>
# Result$UintData_591 = PHI <Result$UintData_449(144),
Result$UintData_445(D)(138)>
# Result$PtrData_270 = PHI <Result$PtrData_172(144),
Result$PtrData_443(D)(138)>
# Result$16_552 = PHI <Result$16_670(144), Result$16_453(D)(138)>
# USE = nonlocal escaped { D.1224204 D.1224214 } (escaped)
# CLB = nonlocal escaped { D.1224204 D.1224214 } (escaped)
clang::Lexer::Lex (&TheLexer, &I);
# PT = nonlocal escaped null { D.1224204 D.1224214 } (escaped)
_440 = TheLexer.BufferPtr;
# PT = nonlocal escaped null { D.1224204 D.1224214 } (escaped)
_441 = TheLexer.BufferEnd;
if (_440 == _441)
goto <bb 147>; [5.50%]
else
goto <bb 139>; [94.50%]
with bb 146 the loop header (before dom2), so I believe Result$16_552 is never
equivalent to _143, it is equivalent to _143 from previous loop's iteration,
not the current one.