Skip to content

Commit df83b34

Browse files
committed
[HashRecognize] Forbid optz when data.next has exit-block user
The CRC optimization relies on stripping the auxiliary data completely, and should hence be forbidden when it has a user in the exit-block. Forbid this case, fixing a miscompile. Fixes #165382.
1 parent 3b13bba commit df83b34

File tree

3 files changed

+21
-39
lines changed

3 files changed

+21
-39
lines changed

llvm/lib/Analysis/HashRecognize.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,14 @@ std::variant<PolynomialInfo, StringRef> HashRecognize::recognizeCRC() const {
487487
: LHS->getType()->getIntegerBitWidth()))
488488
return "Loop iterations exceed bitwidth of data";
489489

490+
// Make sure that the simple recurrence evolution isn't used in the exit
491+
// block.
492+
if (SimpleRecurrence && any_of(SimpleRecurrence.BO->users(), [Exit](User *U) {
493+
auto *UI = dyn_cast<Instruction>(U);
494+
return UI && UI->getParent() == Exit;
495+
}))
496+
return "Recurrences have stray uses";
497+
490498
// Make sure that the computed value is used in the exit block: this should be
491499
// true even if it is only really used in an outer loop's exit block, since
492500
// the loop is in LCSSA form.

llvm/test/Analysis/HashRecognize/cyclic-redundancy-check.ll

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,28 +1450,8 @@ exit: ; preds = %loop
14501450

14511451
define i16 @not.crc.data.next.outside.user(i16 %crc.init, i16 %data.init) {
14521452
; CHECK-LABEL: 'not.crc.data.next.outside.user'
1453-
; CHECK-NEXT: Found big-endian CRC-16 loop with trip count 8
1454-
; CHECK-NEXT: Initial CRC: i16 %crc.init
1455-
; CHECK-NEXT: Generating polynomial: 3
1456-
; CHECK-NEXT: Computed CRC: %crc.next = select i1 %check.sb, i16 %crc.xor, i16 %crc.shl
1457-
; CHECK-NEXT: Auxiliary data: i16 %data.init
1458-
; CHECK-NEXT: Computed CRC lookup table:
1459-
; CHECK-NEXT: 0 3 6 5 12 15 10 9 24 27 30 29 20 23 18 17
1460-
; CHECK-NEXT: 48 51 54 53 60 63 58 57 40 43 46 45 36 39 34 33
1461-
; CHECK-NEXT: 96 99 102 101 108 111 106 105 120 123 126 125 116 119 114 113
1462-
; CHECK-NEXT: 80 83 86 85 92 95 90 89 72 75 78 77 68 71 66 65
1463-
; CHECK-NEXT: 192 195 198 197 204 207 202 201 216 219 222 221 212 215 210 209
1464-
; CHECK-NEXT: 240 243 246 245 252 255 250 249 232 235 238 237 228 231 226 225
1465-
; CHECK-NEXT: 160 163 166 165 172 175 170 169 184 187 190 189 180 183 178 177
1466-
; CHECK-NEXT: 144 147 150 149 156 159 154 153 136 139 142 141 132 135 130 129
1467-
; CHECK-NEXT: 384 387 390 389 396 399 394 393 408 411 414 413 404 407 402 401
1468-
; CHECK-NEXT: 432 435 438 437 444 447 442 441 424 427 430 429 420 423 418 417
1469-
; CHECK-NEXT: 480 483 486 485 492 495 490 489 504 507 510 509 500 503 498 497
1470-
; CHECK-NEXT: 464 467 470 469 476 479 474 473 456 459 462 461 452 455 450 449
1471-
; CHECK-NEXT: 320 323 326 325 332 335 330 329 344 347 350 349 340 343 338 337
1472-
; CHECK-NEXT: 368 371 374 373 380 383 378 377 360 363 366 365 356 359 354 353
1473-
; CHECK-NEXT: 288 291 294 293 300 303 298 297 312 315 318 317 308 311 306 305
1474-
; CHECK-NEXT: 272 275 278 277 284 287 282 281 264 267 270 269 260 263 258 257
1453+
; CHECK-NEXT: Did not find a hash algorithm
1454+
; CHECK-NEXT: Reason: Recurrences have stray uses
14751455
;
14761456
entry:
14771457
br label %loop

llvm/test/Transforms/LoopIdiom/cyclic-redundancy-check.ll

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
; CHECK: @.crctable.6 = private constant [256 x i16] [i16 0, i16 4129, i16 8258, i16 12387, i16 16516, i16 20645, i16 24774, i16 28903, i16 -32504, i16 -28375, i16 -24246, i16 -20117, i16 -15988, i16 -11859, i16 -7730, i16 -3601, i16 4657, i16 528, i16 12915, i16 8786, i16 21173, i16 17044, i16 29431, i16 25302, i16 -27847, i16 -31976, i16 -19589, i16 -23718, i16 -11331, i16 -15460, i16 -3073, i16 -7202, i16 9314, i16 13379, i16 1056, i16 5121, i16 25830, i16 29895, i16 17572, i16 21637, i16 -23190, i16 -19125, i16 -31448, i16 -27383, i16 -6674, i16 -2609, i16 -14932, i16 -10867, i16 13907, i16 9842, i16 5649, i16 1584, i16 30423, i16 26358, i16 22165, i16 18100, i16 -18597, i16 -22662, i16 -26855, i16 -30920, i16 -2081, i16 -6146, i16 -10339, i16 -14404, i16 18628, i16 22757, i16 26758, i16 30887, i16 2112, i16 6241, i16 10242, i16 14371, i16 -13876, i16 -9747, i16 -5746, i16 -1617, i16 -30392, i16 -26263, i16 -22262, i16 -18133, i16 23285, i16 19156, i16 31415, i16 27286, i16 6769, i16 2640, i16 14899, i16 10770, i16 -9219, i16 -13348, i16 -1089, i16 -5218, i16 -25735, i16 -29864, i16 -17605, i16 -21734, i16 27814, i16 31879, i16 19684, i16 23749, i16 11298, i16 15363, i16 3168, i16 7233, i16 -4690, i16 -625, i16 -12820, i16 -8755, i16 -21206, i16 -17141, i16 -29336, i16 -25271, i16 32407, i16 28342, i16 24277, i16 20212, i16 15891, i16 11826, i16 7761, i16 3696, i16 -97, i16 -4162, i16 -8227, i16 -12292, i16 -16613, i16 -20678, i16 -24743, i16 -28808, i16 -28280, i16 -32343, i16 -20022, i16 -24085, i16 -12020, i16 -16083, i16 -3762, i16 -7825, i16 4224, i16 161, i16 12482, i16 8419, i16 20484, i16 16421, i16 28742, i16 24679, i16 -31815, i16 -27752, i16 -23557, i16 -19494, i16 -15555, i16 -11492, i16 -7297, i16 -3234, i16 689, i16 4752, i16 8947, i16 13010, i16 16949, i16 21012, i16 25207, i16 29270, i16 -18966, i16 -23093, i16 -27224, i16 -31351, i16 -2706, i16 -6833, i16 -10964, i16 -15091, i16 13538, i16 9411, i16 5280, i16 1153, i16 29798, i16 25671, i16 21540, i16 17413, i16 -22565, i16 -18438, i16 -30823, i16 -26696, i16 -6305, i16 -2178, i16 -14563, i16 -10436, i16 9939, i16 14066, i16 1681, i16 5808, i16 26199, i16 30326, i16 17941, i16 22068, i16 -9908, i16 -13971, i16 -1778, i16 -5841, i16 -26168, i16 -30231, i16 -18038, i16 -22101, i16 22596, i16 18533, i16 30726, i16 26663, i16 6336, i16 2273, i16 14466, i16 10403, i16 -13443, i16 -9380, i16 -5313, i16 -1250, i16 -29703, i16 -25640, i16 -21573, i16 -17510, i16 19061, i16 23124, i16 27191, i16 31254, i16 2801, i16 6864, i16 10931, i16 14994, i16 -722, i16 -4849, i16 -8852, i16 -12979, i16 -16982, i16 -21109, i16 -25112, i16 -29239, i16 31782, i16 27655, i16 23652, i16 19525, i16 15522, i16 11395, i16 7392, i16 3265, i16 -4321, i16 -194, i16 -12451, i16 -8324, i16 -20581, i16 -16454, i16 -28711, i16 -24584, i16 28183, i16 32310, i16 20053, i16 24180, i16 11923, i16 16050, i16 3793, i16 7920]
1212
; CHECK: @.crctable.7 = private constant [256 x i8] c"\00\1D:'tiNS\E8\F5\D2\CF\9C\81\A6\BB\CD\D0\F7\EA\B9\A4\83\9E%8\1F\02QLkv\87\9A\BD\A0\F3\EE\C9\D4orUH\1B\06!<JWpm>#\04\19\A2\BF\98\85\D6\CB\EC\F1\13\0E)4gz]@\FB\E6\C1\DC\8F\92\B5\A8\DE\C3\E4\F9\AA\B7\90\8D6+\0C\11B_xe\94\89\AE\B3\E0\FD\DA\C7|aF[\08\152/YDc~-0\17\0A\B1\AC\8B\96\C5\D8\FF\E2&
1313
; CHECK: @.crctable.8 = private constant [256 x i32] [i32 0, i32 4489, i32 8978, i32 12955, i32 17956, i32 22445, i32 25910, i32 29887, i32 35912, i32 40385, i32 44890, i32 48851, i32 51820, i32 56293, i32 59774, i32 63735, i32 4225, i32 264, i32 13203, i32 8730, i32 22181, i32 18220, i32 30135, i32 25662, i32 40137, i32 36160, i32 49115, i32 44626, i32 56045, i32 52068, i32 63999, i32 59510, i32 8450, i32 12427, i32 528, i32 5017, i32 26406, i32 30383, i32 17460, i32 21949, i32 44362, i32 48323, i32 36440, i32 40913, i32 60270, i32 64231, i32 51324, i32 55797, i32 12675, i32 8202, i32 4753, i32 792, i32 30631, i32 26158, i32 21685, i32 17724, i32 48587, i32 44098, i32 40665, i32 36688, i32 64495, i32 60006, i32 55549, i32 51572, i32 16900, i32 21389, i32 24854, i32 28831, i32 1056, i32 5545, i32 10034, i32 14011, i32 52812, i32 57285, i32 60766, i32 64727, i32 34920, i32 39393, i32 43898, i32 47859, i32 21125, i32 17164, i32 29079, i32 24606, i32 5281, i32 1320, i32 14259, i32 9786, i32 57037, i32 53060, i32 64991, i32 60502, i32 39145, i32 35168, i32 48123, i32 43634, i32 25350, i32 29327, i32 16404, i32 20893, i32 9506, i32 13483, i32 1584, i32 6073, i32 61262, i32 65223, i32 52316, i32 56789, i32 43370, i32 47331, i32 35448, i32 39921, i32 29575, i32 25102, i32 20629, i32 16668, i32 13731, i32 9258, i32 5809, i32 1848, i32 65487, i32 60998, i32 56541, i32 52564, i32 47595, i32 43106, i32 39673, i32 35696, i32 33800, i32 38273, i32 42778, i32 46739, i32 49708, i32 54181, i32 57662, i32 61623, i32 2112, i32 6601, i32 11090, i32 15067, i32 20068, i32 24557, i32 28022, i32 31999, i32 38025, i32 34048, i32 47003, i32 42514, i32 53933, i32 49956, i32 61887, i32 57398, i32 6337, i32 2376, i32 15315, i32 10842, i32 24293, i32 20332, i32 32247, i32 27774, i32 42250, i32 46211, i32 34328, i32 38801, i32 58158, i32 62119, i32 49212, i32 53685, i32 10562, i32 14539, i32 2640, i32 7129, i32 28518, i32 32495, i32 19572, i32 24061, i32 46475, i32 41986, i32 38553, i32 34576, i32 62383, i32 57894, i32 53437, i32 49460, i32 14787, i32 10314, i32 6865, i32 2904, i32 32743, i32 28270, i32 23797, i32 19836, i32 50700, i32 55173, i32 58654, i32 62615, i32 32808, i32 37281, i32 41786, i32 45747, i32 19012, i32 23501, i32 26966, i32 30943, i32 3168, i32 7657, i32 12146, i32 16123, i32 54925, i32 50948, i32 62879, i32 58390, i32 37033, i32 33056, i32 46011, i32 41522, i32 23237, i32 19276, i32 31191, i32 26718, i32 7393, i32 3432, i32 16371, i32 11898, i32 59150, i32 63111, i32 50204, i32 54677, i32 41258, i32 45219, i32 33336, i32 37809, i32 27462, i32 31439, i32 18516, i32 23005, i32 11618, i32 15595, i32 3696, i32 8185, i32 63375, i32 58886, i32 54429, i32 50452, i32 45483, i32 40994, i32 37561, i32 33584, i32 31687, i32 27214, i32 22741, i32 18780, i32 15843, i32 11370, i32 7921, i32 3960]
14-
; CHECK: @.crctable.9 = private constant [256 x i16] [i16 0, i16 3, i16 6, i16 5, i16 12, i16 15, i16 10, i16 9, i16 24, i16 27, i16 30, i16 29, i16 20, i16 23, i16 18, i16 17, i16 48, i16 51, i16 54, i16 53, i16 60, i16 63, i16 58, i16 57, i16 40, i16 43, i16 46, i16 45, i16 36, i16 39, i16 34, i16 33, i16 96, i16 99, i16 102, i16 101, i16 108, i16 111, i16 106, i16 105, i16 120, i16 123, i16 126, i16 125, i16 116, i16 119, i16 114, i16 113, i16 80, i16 83, i16 86, i16 85, i16 92, i16 95, i16 90, i16 89, i16 72, i16 75, i16 78, i16 77, i16 68, i16 71, i16 66, i16 65, i16 192, i16 195, i16 198, i16 197, i16 204, i16 207, i16 202, i16 201, i16 216, i16 219, i16 222, i16 221, i16 212, i16 215, i16 210, i16 209, i16 240, i16 243, i16 246, i16 245, i16 252, i16 255, i16 250, i16 249, i16 232, i16 235, i16 238, i16 237, i16 228, i16 231, i16 226, i16 225, i16 160, i16 163, i16 166, i16 165, i16 172, i16 175, i16 170, i16 169, i16 184, i16 187, i16 190, i16 189, i16 180, i16 183, i16 178, i16 177, i16 144, i16 147, i16 150, i16 149, i16 156, i16 159, i16 154, i16 153, i16 136, i16 139, i16 142, i16 141, i16 132, i16 135, i16 130, i16 129, i16 384, i16 387, i16 390, i16 389, i16 396, i16 399, i16 394, i16 393, i16 408, i16 411, i16 414, i16 413, i16 404, i16 407, i16 402, i16 401, i16 432, i16 435, i16 438, i16 437, i16 444, i16 447, i16 442, i16 441, i16 424, i16 427, i16 430, i16 429, i16 420, i16 423, i16 418, i16 417, i16 480, i16 483, i16 486, i16 485, i16 492, i16 495, i16 490, i16 489, i16 504, i16 507, i16 510, i16 509, i16 500, i16 503, i16 498, i16 497, i16 464, i16 467, i16 470, i16 469, i16 476, i16 479, i16 474, i16 473, i16 456, i16 459, i16 462, i16 461, i16 452, i16 455, i16 450, i16 449, i16 320, i16 323, i16 326, i16 325, i16 332, i16 335, i16 330, i16 329, i16 344, i16 347, i16 350, i16 349, i16 340, i16 343, i16 338, i16 337, i16 368, i16 371, i16 374, i16 373, i16 380, i16 383, i16 378, i16 377, i16 360, i16 363, i16 366, i16 365, i16 356, i16 359, i16 354, i16 353, i16 288, i16 291, i16 294, i16 293, i16 300, i16 303, i16 298, i16 297, i16 312, i16 315, i16 318, i16 317, i16 308, i16 311, i16 306, i16 305, i16 272, i16 275, i16 278, i16 277, i16 284, i16 287, i16 282, i16 281, i16 264, i16 267, i16 270, i16 269, i16 260, i16 263, i16 258, i16 257]
1514
;.
1615
define i16 @crc16.le.tc8(i8 %msg, i16 %checksum) {
1716
; CHECK-LABEL: define i16 @crc16.le.tc8(
@@ -546,24 +545,19 @@ define i16 @not.crc.data.next.outside.user(i16 %crc.init, i16 %data.init) {
546545
; CHECK-NEXT: br label %[[LOOP:.*]]
547546
; CHECK: [[LOOP]]:
548547
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
549-
; CHECK-NEXT: [[CRC2:%.*]] = phi i16 [ [[CRC_INIT]], %[[ENTRY]] ], [ [[CRC_NEXT3:%.*]], %[[LOOP]] ]
550-
; CHECK-NEXT: [[IV_BITS:%.*]] = shl i32 [[IV]], 3
551-
; CHECK-NEXT: [[IV_INDEXER:%.*]] = trunc i32 [[IV_BITS]] to i16
552-
; CHECK-NEXT: [[DATA_INDEXER:%.*]] = shl i16 [[DATA_INIT]], [[IV_INDEXER]]
553-
; CHECK-NEXT: [[CRC_DATA_INDEXER:%.*]] = xor i16 [[DATA_INDEXER]], [[CRC2]]
554-
; CHECK-NEXT: [[INDEXER_HI:%.*]] = lshr i16 [[CRC_DATA_INDEXER]], 8
555-
; CHECK-NEXT: [[INDEXER_HI_LO_BYTE:%.*]] = trunc i16 [[INDEXER_HI]] to i8
556-
; CHECK-NEXT: [[INDEXER_EXT:%.*]] = zext i8 [[INDEXER_HI_LO_BYTE]] to i64
557-
; CHECK-NEXT: [[TBL_PTRADD:%.*]] = getelementptr inbounds i16, ptr @.crctable.9, i64 [[INDEXER_EXT]]
558-
; CHECK-NEXT: [[TBL_LD:%.*]] = load i16, ptr [[TBL_PTRADD]], align 2
559-
; CHECK-NEXT: [[CRC_BE_SHIFT:%.*]] = shl i16 [[CRC2]], 8
560-
; CHECK-NEXT: [[CRC_NEXT3]] = xor i16 [[CRC_BE_SHIFT]], [[TBL_LD]]
561-
; CHECK-NEXT: [[DATA_NEXT:%.*]] = shl i16 poison, 1
548+
; CHECK-NEXT: [[TBL_LD:%.*]] = phi i16 [ [[CRC_INIT]], %[[ENTRY]] ], [ [[CRC_NEXT:%.*]], %[[LOOP]] ]
549+
; CHECK-NEXT: [[CRC_BE_SHIFT:%.*]] = phi i16 [ [[DATA_INIT]], %[[ENTRY]] ], [ [[DATA_NEXT:%.*]], %[[LOOP]] ]
550+
; CHECK-NEXT: [[CRC_NEXT3:%.*]] = xor i16 [[CRC_BE_SHIFT]], [[TBL_LD]]
551+
; CHECK-NEXT: [[CRC_SHL:%.*]] = shl i16 [[TBL_LD]], 1
552+
; CHECK-NEXT: [[CRC_XOR:%.*]] = xor i16 [[CRC_SHL]], 3
553+
; CHECK-NEXT: [[CHECK_SB:%.*]] = icmp slt i16 [[CRC_NEXT3]], 0
554+
; CHECK-NEXT: [[CRC_NEXT]] = select i1 [[CHECK_SB]], i16 [[CRC_XOR]], i16 [[CRC_SHL]]
555+
; CHECK-NEXT: [[DATA_NEXT]] = shl i16 [[CRC_BE_SHIFT]], 1
562556
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
563-
; CHECK-NEXT: [[EXIT_COND1:%.*]] = icmp ne i32 [[IV]], 0
564-
; CHECK-NEXT: br i1 [[EXIT_COND1]], label %[[LOOP]], label %[[EXIT:.*]]
557+
; CHECK-NEXT: [[EXIT_COND:%.*]] = icmp samesign ult i32 [[IV]], 7
558+
; CHECK-NEXT: br i1 [[EXIT_COND]], label %[[LOOP]], label %[[EXIT:.*]]
565559
; CHECK: [[EXIT]]:
566-
; CHECK-NEXT: [[CRC_NEXT_LCSSA:%.*]] = phi i16 [ [[CRC_NEXT3]], %[[LOOP]] ]
560+
; CHECK-NEXT: [[CRC_NEXT_LCSSA:%.*]] = phi i16 [ [[CRC_NEXT]], %[[LOOP]] ]
567561
; CHECK-NEXT: [[DATA_NEXT_LCSSA:%.*]] = phi i16 [ [[DATA_NEXT]], %[[LOOP]] ]
568562
; CHECK-NEXT: [[RET:%.*]] = xor i16 [[DATA_NEXT_LCSSA]], [[CRC_NEXT_LCSSA]]
569563
; CHECK-NEXT: ret i16 [[RET]]

0 commit comments

Comments
 (0)