| ; RUN: opt %loadPolly -polly-codegen -S < %s | FileCheck %s |
| ; |
| ; llvm.org/PR25438 |
| ; After loop versioning, a dominance check of a non-affine subregion's exit node |
| ; causes the dominance check to always fail any block in the scop. The |
| ; subregion's exit block has become polly_merge_new_and_old, which also receives |
| ; the control flow of the generated code. This would cause that any value for |
| ; implicit stores is assumed to be not from the scop. |
| ; |
| ; This checks that the stored value is indeed from the generated code. |
| ; |
| ; CHECK-LABEL: polly.stmt.do.body.entry: |
| ; CHECK: a.phiops.reload = load i32, i32* %a.phiops |
| ; |
| ; CHECK-LABEL: polly.stmt.polly.merge_new_and_old.exit: |
| ; CHECK: store i32 %polly.a, i32* %a.s2a |
| |
| define void @func() { |
| entry: |
| br label %while.body |
| |
| while.body: |
| br label %do.body |
| |
| do.body: |
| %a = phi i32 [ undef, %while.body ], [ %b, %end_b ] |
| %cond = or i1 undef, undef |
| br i1 %cond, label %end_a, label %if_a |
| |
| if_a: |
| br label %end_a |
| |
| end_a: |
| br i1 undef, label %if_b, label %end_b |
| |
| if_b: |
| br label %end_b |
| |
| end_b: |
| %b = phi i32 [ undef, %if_b ], [ %a, %end_a ] |
| br i1 false, label %do.body, label %do.end |
| |
| do.end: |
| br label %return |
| |
| return: |
| ret void |
| } |