[HashRecognize] Fix two more compiler hangs on dense use-def chains (#211887)
The bug in `digRecurrence` fixed by #211711 applies to `isConditionalOnXorOfPHIs` and `containsUnreachable` as well. Implement a fix for both using the same approach. - `isConditionalOnXorOfPHIs` hang: https://godbolt.org/z/jo8eMvoeY - `containsUnreachable` hang: https://godbolt.org/z/Eeo89W6qW Assisted-by: Claude Opus 5
This commit is contained in:
parent
07dfc602db
commit
a071010592
3 changed files with 423 additions and 172 deletions
|
|
@ -84,7 +84,9 @@ static bool containsUnreachable(const Loop &L,
|
|||
SmallVector<const Instruction *, 16> Worklist(Roots);
|
||||
while (!Worklist.empty()) {
|
||||
const Instruction *I = Worklist.pop_back_val();
|
||||
Visited.insert(I);
|
||||
// Skip this instruction if we have already visited it before.
|
||||
if (!Visited.insert(I).second)
|
||||
continue;
|
||||
|
||||
if (isa<PHINode>(I))
|
||||
continue;
|
||||
|
|
@ -462,6 +464,7 @@ HashRecognize::genBarrettConstants(const PolynomialInfo &Info) {
|
|||
static bool isConditionalOnXorOfPHIs(const SelectInst *SI, const PHINode *P1,
|
||||
const PHINode *P2, const Loop &L) {
|
||||
SmallVector<const Instruction *> Worklist;
|
||||
SmallPtrSet<const Instruction *, 16> Visited;
|
||||
|
||||
// matchConditionalRecurrence has already ensured that the SelectInst's
|
||||
// condition is an Instruction.
|
||||
|
|
@ -469,6 +472,9 @@ static bool isConditionalOnXorOfPHIs(const SelectInst *SI, const PHINode *P1,
|
|||
|
||||
while (!Worklist.empty()) {
|
||||
const Instruction *I = Worklist.pop_back_val();
|
||||
// Skip this instruction if we have already visited it before.
|
||||
if (!Visited.insert(I).second)
|
||||
continue;
|
||||
|
||||
// Don't add a PHI's operands to the Worklist.
|
||||
if (isa<PHINode>(I))
|
||||
|
|
|
|||
416
llvm/test/Analysis/HashRecognize/def-use-chains-visited.ll
Normal file
416
llvm/test/Analysis/HashRecognize/def-use-chains-visited.ll
Normal file
|
|
@ -0,0 +1,416 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
|
||||
; RUN: opt -passes='print<hash-recognize>' -disable-output %s 2>&1 | FileCheck %s
|
||||
|
||||
; This loop hangs if digRecurrence doesn't keep track of previously visited
|
||||
; instructions since most instructions have multiple uses.
|
||||
define float @digRecurrence_visited(float %a, float %b) {
|
||||
; CHECK-LABEL: 'digRecurrence_visited'
|
||||
; CHECK-NEXT: Did not find a hash algorithm
|
||||
; CHECK-NEXT: Reason: Unable to find conditional recurrence
|
||||
;
|
||||
entry:
|
||||
; %f must be the result of an instruction in order for digRecurrence to be
|
||||
; called from matchConditionalRecurrence.
|
||||
%f = fneg float %a
|
||||
br label %loop
|
||||
|
||||
loop:
|
||||
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
|
||||
%ind = phi float [ %b, %entry ], [ %ind.next, %loop ]
|
||||
%fcmp = fcmp une float %ind, 0.0
|
||||
%select = select i1 %fcmp, float %f, float %ind
|
||||
%fcmp3 = fcmp une float %select, 0.0
|
||||
%select4 = select i1 %fcmp3, float %f, float %select
|
||||
%fcmp5 = fcmp une float %select4, 0.0
|
||||
%select6 = select i1 %fcmp5, float %f, float %select4
|
||||
%fcmp7 = fcmp une float %select6, 0.0
|
||||
%select8 = select i1 %fcmp7, float %f, float %select6
|
||||
%fcmp9 = fcmp une float %select8, 0.0
|
||||
%select10 = select i1 %fcmp9, float %f, float %select8
|
||||
%fcmp11 = fcmp une float %select10, 0.0
|
||||
%select12 = select i1 %fcmp11, float %f, float %select10
|
||||
%fcmp13 = fcmp une float %select12, 0.0
|
||||
%select14 = select i1 %fcmp13, float %f, float %select12
|
||||
%fcmp15 = fcmp une float %select14, 0.0
|
||||
%select16 = select i1 %fcmp15, float %f, float %select14
|
||||
%fcmp17 = fcmp une float %select16, 0.0
|
||||
%select18 = select i1 %fcmp17, float %f, float %select16
|
||||
%fcmp19 = fcmp une float %select18, 0.0
|
||||
%select20 = select i1 %fcmp19, float %f, float %select18
|
||||
%fcmp21 = fcmp une float %select20, 0.0
|
||||
%select22 = select i1 %fcmp21, float %f, float %select20
|
||||
%fcmp23 = fcmp une float %select22, 0.0
|
||||
%select24 = select i1 %fcmp23, float %f, float %select22
|
||||
%fcmp25 = fcmp une float %select24, 0.0
|
||||
%select26 = select i1 %fcmp25, float %f, float %select24
|
||||
%fcmp27 = fcmp une float %select26, 0.0
|
||||
%select28 = select i1 %fcmp27, float %f, float %select26
|
||||
%fcmp29 = fcmp une float %select28, 0.0
|
||||
%select30 = select i1 %fcmp29, float %f, float %select28
|
||||
%fcmp31 = fcmp une float %select30, 0.0
|
||||
%select32 = select i1 %fcmp31, float %f, float %select30
|
||||
%fcmp33 = fcmp une float %select32, 0.0
|
||||
%select34 = select i1 %fcmp33, float %f, float %select32
|
||||
%fcmp35 = fcmp une float %select34, 0.0
|
||||
%select36 = select i1 %fcmp35, float %f, float %select34
|
||||
%fcmp37 = fcmp une float %select36, 0.0
|
||||
%select38 = select i1 %fcmp37, float %f, float %select36
|
||||
%fcmp39 = fcmp une float %select38, 0.0
|
||||
%select40 = select i1 %fcmp39, float %f, float %select38
|
||||
%fcmp41 = fcmp une float %select40, 0.0
|
||||
%select42 = select i1 %fcmp41, float %f, float %select40
|
||||
%fcmp43 = fcmp une float %select42, 0.0
|
||||
%select44 = select i1 %fcmp43, float %f, float %select42
|
||||
%fcmp45 = fcmp une float %select44, 0.0
|
||||
%select46 = select i1 %fcmp45, float %f, float %select44
|
||||
%fcmp47 = fcmp une float %select46, 0.0
|
||||
%select48 = select i1 %fcmp47, float %f, float %select46
|
||||
%fcmp49 = fcmp une float %select48, 0.0
|
||||
%select50 = select i1 %fcmp49, float %f, float %select48
|
||||
%fcmp51 = fcmp une float %select50, 0.0
|
||||
%select52 = select i1 %fcmp51, float %f, float %select50
|
||||
%fcmp53 = fcmp une float %select52, 0.0
|
||||
%select54 = select i1 %fcmp53, float %f, float %select52
|
||||
%fcmp55 = fcmp une float %select54, 0.0
|
||||
%select56 = select i1 %fcmp55, float %f, float %select54
|
||||
%fcmp57 = fcmp une float %select56, 0.0
|
||||
%select58 = select i1 %fcmp57, float %f, float %select56
|
||||
%fcmp59 = fcmp une float %select58, 0.0
|
||||
%select60 = select i1 %fcmp59, float %f, float %select58
|
||||
%fcmp61 = fcmp une float %select60, 0.0
|
||||
%select62 = select i1 %fcmp61, float %f, float %select60
|
||||
%fcmp63 = fcmp une float %select62, 0.0
|
||||
%select64 = select i1 %fcmp63, float %f, float %select62
|
||||
%fcmp65 = fcmp une float %select64, 0.0
|
||||
%select66 = select i1 %fcmp65, float %f, float %select64
|
||||
%fcmp67 = fcmp une float %select66, 0.0
|
||||
%select68 = select i1 %fcmp67, float %f, float %select66
|
||||
%fcmp69 = fcmp une float %select68, 0.0
|
||||
%select70 = select i1 %fcmp69, float %f, float %select68
|
||||
%fcmp71 = fcmp une float %select70, 0.0
|
||||
%select72 = select i1 %fcmp71, float %f, float %select70
|
||||
%fcmp73 = fcmp une float %select72, 0.0
|
||||
%select74 = select i1 %fcmp73, float %f, float %select72
|
||||
%fcmp75 = fcmp une float %select74, 0.0
|
||||
%select76 = select i1 %fcmp75, float %f, float %select74
|
||||
%fcmp77 = fcmp une float %select76, 0.0
|
||||
%select78 = select i1 %fcmp77, float %f, float %select76
|
||||
%fcmp79 = fcmp une float %select78, 0.0
|
||||
%select80 = select i1 %fcmp79, float %f, float %select78
|
||||
%fcmp81 = fcmp une float %select80, 0.0
|
||||
%select82 = select i1 %fcmp81, float %f, float %select80
|
||||
%fcmp83 = fcmp une float %select82, 0.0
|
||||
%select84 = select i1 %fcmp83, float %f, float %select82
|
||||
%fcmp85 = fcmp une float %select84, 0.0
|
||||
%select86 = select i1 %fcmp85, float %f, float %select84
|
||||
%fcmp87 = fcmp une float %select86, 0.0
|
||||
%select88 = select i1 %fcmp87, float %f, float %select86
|
||||
%fcmp89 = fcmp une float %select88, 0.0
|
||||
%select90 = select i1 %fcmp89, float %f, float %select88
|
||||
%fcmp91 = fcmp une float %select90, 0.0
|
||||
%select92 = select i1 %fcmp91, float %f, float %select90
|
||||
%fcmp93 = fcmp une float %select92, 0.0
|
||||
%select94 = select i1 %fcmp93, float %f, float %select92
|
||||
%fcmp95 = fcmp une float %select94, 0.0
|
||||
%select96 = select i1 %fcmp95, float %f, float %select94
|
||||
%fcmp97 = fcmp une float %select96, 0.0
|
||||
%select98 = select i1 %fcmp97, float %f, float %select96
|
||||
%fcmp99 = fcmp une float %select98, 0.0
|
||||
%select100 = select i1 %fcmp99, float %f, float %select98
|
||||
%fcmp101 = fcmp une float %select100, 0.0
|
||||
%select102 = select i1 %fcmp101, float %f, float %select100
|
||||
%fcmp103 = fcmp une float %select102, 0.0
|
||||
%select104 = select i1 %fcmp103, float %f, float %select102
|
||||
%fcmp105 = fcmp une float %select104, 0.0
|
||||
%select106 = select i1 %fcmp105, float %f, float %select104
|
||||
%fcmp107 = fcmp une float %select106, 0.0
|
||||
%select108 = select i1 %fcmp107, float %f, float %select106
|
||||
%fcmp109 = fcmp une float %select108, 0.0
|
||||
%select110 = select i1 %fcmp109, float %f, float %select108
|
||||
%fcmp111 = fcmp une float %select110, 0.0
|
||||
%select112 = select i1 %fcmp111, float %f, float %select110
|
||||
%fcmp113 = fcmp une float %select112, 0.0
|
||||
%select114 = select i1 %fcmp113, float %f, float %select112
|
||||
%fcmp115 = fcmp une float %select114, 0.0
|
||||
%select116 = select i1 %fcmp115, float %f, float %select114
|
||||
%fcmp117 = fcmp une float %select116, 0.0
|
||||
%select118 = select i1 %fcmp117, float %f, float %select116
|
||||
%fcmp119 = fcmp une float %select118, 0.0
|
||||
%select120 = select i1 %fcmp119, float %f, float %select118
|
||||
%fcmp121 = fcmp une float %select120, 0.0
|
||||
%select122 = select i1 %fcmp121, float %f, float %select120
|
||||
%fcmp123 = fcmp une float %select122, 0.0
|
||||
%select124 = select i1 %fcmp123, float %f, float %select122
|
||||
%fcmp125 = fcmp une float %select124, 0.0
|
||||
%select126 = select i1 %fcmp125, float %f, float %select124
|
||||
%fcmp127 = fcmp une float %select126, 0.0
|
||||
%select128 = select i1 %fcmp127, float %f, float %select126
|
||||
%fcmp129 = fcmp une float %select128, 0.0
|
||||
%select130 = select i1 %fcmp129, float %f, float %select128
|
||||
%fcmp131 = fcmp une float %select130, 0.0
|
||||
%select132 = select i1 %fcmp131, float %f, float %select130
|
||||
%fcmp133 = fcmp une float %select132, 0.0
|
||||
%select134 = select i1 %fcmp133, float %f, float %select132
|
||||
%fcmp135 = fcmp une float %select134, 0.0
|
||||
%select136 = select i1 %fcmp135, float %f, float %select134
|
||||
%fcmp137 = fcmp une float %select136, 0.0
|
||||
%select138 = select i1 %fcmp137, float %f, float %select136
|
||||
%fcmp139 = fcmp une float %select138, 0.0
|
||||
%select140 = select i1 %fcmp139, float %f, float %select138
|
||||
%fcmp141 = fcmp une float %select140, 0.0
|
||||
%select142 = select i1 %fcmp141, float %f, float %select140
|
||||
%fcmp143 = fcmp une float %select142, 0.0
|
||||
%ind.next = select i1 %fcmp143, float %f, float %select142
|
||||
%iv.next = add nuw nsw i32 %iv, 1
|
||||
%exit.cond = icmp eq i32 %iv.next, 8
|
||||
br i1 %exit.cond, label %exit, label %loop
|
||||
|
||||
exit:
|
||||
%lcssa.phi = phi float [ %ind.next, %loop ]
|
||||
ret float %lcssa.phi
|
||||
}
|
||||
|
||||
; This loop hangs if isConditionalOnXorOfPHIs doesn't keep track of previously
|
||||
; visited instructions since most instructions have multiple uses.
|
||||
define i16 @isConditionalOnXorOfPHIs_visited(i16 %crc.init, i16 %data.init) {
|
||||
; CHECK-LABEL: 'isConditionalOnXorOfPHIs_visited'
|
||||
; CHECK-NEXT: Did not find a hash algorithm
|
||||
; CHECK-NEXT: Reason: Recurrences not intertwined with XOR
|
||||
;
|
||||
entry:
|
||||
br label %loop
|
||||
|
||||
loop:
|
||||
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
|
||||
%crc = phi i16 [ %crc.init, %entry ], [ %crc.next, %loop ]
|
||||
%data = phi i16 [ %data.init, %entry ], [ %data.shl, %loop ]
|
||||
%data.shl = shl i16 %data, 1
|
||||
%crc.shl = shl i16 %crc, 1
|
||||
%crc.xor = xor i16 %crc.shl, 4129
|
||||
%d0 = and i16 %crc, %data
|
||||
%e1 = add i16 %d0, 1
|
||||
%d1 = mul i16 %e1, %d0
|
||||
%e2 = add i16 %d1, 1
|
||||
%d2 = mul i16 %e2, %d1
|
||||
%e3 = add i16 %d2, 1
|
||||
%d3 = mul i16 %e3, %d2
|
||||
%e4 = add i16 %d3, 1
|
||||
%d4 = mul i16 %e4, %d3
|
||||
%e5 = add i16 %d4, 1
|
||||
%d5 = mul i16 %e5, %d4
|
||||
%e6 = add i16 %d5, 1
|
||||
%d6 = mul i16 %e6, %d5
|
||||
%e7 = add i16 %d6, 1
|
||||
%d7 = mul i16 %e7, %d6
|
||||
%e8 = add i16 %d7, 1
|
||||
%d8 = mul i16 %e8, %d7
|
||||
%e9 = add i16 %d8, 1
|
||||
%d9 = mul i16 %e9, %d8
|
||||
%e10 = add i16 %d9, 1
|
||||
%d10 = mul i16 %e10, %d9
|
||||
%e11 = add i16 %d10, 1
|
||||
%d11 = mul i16 %e11, %d10
|
||||
%e12 = add i16 %d11, 1
|
||||
%d12 = mul i16 %e12, %d11
|
||||
%e13 = add i16 %d12, 1
|
||||
%d13 = mul i16 %e13, %d12
|
||||
%e14 = add i16 %d13, 1
|
||||
%d14 = mul i16 %e14, %d13
|
||||
%e15 = add i16 %d14, 1
|
||||
%d15 = mul i16 %e15, %d14
|
||||
%e16 = add i16 %d15, 1
|
||||
%d16 = mul i16 %e16, %d15
|
||||
%e17 = add i16 %d16, 1
|
||||
%d17 = mul i16 %e17, %d16
|
||||
%e18 = add i16 %d17, 1
|
||||
%d18 = mul i16 %e18, %d17
|
||||
%e19 = add i16 %d18, 1
|
||||
%d19 = mul i16 %e19, %d18
|
||||
%e20 = add i16 %d19, 1
|
||||
%d20 = mul i16 %e20, %d19
|
||||
%e21 = add i16 %d20, 1
|
||||
%d21 = mul i16 %e21, %d20
|
||||
%e22 = add i16 %d21, 1
|
||||
%d22 = mul i16 %e22, %d21
|
||||
%e23 = add i16 %d22, 1
|
||||
%d23 = mul i16 %e23, %d22
|
||||
%e24 = add i16 %d23, 1
|
||||
%d24 = mul i16 %e24, %d23
|
||||
%e25 = add i16 %d24, 1
|
||||
%d25 = mul i16 %e25, %d24
|
||||
%e26 = add i16 %d25, 1
|
||||
%d26 = mul i16 %e26, %d25
|
||||
%e27 = add i16 %d26, 1
|
||||
%d27 = mul i16 %e27, %d26
|
||||
%e28 = add i16 %d27, 1
|
||||
%d28 = mul i16 %e28, %d27
|
||||
%e29 = add i16 %d28, 1
|
||||
%d29 = mul i16 %e29, %d28
|
||||
%e30 = add i16 %d29, 1
|
||||
%d30 = mul i16 %e30, %d29
|
||||
%e31 = add i16 %d30, 1
|
||||
%d31 = mul i16 %e31, %d30
|
||||
%e32 = add i16 %d31, 1
|
||||
%d32 = mul i16 %e32, %d31
|
||||
%e33 = add i16 %d32, 1
|
||||
%d33 = mul i16 %e33, %d32
|
||||
%e34 = add i16 %d33, 1
|
||||
%d34 = mul i16 %e34, %d33
|
||||
%e35 = add i16 %d34, 1
|
||||
%d35 = mul i16 %e35, %d34
|
||||
%e36 = add i16 %d35, 1
|
||||
%d36 = mul i16 %e36, %d35
|
||||
%e37 = add i16 %d36, 1
|
||||
%d37 = mul i16 %e37, %d36
|
||||
%e38 = add i16 %d37, 1
|
||||
%d38 = mul i16 %e38, %d37
|
||||
%e39 = add i16 %d38, 1
|
||||
%d39 = mul i16 %e39, %d38
|
||||
%e40 = add i16 %d39, 1
|
||||
%d40 = mul i16 %e40, %d39
|
||||
%check.sb = icmp eq i16 %d40, 0
|
||||
%crc.next = select i1 %check.sb, i16 %crc.xor, i16 %crc.shl
|
||||
%iv.next = add nuw nsw i32 %iv, 1
|
||||
%exit.cond = icmp eq i32 %iv.next, 8
|
||||
br i1 %exit.cond, label %exit, label %loop
|
||||
|
||||
exit:
|
||||
ret i16 %crc.next
|
||||
}
|
||||
|
||||
; This loop hangs if containsUnreachable doesn't keep track of previously
|
||||
; visited instructions since most instructions have multiple uses.
|
||||
define i16 @containsUnreachable_visited(i16 %crc.init) {
|
||||
; CHECK-LABEL: 'containsUnreachable_visited'
|
||||
; CHECK-NEXT: Found big-endian CRC-16 loop with trip count 8
|
||||
; CHECK-NEXT: Initial CRC: i16 %crc.init
|
||||
; CHECK-NEXT: Generating polynomial: 4129
|
||||
; CHECK-NEXT: Computed CRC: %crc.next = select i1 %check.sb, i16 %crc.xor, i16 %crc.shl
|
||||
; CHECK-NEXT: Computed CRC lookup table:
|
||||
; CHECK-NEXT: 0 4129 8258 12387 16516 20645 24774 28903 33032 37161 41290 45419 49548 53677 57806 61935
|
||||
; CHECK-NEXT: 4657 528 12915 8786 21173 17044 29431 25302 37689 33560 45947 41818 54205 50076 62463 58334
|
||||
; CHECK-NEXT: 9314 13379 1056 5121 25830 29895 17572 21637 42346 46411 34088 38153 58862 62927 50604 54669
|
||||
; CHECK-NEXT: 13907 9842 5649 1584 30423 26358 22165 18100 46939 42874 38681 34616 63455 59390 55197 51132
|
||||
; CHECK-NEXT: 18628 22757 26758 30887 2112 6241 10242 14371 51660 55789 59790 63919 35144 39273 43274 47403
|
||||
; CHECK-NEXT: 23285 19156 31415 27286 6769 2640 14899 10770 56317 52188 64447 60318 39801 35672 47931 43802
|
||||
; CHECK-NEXT: 27814 31879 19684 23749 11298 15363 3168 7233 60846 64911 52716 56781 44330 48395 36200 40265
|
||||
; CHECK-NEXT: 32407 28342 24277 20212 15891 11826 7761 3696 65439 61374 57309 53244 48923 44858 40793 36728
|
||||
; CHECK-NEXT: 37256 33193 45514 41451 53516 49453 61774 57711 4224 161 12482 8419 20484 16421 28742 24679
|
||||
; CHECK-NEXT: 33721 37784 41979 46042 49981 54044 58239 62302 689 4752 8947 13010 16949 21012 25207 29270
|
||||
; CHECK-NEXT: 46570 42443 38312 34185 62830 58703 54572 50445 13538 9411 5280 1153 29798 25671 21540 17413
|
||||
; CHECK-NEXT: 42971 47098 34713 38840 59231 63358 50973 55100 9939 14066 1681 5808 26199 30326 17941 22068
|
||||
; CHECK-NEXT: 55628 51565 63758 59695 39368 35305 47498 43435 22596 18533 30726 26663 6336 2273 14466 10403
|
||||
; CHECK-NEXT: 52093 56156 60223 64286 35833 39896 43963 48026 19061 23124 27191 31254 2801 6864 10931 14994
|
||||
; CHECK-NEXT: 64814 60687 56684 52557 48554 44427 40424 36297 31782 27655 23652 19525 15522 11395 7392 3265
|
||||
; CHECK-NEXT: 61215 65342 53085 57212 44955 49082 36825 40952 28183 32310 20053 24180 11923 16050 3793 7920
|
||||
; CHECK-NEXT: Computed CRC Barrett constants:
|
||||
; CHECK-NEXT: Mu = 273, FullGenPoly = 69665
|
||||
;
|
||||
entry:
|
||||
br label %loop
|
||||
|
||||
loop:
|
||||
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
|
||||
%crc = phi i16 [ %crc.init, %entry ], [ %crc.next, %loop ]
|
||||
%crc.shl = shl i16 %crc, 1
|
||||
%crc.xor = xor i16 %crc.shl, 4129
|
||||
%check.sb = icmp slt i16 %crc, 0
|
||||
%crc.next = select i1 %check.sb, i16 %crc.xor, i16 %crc.shl
|
||||
%iv.next = add nuw nsw i32 %iv, 1
|
||||
%d0 = mul i32 %iv, 1
|
||||
%e1 = mul i32 %d0, 1
|
||||
%f1 = sub i32 %d0, %d0
|
||||
%d1 = add i32 %e1, %f1
|
||||
%e2 = mul i32 %d1, 1
|
||||
%f2 = sub i32 %d1, %d1
|
||||
%d2 = add i32 %e2, %f2
|
||||
%e3 = mul i32 %d2, 1
|
||||
%f3 = sub i32 %d2, %d2
|
||||
%d3 = add i32 %e3, %f3
|
||||
%e4 = mul i32 %d3, 1
|
||||
%f4 = sub i32 %d3, %d3
|
||||
%d4 = add i32 %e4, %f4
|
||||
%e5 = mul i32 %d4, 1
|
||||
%f5 = sub i32 %d4, %d4
|
||||
%d5 = add i32 %e5, %f5
|
||||
%e6 = mul i32 %d5, 1
|
||||
%f6 = sub i32 %d5, %d5
|
||||
%d6 = add i32 %e6, %f6
|
||||
%e7 = mul i32 %d6, 1
|
||||
%f7 = sub i32 %d6, %d6
|
||||
%d7 = add i32 %e7, %f7
|
||||
%e8 = mul i32 %d7, 1
|
||||
%f8 = sub i32 %d7, %d7
|
||||
%d8 = add i32 %e8, %f8
|
||||
%e9 = mul i32 %d8, 1
|
||||
%f9 = sub i32 %d8, %d8
|
||||
%d9 = add i32 %e9, %f9
|
||||
%e10 = mul i32 %d9, 1
|
||||
%f10 = sub i32 %d9, %d9
|
||||
%d10 = add i32 %e10, %f10
|
||||
%e11 = mul i32 %d10, 1
|
||||
%f11 = sub i32 %d10, %d10
|
||||
%d11 = add i32 %e11, %f11
|
||||
%e12 = mul i32 %d11, 1
|
||||
%f12 = sub i32 %d11, %d11
|
||||
%d12 = add i32 %e12, %f12
|
||||
%e13 = mul i32 %d12, 1
|
||||
%f13 = sub i32 %d12, %d12
|
||||
%d13 = add i32 %e13, %f13
|
||||
%e14 = mul i32 %d13, 1
|
||||
%f14 = sub i32 %d13, %d13
|
||||
%d14 = add i32 %e14, %f14
|
||||
%e15 = mul i32 %d14, 1
|
||||
%f15 = sub i32 %d14, %d14
|
||||
%d15 = add i32 %e15, %f15
|
||||
%e16 = mul i32 %d15, 1
|
||||
%f16 = sub i32 %d15, %d15
|
||||
%d16 = add i32 %e16, %f16
|
||||
%e17 = mul i32 %d16, 1
|
||||
%f17 = sub i32 %d16, %d16
|
||||
%d17 = add i32 %e17, %f17
|
||||
%e18 = mul i32 %d17, 1
|
||||
%f18 = sub i32 %d17, %d17
|
||||
%d18 = add i32 %e18, %f18
|
||||
%e19 = mul i32 %d18, 1
|
||||
%f19 = sub i32 %d18, %d18
|
||||
%d19 = add i32 %e19, %f19
|
||||
%e20 = mul i32 %d19, 1
|
||||
%f20 = sub i32 %d19, %d19
|
||||
%d20 = add i32 %e20, %f20
|
||||
%e21 = mul i32 %d20, 1
|
||||
%f21 = sub i32 %d20, %d20
|
||||
%d21 = add i32 %e21, %f21
|
||||
%e22 = mul i32 %d21, 1
|
||||
%f22 = sub i32 %d21, %d21
|
||||
%d22 = add i32 %e22, %f22
|
||||
%e23 = mul i32 %d22, 1
|
||||
%f23 = sub i32 %d22, %d22
|
||||
%d23 = add i32 %e23, %f23
|
||||
%e24 = mul i32 %d23, 1
|
||||
%f24 = sub i32 %d23, %d23
|
||||
%d24 = add i32 %e24, %f24
|
||||
%e25 = mul i32 %d24, 1
|
||||
%f25 = sub i32 %d24, %d24
|
||||
%d25 = add i32 %e25, %f25
|
||||
%e26 = mul i32 %d25, 1
|
||||
%f26 = sub i32 %d25, %d25
|
||||
%d26 = add i32 %e26, %f26
|
||||
%e27 = mul i32 %d26, 1
|
||||
%f27 = sub i32 %d26, %d26
|
||||
%d27 = add i32 %e27, %f27
|
||||
%e28 = mul i32 %d27, 1
|
||||
%f28 = sub i32 %d27, %d27
|
||||
%d28 = add i32 %e28, %f28
|
||||
%e29 = mul i32 %d28, 1
|
||||
%f29 = sub i32 %d28, %d28
|
||||
%d29 = add i32 %e29, %f29
|
||||
%e30 = mul i32 %d29, 1
|
||||
%f30 = sub i32 %d29, %d29
|
||||
%d30 = add i32 %e30, %f30
|
||||
%exit.cond = icmp samesign ult i32 %d30, 7
|
||||
br i1 %exit.cond, label %loop, label %exit
|
||||
|
||||
exit:
|
||||
ret i16 %crc.next
|
||||
}
|
||||
|
|
@ -1,171 +0,0 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
|
||||
; RUN: opt -passes='print<hash-recognize>' -disable-output %s 2>&1 | FileCheck %s
|
||||
|
||||
; This loop hangs if digRecurrence doesn't keep track of previously visited
|
||||
; instructions since most instructions have multiple uses.
|
||||
define float @dense_use_def_chain(float %a, float %b) {
|
||||
; CHECK-LABEL: 'dense_use_def_chain'
|
||||
; CHECK-NEXT: Did not find a hash algorithm
|
||||
; CHECK-NEXT: Reason: Unable to find conditional recurrence
|
||||
;
|
||||
entry:
|
||||
; %f must be the result of an instruction in order for digRecurrence to be
|
||||
; called from matchConditionalRecurrence.
|
||||
%f = fneg float %a
|
||||
br label %loop
|
||||
|
||||
loop:
|
||||
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
|
||||
%ind = phi float [ %b, %entry ], [ %ind.next, %loop ]
|
||||
%fcmp = fcmp une float %ind, 0.0
|
||||
%select = select i1 %fcmp, float %f, float %ind
|
||||
%fcmp3 = fcmp une float %select, 0.0
|
||||
%select4 = select i1 %fcmp3, float %f, float %select
|
||||
%fcmp5 = fcmp une float %select4, 0.0
|
||||
%select6 = select i1 %fcmp5, float %f, float %select4
|
||||
%fcmp7 = fcmp une float %select6, 0.0
|
||||
%select8 = select i1 %fcmp7, float %f, float %select6
|
||||
%fcmp9 = fcmp une float %select8, 0.0
|
||||
%select10 = select i1 %fcmp9, float %f, float %select8
|
||||
%fcmp11 = fcmp une float %select10, 0.0
|
||||
%select12 = select i1 %fcmp11, float %f, float %select10
|
||||
%fcmp13 = fcmp une float %select12, 0.0
|
||||
%select14 = select i1 %fcmp13, float %f, float %select12
|
||||
%fcmp15 = fcmp une float %select14, 0.0
|
||||
%select16 = select i1 %fcmp15, float %f, float %select14
|
||||
%fcmp17 = fcmp une float %select16, 0.0
|
||||
%select18 = select i1 %fcmp17, float %f, float %select16
|
||||
%fcmp19 = fcmp une float %select18, 0.0
|
||||
%select20 = select i1 %fcmp19, float %f, float %select18
|
||||
%fcmp21 = fcmp une float %select20, 0.0
|
||||
%select22 = select i1 %fcmp21, float %f, float %select20
|
||||
%fcmp23 = fcmp une float %select22, 0.0
|
||||
%select24 = select i1 %fcmp23, float %f, float %select22
|
||||
%fcmp25 = fcmp une float %select24, 0.0
|
||||
%select26 = select i1 %fcmp25, float %f, float %select24
|
||||
%fcmp27 = fcmp une float %select26, 0.0
|
||||
%select28 = select i1 %fcmp27, float %f, float %select26
|
||||
%fcmp29 = fcmp une float %select28, 0.0
|
||||
%select30 = select i1 %fcmp29, float %f, float %select28
|
||||
%fcmp31 = fcmp une float %select30, 0.0
|
||||
%select32 = select i1 %fcmp31, float %f, float %select30
|
||||
%fcmp33 = fcmp une float %select32, 0.0
|
||||
%select34 = select i1 %fcmp33, float %f, float %select32
|
||||
%fcmp35 = fcmp une float %select34, 0.0
|
||||
%select36 = select i1 %fcmp35, float %f, float %select34
|
||||
%fcmp37 = fcmp une float %select36, 0.0
|
||||
%select38 = select i1 %fcmp37, float %f, float %select36
|
||||
%fcmp39 = fcmp une float %select38, 0.0
|
||||
%select40 = select i1 %fcmp39, float %f, float %select38
|
||||
%fcmp41 = fcmp une float %select40, 0.0
|
||||
%select42 = select i1 %fcmp41, float %f, float %select40
|
||||
%fcmp43 = fcmp une float %select42, 0.0
|
||||
%select44 = select i1 %fcmp43, float %f, float %select42
|
||||
%fcmp45 = fcmp une float %select44, 0.0
|
||||
%select46 = select i1 %fcmp45, float %f, float %select44
|
||||
%fcmp47 = fcmp une float %select46, 0.0
|
||||
%select48 = select i1 %fcmp47, float %f, float %select46
|
||||
%fcmp49 = fcmp une float %select48, 0.0
|
||||
%select50 = select i1 %fcmp49, float %f, float %select48
|
||||
%fcmp51 = fcmp une float %select50, 0.0
|
||||
%select52 = select i1 %fcmp51, float %f, float %select50
|
||||
%fcmp53 = fcmp une float %select52, 0.0
|
||||
%select54 = select i1 %fcmp53, float %f, float %select52
|
||||
%fcmp55 = fcmp une float %select54, 0.0
|
||||
%select56 = select i1 %fcmp55, float %f, float %select54
|
||||
%fcmp57 = fcmp une float %select56, 0.0
|
||||
%select58 = select i1 %fcmp57, float %f, float %select56
|
||||
%fcmp59 = fcmp une float %select58, 0.0
|
||||
%select60 = select i1 %fcmp59, float %f, float %select58
|
||||
%fcmp61 = fcmp une float %select60, 0.0
|
||||
%select62 = select i1 %fcmp61, float %f, float %select60
|
||||
%fcmp63 = fcmp une float %select62, 0.0
|
||||
%select64 = select i1 %fcmp63, float %f, float %select62
|
||||
%fcmp65 = fcmp une float %select64, 0.0
|
||||
%select66 = select i1 %fcmp65, float %f, float %select64
|
||||
%fcmp67 = fcmp une float %select66, 0.0
|
||||
%select68 = select i1 %fcmp67, float %f, float %select66
|
||||
%fcmp69 = fcmp une float %select68, 0.0
|
||||
%select70 = select i1 %fcmp69, float %f, float %select68
|
||||
%fcmp71 = fcmp une float %select70, 0.0
|
||||
%select72 = select i1 %fcmp71, float %f, float %select70
|
||||
%fcmp73 = fcmp une float %select72, 0.0
|
||||
%select74 = select i1 %fcmp73, float %f, float %select72
|
||||
%fcmp75 = fcmp une float %select74, 0.0
|
||||
%select76 = select i1 %fcmp75, float %f, float %select74
|
||||
%fcmp77 = fcmp une float %select76, 0.0
|
||||
%select78 = select i1 %fcmp77, float %f, float %select76
|
||||
%fcmp79 = fcmp une float %select78, 0.0
|
||||
%select80 = select i1 %fcmp79, float %f, float %select78
|
||||
%fcmp81 = fcmp une float %select80, 0.0
|
||||
%select82 = select i1 %fcmp81, float %f, float %select80
|
||||
%fcmp83 = fcmp une float %select82, 0.0
|
||||
%select84 = select i1 %fcmp83, float %f, float %select82
|
||||
%fcmp85 = fcmp une float %select84, 0.0
|
||||
%select86 = select i1 %fcmp85, float %f, float %select84
|
||||
%fcmp87 = fcmp une float %select86, 0.0
|
||||
%select88 = select i1 %fcmp87, float %f, float %select86
|
||||
%fcmp89 = fcmp une float %select88, 0.0
|
||||
%select90 = select i1 %fcmp89, float %f, float %select88
|
||||
%fcmp91 = fcmp une float %select90, 0.0
|
||||
%select92 = select i1 %fcmp91, float %f, float %select90
|
||||
%fcmp93 = fcmp une float %select92, 0.0
|
||||
%select94 = select i1 %fcmp93, float %f, float %select92
|
||||
%fcmp95 = fcmp une float %select94, 0.0
|
||||
%select96 = select i1 %fcmp95, float %f, float %select94
|
||||
%fcmp97 = fcmp une float %select96, 0.0
|
||||
%select98 = select i1 %fcmp97, float %f, float %select96
|
||||
%fcmp99 = fcmp une float %select98, 0.0
|
||||
%select100 = select i1 %fcmp99, float %f, float %select98
|
||||
%fcmp101 = fcmp une float %select100, 0.0
|
||||
%select102 = select i1 %fcmp101, float %f, float %select100
|
||||
%fcmp103 = fcmp une float %select102, 0.0
|
||||
%select104 = select i1 %fcmp103, float %f, float %select102
|
||||
%fcmp105 = fcmp une float %select104, 0.0
|
||||
%select106 = select i1 %fcmp105, float %f, float %select104
|
||||
%fcmp107 = fcmp une float %select106, 0.0
|
||||
%select108 = select i1 %fcmp107, float %f, float %select106
|
||||
%fcmp109 = fcmp une float %select108, 0.0
|
||||
%select110 = select i1 %fcmp109, float %f, float %select108
|
||||
%fcmp111 = fcmp une float %select110, 0.0
|
||||
%select112 = select i1 %fcmp111, float %f, float %select110
|
||||
%fcmp113 = fcmp une float %select112, 0.0
|
||||
%select114 = select i1 %fcmp113, float %f, float %select112
|
||||
%fcmp115 = fcmp une float %select114, 0.0
|
||||
%select116 = select i1 %fcmp115, float %f, float %select114
|
||||
%fcmp117 = fcmp une float %select116, 0.0
|
||||
%select118 = select i1 %fcmp117, float %f, float %select116
|
||||
%fcmp119 = fcmp une float %select118, 0.0
|
||||
%select120 = select i1 %fcmp119, float %f, float %select118
|
||||
%fcmp121 = fcmp une float %select120, 0.0
|
||||
%select122 = select i1 %fcmp121, float %f, float %select120
|
||||
%fcmp123 = fcmp une float %select122, 0.0
|
||||
%select124 = select i1 %fcmp123, float %f, float %select122
|
||||
%fcmp125 = fcmp une float %select124, 0.0
|
||||
%select126 = select i1 %fcmp125, float %f, float %select124
|
||||
%fcmp127 = fcmp une float %select126, 0.0
|
||||
%select128 = select i1 %fcmp127, float %f, float %select126
|
||||
%fcmp129 = fcmp une float %select128, 0.0
|
||||
%select130 = select i1 %fcmp129, float %f, float %select128
|
||||
%fcmp131 = fcmp une float %select130, 0.0
|
||||
%select132 = select i1 %fcmp131, float %f, float %select130
|
||||
%fcmp133 = fcmp une float %select132, 0.0
|
||||
%select134 = select i1 %fcmp133, float %f, float %select132
|
||||
%fcmp135 = fcmp une float %select134, 0.0
|
||||
%select136 = select i1 %fcmp135, float %f, float %select134
|
||||
%fcmp137 = fcmp une float %select136, 0.0
|
||||
%select138 = select i1 %fcmp137, float %f, float %select136
|
||||
%fcmp139 = fcmp une float %select138, 0.0
|
||||
%select140 = select i1 %fcmp139, float %f, float %select138
|
||||
%fcmp141 = fcmp une float %select140, 0.0
|
||||
%select142 = select i1 %fcmp141, float %f, float %select140
|
||||
%fcmp143 = fcmp une float %select142, 0.0
|
||||
%ind.next = select i1 %fcmp143, float %f, float %select142
|
||||
%iv.next = add nuw nsw i32 %iv, 1
|
||||
%exit.cond = icmp eq i32 %iv.next, 8
|
||||
br i1 %exit.cond, label %exit, label %loop
|
||||
|
||||
exit:
|
||||
%lcssa.phi = phi float [ %ind.next, %loop ]
|
||||
ret float %lcssa.phi
|
||||
}
|
||||
Loading…
Reference in a new issue