llvm.org GIT mirror llvm / 9157d27
Merging r203818: ------------------------------------------------------------------------ r203818 | thomas.stellard | 2014-03-13 10:13:04 -0700 (Thu, 13 Mar 2014) | 7 lines R600: LDS instructions shouldn't implicitly define OQAP LDS instructions are pseudo instructions which model the OQAP defs and uses within a single instruction. This fixes a hang in the opencv MedianFilter tests. git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_34@204650 91177308-0d34-0410-b5e6-96231b3b80d8 Tom Stellard 6 years ago
2 changed file(s) with 28 addition(s) and 2 deletion(s). Raw diff Collapse all Expand all
16371637 let src2 = 0;
16381638 let src2_rel = 0;
16391639
1640 let Defs = [OQAP];
16411640 let usesCustomInserter = 1;
16421641 let LDS_1A = 1;
16431642 let DisableEncoding = "$dst";
16731672 let BaseOp = name;
16741673 let usesCustomInserter = 1;
16751674 let DisableEncoding = "$dst";
1676 let Defs = [OQAP];
16771675 }
16781676
16791677 class R600_LDS_1A2D lds_op, string name, list pattern> :
0 ; RUN: llc < %s -march=r600 -mcpu=redwood -verify-machineinstrs | FileCheck %s
1
2 ; The test is for a bug in R600EmitClauseMarkers.cpp where this pass
3 ; was searching for a use of the OQAP register in order to determine
4 ; if an LDS instruction could fit in the current clause, but never finding
5 ; one. This created an infinite loop and hung the compiler.
6 ;
7 ; The LDS instruction should not have been defining OQAP in the first place,
8 ; because the LDS instructions are pseudo instructions and the OQAP
9 ; reads and writes are bundled together in the same instruction.
10
11 ; CHECK: @lds_crash
12 define void @lds_crash(i32 addrspace(1)* %out, i32 addrspace(3)* %in, i32 %a, i32 %b, i32 %c) {
13 entry:
14 %0 = load i32 addrspace(3)* %in
15 ; This block needs to be > 115 ISA instructions to hit the bug,
16 ; so we'll use udiv instructions.
17 %div0 = udiv i32 %0, %b
18 %div1 = udiv i32 %div0, %a
19 %div2 = udiv i32 %div1, 11
20 %div3 = udiv i32 %div2, %a
21 %div4 = udiv i32 %div3, %b
22 %div5 = udiv i32 %div4, %c
23 %div6 = udiv i32 %div5, %div0
24 %div7 = udiv i32 %div6, %div1
25 store i32 %div7, i32 addrspace(1)* %out
26 ret void
27 }