The dominance of the generated non-affine subregion block was based on the scop's merge block, therefore resulted in an invalid DominanceTree. It resulted in some values as assumed to be unusable in the actual generated exit block. We detect the case that the exit block has been moved and decide dominance using the BB at the original exit. If we create another exit node, that exit nodes is dominated by the one generated from where the original exit resides. This fixes llvm.org/PR25438 and part of llvm.org/PR25439. llvm-svn: 252526
31 lines
926 B
LLVM
31 lines
926 B
LLVM
; RUN: opt %loadPolly -polly-codegen -S < %s | FileCheck %s
|
|
;
|
|
; llvm.org/PR25439
|
|
; The dominance of the generated non-affine subregion block was based on the
|
|
; scop's merge block, therefore resulted in an invalid DominanceTree.
|
|
; It resulted in some values as assumed to be unusable in the actual generated
|
|
; exit block. Here we check whether the value %escaping is taken from the
|
|
; generated block.
|
|
;
|
|
; CHECK-LABEL: polly.stmt.subregion_entry:
|
|
; CHECK: %p_escaping = select i1 undef, i32 undef, i32 undef
|
|
;
|
|
; CHECK-LABEL: polly.stmt.polly.merge_new_and_old.exit:
|
|
; CHECK: store i32 %p_escaping, i32* %escaping.s2a
|
|
|
|
define i32 @func() {
|
|
entry:
|
|
br label %subregion_entry
|
|
|
|
subregion_entry:
|
|
%escaping = select i1 undef, i32 undef, i32 undef
|
|
%cond = or i1 undef, undef
|
|
br i1 %cond, label %subregion_exit, label %subregion_if
|
|
|
|
subregion_if:
|
|
br label %subregion_exit
|
|
|
|
subregion_exit:
|
|
ret i32 %escaping
|
|
}
|