Skip to content

Commit 6ef55f5

Browse files
committed
Remove unnecessary idiom recognition assertions
There are uses of TR_ASSERT() in idiom recognition that check for cases that are not necessarily impossible and that are handled conservatively in builds where TR_ASSERT() is not checked. Assertions are not a good way to detect and report these cases, since assertion failure is not likely to be due to a bug. This commit removes a number of these assertions. Now the conservative logic will apply in all builds. When it does, a static debug counter will be incremented, and (when tracing idiom recognition) a message will be printed to the log. Anyone who wants to look for transformations that have been prevented due to incomplete support for a particular case can use the new static debug counters. Additionally, use dumpOptDetails() to trace when a transformer fails. In that case it's misleading to leave the log showing only the message from performTransformation().
1 parent 6cd262d commit 6ef55f5

File tree

3 files changed

+128
-35
lines changed

3 files changed

+128
-35
lines changed

runtime/compiler/optimizer/IdiomRecognition.cpp

+52-7
Original file line numberDiff line numberDiff line change
@@ -1945,7 +1945,8 @@ TR_CISCTransformer::TR_CISCTransformer(TR::OptimizationManager *manager)
19451945
_bblistSucc(manager->trMemory()),
19461946
_candidatesForRegister(manager->trMemory()),
19471947
_useTreeTopMap(manager->comp(), manager->optimizer()),
1948-
_BitsKeepAliveList(manager->trMemory())
1948+
_BitsKeepAliveList(manager->trMemory()),
1949+
_countFailBuf(manager->trMemory()->currentStackRegion())
19491950
{
19501951
_afterInsertionsIdiom = (ListHeadAndTail<TR::Node> *) trMemory()->allocateHeapMemory(sizeof(ListHeadAndTail<TR::Node>)*2);
19511952
memset(_afterInsertionsIdiom, 0, sizeof(ListHeadAndTail<TR::Node>)*2);
@@ -6689,8 +6690,8 @@ TR_CISCTransformer::analyzeBoolTable(TR_BitVector **bv, TR::TreeTop **retSameExi
66896690
ntakenBV -= tmpBV;
66906691
break;
66916692
default:
6692-
TR_ASSERT(false, "not implemented yet");
66936693
// not implemented yet
6694+
countUnhandledOpcode(__FUNCTION__, n->getOpcode());
66946695
return false;
66956696
}
66966697

@@ -6814,7 +6815,8 @@ TR_CISCTransformer::analyzeByteBoolTable(TR_CISCNode *boolTable, uint8_t *table2
68146815
bv = (TR_BitVector **)trMemory()->allocateMemory(size, stackAlloc);
68156816
memset(bv, 0, size);
68166817

6817-
switch((defTargetNode ? defTargetNode : defNode)->getOpcode())
6818+
uint32_t opcode = (defTargetNode ? defTargetNode : defNode)->getOpcode();
6819+
switch (opcode)
68186820
{
68196821
case TR::b2i:
68206822
if (defNode->isOptionalNode()) defNode = defNode->getChild(0);
@@ -6826,8 +6828,8 @@ TR_CISCTransformer::analyzeByteBoolTable(TR_CISCNode *boolTable, uint8_t *table2
68266828
defBV.setAll( 0+BYTEBVOFFSET, 255+BYTEBVOFFSET);
68276829
break;
68286830
default:
6829-
TR_ASSERT(false, "not implemented yet");
68306831
// not implemented yet
6832+
countUnhandledOpcode(__FUNCTION__, opcode);
68316833
return -1; // error
68326834
}
68336835

@@ -6903,7 +6905,8 @@ TR_CISCTransformer::analyzeCharBoolTable(TR_CISCNode *boolTable, uint8_t *table6
69036905
bv = (TR_BitVector **)trMemory()->allocateMemory(size, stackAlloc);
69046906
memset(bv, 0, size);
69056907

6906-
switch((defTargetNode ? defTargetNode : defNode)->getOpcode())
6908+
uint32_t opcode = (defTargetNode ? defTargetNode : defNode)->getOpcode();
6909+
switch (opcode)
69076910
{
69086911
case TR::su2i:
69096912
if (defNode->isOptionalNode()) defNode = defNode->getChild(0);
@@ -6912,8 +6915,8 @@ TR_CISCTransformer::analyzeCharBoolTable(TR_CISCNode *boolTable, uint8_t *table6
69126915
defBV.setAll(0, 65535);
69136916
break;
69146917
default:
6915-
TR_ASSERT(false, "not implemented yet");
69166918
// not implemented yet
6919+
countUnhandledOpcode(__FUNCTION__, opcode);
69176920
return -1; // error
69186921
}
69196922

@@ -7650,7 +7653,7 @@ TR_CISCTransformer::computeTopologicalEmbedding(TR_CISCGraph *P, TR_CISCGraph *T
76507653
if (performTransformation(comp(), "%sReducing loop %d to %s\n", OPT_DETAILS, _bblistBody.getListHead()->getData()->getNumber(),
76517654
P->getTitle()) && !transformer(this))
76527655
{
7653-
if (trace()) traceMsg(comp(), "computeTopologicalEmbedding: IL Transformer failed. (step 4)\n\n");
7656+
dumpOptDetails(comp(), "computeTopologicalEmbedding: IL Transformer failed. (step 4)\n\n");
76547657
registerCandidates();
76557658
_T->restoreListsDuplicator();
76567659
return false; // The transformation fails
@@ -7915,3 +7918,45 @@ TR_CISCTransformer::restoreBitsKeepAliveCalls()
79157918
prev->insertAfter(tt);
79167919
}
79177920
}
7921+
7922+
void
7923+
TR_CISCTransformer::countFail(const char *fmt, ...)
7924+
{
7925+
_countFailBuf.clear();
7926+
7927+
va_list args;
7928+
va_start(args, fmt);
7929+
_countFailBuf.vappendf(fmt, args);
7930+
va_end(args);
7931+
7932+
// This isn't the best trace message, but it signals that something happened
7933+
// in the log even when the debug counters aren't enabled, and it avoids
7934+
// making call sites too cumbersome.
7935+
if (trace())
7936+
traceMsg(comp(), "failed: %s\n", _countFailBuf.text());
7937+
7938+
TR::DebugCounter::incStaticDebugCounter(
7939+
comp(),
7940+
TR::DebugCounter::debugCounterName(
7941+
comp(),
7942+
"idiomRecognition.failed/%s/%s/(%s)/%s/loop=%d",
7943+
_countFailBuf.text(),
7944+
_P->getTitle(),
7945+
comp()->signature(),
7946+
comp()->getHotnessName(comp()->getMethodHotness()),
7947+
_bblistBody.getListHead()->getData()->getNumber()));
7948+
}
7949+
7950+
void
7951+
TR_CISCTransformer::countUnhandledOpcode(const char *where, uint32_t opcode)
7952+
{
7953+
if (opcode < TR::NumAllIlOps)
7954+
{
7955+
const char *name = TR::ILOpCode((TR::ILOpCodes)opcode).getName();
7956+
countFail("%s/unhandledOpcode/%s", where, name);
7957+
}
7958+
else
7959+
{
7960+
countFail("%s/unhandledOpcode/%u", where, opcode);
7961+
}
7962+
}

runtime/compiler/optimizer/IdiomRecognition.hpp

+6
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "infra/HashTab.hpp"
3939
#include "infra/Link.hpp"
4040
#include "infra/List.hpp"
41+
#include "infra/String.hpp"
4142
#include "infra/TRlist.hpp"
4243
#include "optimizer/LoopCanonicalizer.hpp"
4344
#include "optimizer/OptimizationManager.hpp"
@@ -1469,6 +1470,9 @@ class TR_CISCTransformer : public TR_LoopTransformer
14691470
TR_RegionStructure *getCurrentLoop() { return _loopStructure; }
14701471
void setCurrentLoop(TR_RegionStructure *loop) { _loopStructure = loop; }
14711472

1473+
void countFail(const char *fmt, ...) TR_PRINTF_FORMAT_ATTR(2, 3);
1474+
void countUnhandledOpcode(const char *where, uint32_t opcode);
1475+
14721476
private:
14731477
List<TR::Block> _bblistPred;
14741478
List<TR::Block> _bblistBody;
@@ -1510,6 +1514,8 @@ class TR_CISCTransformer : public TR_LoopTransformer
15101514
uint8_t *_DE; // just for working
15111515
bool _isGenerateI2L;
15121516
bool _showMesssagesStdout;
1517+
1518+
TR::StringBuf _countFailBuf;
15131519
};
15141520

15151521
#endif

runtime/compiler/optimizer/IdiomTransformations.cpp

+70-28
Original file line numberDiff line numberDiff line change
@@ -2245,8 +2245,11 @@ CISCTransform2NestedArrayFindBytes(TR_CISCTransformer *trans)
22452245

22462246
TR_ASSERT(trans->getP()->getVersionLength() == 0, "Versioning code is not implemented yet");
22472247

2248-
TR_ASSERT(trans->isEmptyAfterInsertionIdiomList(0) && trans->isEmptyAfterInsertionIdiomList(1), "Not implemented yet!");
2249-
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1)) return false;
2248+
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1))
2249+
{
2250+
trans->countFail("%s/nonemptyAfterInsertionIdiomList", __FUNCTION__);
2251+
return false;
2252+
}
22502253

22512254
trans->findFirstNode(&trTreeTop, &trNode, &block);
22522255
if (!block) return false; // cannot find
@@ -3625,8 +3628,11 @@ CISCTransform2TROTArray(TR_CISCTransformer *trans)
36253628
List<TR_CISCNode> *P2T = trans->getP2T();
36263629
TR::Compilation *comp = trans->comp();
36273630

3628-
TR_ASSERT(trans->isEmptyAfterInsertionIdiomList(0) && trans->isEmptyAfterInsertionIdiomList(1), "Not implemented yet!");
3629-
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1)) return false;
3631+
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1))
3632+
{
3633+
trans->countFail("%s/nonemptyAfterInsertionIdiomList", __FUNCTION__);
3634+
return false;
3635+
}
36303636

36313637
trans->findFirstNode(&trTreeTop, &trNode, &block);
36323638
if (!block) return false; // cannot find
@@ -5035,8 +5041,11 @@ CISCTransform2TRTOArray(TR_CISCTransformer *trans)
50355041
List<TR_CISCNode> *P2T = trans->getP2T();
50365042
TR::Compilation *comp = trans->comp();
50375043

5038-
TR_ASSERT(trans->isEmptyAfterInsertionIdiomList(0) && trans->isEmptyAfterInsertionIdiomList(1), "Not implemented yet!");
5039-
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1)) return false;
5044+
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1))
5045+
{
5046+
trans->countFail("%s/nonemptyAfterInsertionIdiomList", __FUNCTION__);
5047+
return false;
5048+
}
50405049

50415050
trans->findFirstNode(&trTreeTop, &trNode, &block);
50425051
if (!block) return false; // cannot find
@@ -5832,8 +5841,11 @@ CISCTransform2ArrayCopySub(TR_CISCTransformer *trans, TR::Node *indexRepNode, TR
58325841
bool isDecrement = trans->isMEMCPYDec();
58335842
const bool disptrace = DISPTRACE(trans);
58345843

5835-
TR_ASSERT(trans->isEmptyAfterInsertionIdiomList(0) && trans->isEmptyAfterInsertionIdiomList(1), "Not implemented yet!");
5836-
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1)) return false;
5844+
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1))
5845+
{
5846+
trans->countFail("%s/nonemptyAfterInsertionIdiomList", __FUNCTION__);
5847+
return false;
5848+
}
58375849

58385850
trans->findFirstNode(&trTreeTop, &trNode, &block);
58395851
if (!block) return false; // cannot find
@@ -6347,8 +6359,11 @@ CISCTransform2ArrayCopyB2CorC2B(TR_CISCTransformer *trans)
63476359

63486360
TR_ASSERT(trans->getP()->getVersionLength() == 0, "Versioning code is not implemented yet");
63496361

6350-
TR_ASSERT(trans->isEmptyAfterInsertionIdiomList(0) && trans->isEmptyAfterInsertionIdiomList(1), "Not implemented yet!");
6351-
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1)) return false;
6362+
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1))
6363+
{
6364+
trans->countFail("%s/nonemptyAfterInsertionIdiomList", __FUNCTION__);
6365+
return false;
6366+
}
63526367

63536368
trans->findFirstNode(&trTreeTop, &trNode, &block);
63546369
if (!block) return false; // cannot find
@@ -6703,8 +6718,11 @@ CISCTransform2ArrayCopyB2CBndchk(TR_CISCTransformer *trans)
67036718
List<TR_CISCNode> *P2T = trans->getP2T();
67046719
TR::Compilation *comp = trans->comp();
67056720

6706-
TR_ASSERT(trans->isEmptyAfterInsertionIdiomList(0) && trans->isEmptyAfterInsertionIdiomList(1), "Not implemented yet!");
6707-
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1)) return false;
6721+
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1))
6722+
{
6723+
trans->countFail("%s/nonemptyAfterInsertionIdiomList", __FUNCTION__);
6724+
return false;
6725+
}
67086726

67096727
trans->findFirstNode(&trTreeTop, &trNode, &block);
67106728
if (!block) return false; // cannot find
@@ -6919,8 +6937,11 @@ CISCTransform2ArrayCopyC2BMixed(TR_CISCTransformer *trans)
69196937
List<TR_CISCNode> *P2T = trans->getP2T();
69206938
TR::Compilation *comp = trans->comp();
69216939

6922-
TR_ASSERT(trans->isEmptyAfterInsertionIdiomList(0) && trans->isEmptyAfterInsertionIdiomList(1), "Not implemented yet!");
6923-
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1)) return false;
6940+
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1))
6941+
{
6942+
trans->countFail("%s/nonemptyAfterInsertionIdiomList", __FUNCTION__);
6943+
return false;
6944+
}
69246945

69256946
trans->findFirstNode(&trTreeTop, &trNode, &block);
69266947
if (!block) return false; // cannot find
@@ -7249,8 +7270,11 @@ CISCTransform2ArrayCopyC2BIf2(TR_CISCTransformer *trans)
72497270

72507271
TR_ASSERT(trans->getP()->getVersionLength() == 0, "Versioning code is not implemented yet");
72517272

7252-
TR_ASSERT(trans->isEmptyAfterInsertionIdiomList(0) && trans->isEmptyAfterInsertionIdiomList(1), "Not implemented yet!");
7253-
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1)) return false;
7273+
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1))
7274+
{
7275+
trans->countFail("%s/nonemptyAfterInsertionIdiomList", __FUNCTION__);
7276+
return false;
7277+
}
72547278

72557279
trans->findFirstNode(&trTreeTop, &trNode, &block);
72567280
if (!block) return false; // cannot find
@@ -7533,8 +7557,11 @@ CISCTransform2ArrayCopyB2I(TR_CISCTransformer *trans)
75337557

75347558
TR_ASSERT(trans->getP()->getVersionLength() == 0, "Versioning code is not implemented yet");
75357559

7536-
TR_ASSERT(trans->isEmptyAfterInsertionIdiomList(0) && trans->isEmptyAfterInsertionIdiomList(1), "Not implemented yet!");
7537-
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1)) return false;
7560+
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1))
7561+
{
7562+
trans->countFail("%s/nonemptyAfterInsertionIdiomList", __FUNCTION__);
7563+
return false;
7564+
}
75387565

75397566
trans->findFirstNode(&trTreeTop, &trNode, &block);
75407567
if (!block) return false; // cannot find
@@ -8010,8 +8037,11 @@ CISCTransform2ArraySet(TR_CISCTransformer *trans)
80108037
TR::Compilation *comp = trans->comp();
80118038
bool ctrl = trans->isGenerateI2L();
80128039

8013-
TR_ASSERT(trans->isEmptyAfterInsertionIdiomList(0) && trans->isEmptyAfterInsertionIdiomList(1), "Not implemented yet!");
8014-
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1)) return false;
8040+
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1))
8041+
{
8042+
trans->countFail("%s/nonemptyAfterInsertionIdiomList", __FUNCTION__);
8043+
return false;
8044+
}
80158045

80168046
trans->findFirstNode(&trTreeTop, &trNode, &block);
80178047
if (!block) return false; // cannot find
@@ -8678,8 +8708,11 @@ CISCTransform2MixedArraySet(TR_CISCTransformer *trans)
86788708

86798709
TR_ASSERT(trans->getP()->getVersionLength() == 0, "Versioning code is not implemented yet");
86808710

8681-
TR_ASSERT(trans->isEmptyAfterInsertionIdiomList(0) && trans->isEmptyAfterInsertionIdiomList(1), "Not implemented yet!");
8682-
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1)) return false;
8711+
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1))
8712+
{
8713+
trans->countFail("%s/nonemptyAfterInsertionIdiomList", __FUNCTION__);
8714+
return false;
8715+
}
86838716

86848717
trans->findFirstNode(&trTreeTop, &trNode, &block);
86858718
if (!block) return false; // cannot find
@@ -10270,8 +10303,11 @@ CISCTransform2BitOpMem(TR_CISCTransformer *trans)
1027010303
TR::Compilation *comp = trans->comp();
1027110304
bool ctrl = trans->isGenerateI2L();
1027210305

10273-
TR_ASSERT(trans->isEmptyAfterInsertionIdiomList(0) && trans->isEmptyAfterInsertionIdiomList(1), "Not implemented yet!");
10274-
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1)) return false;
10306+
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1))
10307+
{
10308+
trans->countFail("%s/nonemptyAfterInsertionIdiomList", __FUNCTION__);
10309+
return false;
10310+
}
1027510311

1027610312
trans->findFirstNode(&trTreeTop, &trNode, &block);
1027710313
if (!block) return false; // cannot find
@@ -10805,8 +10841,11 @@ CISCTransform2CountDecimalDigit(TR_CISCTransformer *trans)
1080510841

1080610842
TR_ASSERT(trans->getP()->getVersionLength() == 0, "Versioning code is not implemented yet");
1080710843

10808-
TR_ASSERT(trans->isEmptyAfterInsertionIdiomList(0) && trans->isEmptyAfterInsertionIdiomList(1), "Not implemented yet!");
10809-
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1)) return false;
10844+
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1))
10845+
{
10846+
trans->countFail("%s/nonemptyAfterInsertionIdiomList", __FUNCTION__);
10847+
return false;
10848+
}
1081010849

1081110850
trans->findFirstNode(&trTreeTop, &trNode, &block);
1081210851
if (!block) return false; // cannot find
@@ -11114,8 +11153,11 @@ CISCTransform2LongToStringDigit(TR_CISCTransformer *trans)
1111411153

1111511154
TR_ASSERT(trans->getP()->getVersionLength() == 0, "Versioning code is not implemented yet");
1111611155

11117-
TR_ASSERT(trans->isEmptyAfterInsertionIdiomList(0) && trans->isEmptyAfterInsertionIdiomList(1), "Not implemented yet!");
11118-
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1)) return false;
11156+
if (!trans->isEmptyAfterInsertionIdiomList(0) || !trans->isEmptyAfterInsertionIdiomList(1))
11157+
{
11158+
trans->countFail("%s/nonemptyAfterInsertionIdiomList", __FUNCTION__);
11159+
return false;
11160+
}
1111911161

1112011162
trans->findFirstNode(&trTreeTop, &trNode, &block);
1112111163
if (!block) return false; // cannot find

0 commit comments

Comments
 (0)