Summary: If a PHI has an incoming undef, we can pretend that it is equal to one non-undef, non-self incoming value. This is particularly relevant in combination with the StructurizeCFG pass, which introduces PHI nodes with undefs. Previously, this lead to branch conditions that were uniform before StructurizeCFG to become non-uniform afterwards, which confused the SIAnnotateControlFlow pass. This fixes a crash when Mesa radeonsi compiles a shader from dEQP-GLES3.functional.shaders.switch.switch_in_for_loop_dynamic_vertex Reviewers: arsenm, tstellarAMD, jingyue Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D19013 llvm-svn: 266347
29 lines
793 B
LLVM
29 lines
793 B
LLVM
; RUN: opt -mtriple=amdgcn-- -analyze -divergence %s | FileCheck %s
|
|
|
|
; CHECK-LABEL: 'test1':
|
|
; CHECK-NEXT: DIVERGENT: i32 %bound
|
|
; CHECK-NEXT: DIVERGENT: %break = icmp sge i32 %counter, %bound
|
|
; CHECK-NEXT: DIVERGENT: br i1 %break, label %footer, label %body
|
|
; CHECK-NEXT: DIVERGENT: br i1 %break, label %end, label %header
|
|
; Note: %counter is not divergent!
|
|
define amdgpu_ps void @test1(i32 %bound) {
|
|
entry:
|
|
br label %header
|
|
|
|
header:
|
|
%counter = phi i32 [ 0, %entry ], [ %counter.footer, %footer ]
|
|
%break = icmp sge i32 %counter, %bound
|
|
br i1 %break, label %footer, label %body
|
|
|
|
body:
|
|
%counter.next = add i32 %counter, 1
|
|
br label %footer
|
|
|
|
footer:
|
|
%counter.footer = phi i32 [ %counter.next, %body ], [ undef, %header ]
|
|
br i1 %break, label %end, label %header
|
|
|
|
end:
|
|
ret void
|
|
}
|