forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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/trunk@203818 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
1 parent
d2a816f
commit 47feea0
Showing
2 changed files
with
28 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
; RUN: llc < %s -march=r600 -mcpu=redwood -verify-machineinstrs | FileCheck %s | ||
|
||
; The test is for a bug in R600EmitClauseMarkers.cpp where this pass | ||
; was searching for a use of the OQAP register in order to determine | ||
; if an LDS instruction could fit in the current clause, but never finding | ||
; one. This created an infinite loop and hung the compiler. | ||
; | ||
; The LDS instruction should not have been defining OQAP in the first place, | ||
; because the LDS instructions are pseudo instructions and the OQAP | ||
; reads and writes are bundled together in the same instruction. | ||
|
||
; CHECK: @lds_crash | ||
define void @lds_crash(i32 addrspace(1)* %out, i32 addrspace(3)* %in, i32 %a, i32 %b, i32 %c) { | ||
entry: | ||
%0 = load i32 addrspace(3)* %in | ||
; This block needs to be > 115 ISA instructions to hit the bug, | ||
; so we'll use udiv instructions. | ||
%div0 = udiv i32 %0, %b | ||
%div1 = udiv i32 %div0, %a | ||
%div2 = udiv i32 %div1, 11 | ||
%div3 = udiv i32 %div2, %a | ||
%div4 = udiv i32 %div3, %b | ||
%div5 = udiv i32 %div4, %c | ||
%div6 = udiv i32 %div5, %div0 | ||
%div7 = udiv i32 %div6, %div1 | ||
store i32 %div7, i32 addrspace(1)* %out | ||
ret void | ||
} |