Files
clang-p2996/polly/test/Isl/CodeGen/hoisted_load_escapes_through_phi.ll
Tobias Grosser 1c18440958 [BlockGenerator] Invalidate SCEV values for instructions in scop
We already invalidated a couple of critical values earlier on, but we now
invalidate all instructions contained in a scop after the scop has been code
generated. This is necessary as later scops may otherwise obtain SCEV
expressions that reference values in the earlier scop that before dominated
the later scop, but which had been moved into the conditional branch and
consequently do not dominate the later scop any more. If these very values are
then used during code generation of the later scop, we generate used that are
dominated by the values they use.

This fixes: http://llvm.org/PR28984

llvm-svn: 279047
2016-08-18 10:45:57 +00:00

63 lines
2.5 KiB
LLVM

; RUN: opt %loadPolly -S -polly-codegen \
; RUN: -polly-invariant-load-hoisting=false < %s | FileCheck %s
; RUN: opt %loadPolly -S -polly-codegen \
; RUN: -polly-invariant-load-hoisting=true < %s | FileCheck %s
;
; Check that we generate valid code even if the load of cont_STACKPOINTER is
; hoisted in one SCoP and used (through the phi node %tmp2).
;
; CHECK: polly.start
; CHECK: polly.start
;
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
%struct1 = type { i32, %union1, %struct.2*, i32, i32 }
%union1 = type { %struct.2* }
%struct.2 = type { %struct.2*, i8* }
@cont_STACKPOINTER = external global i32, align 4
@cont_STACK = external global [1000 x i32], align 16
define fastcc void @subs_InternIdcEq() {
entry:
br label %if.else.i.i
if.else.i.i: ; preds = %entry
%tmp = load %struct1*, %struct1** undef, align 8
br label %while.body.i99.i.i
while.body.i99.i.i: ; preds = %while.body.i99.i.i, %if.else.i.i
br i1 false, label %while.body.i99.i.i, label %while.end.i103.i.i
while.end.i103.i.i: ; preds = %while.body.i99.i.i
%tmp1 = load i32, i32* @cont_STACKPOINTER, align 4
%dec.i.i102.i.i = add nsw i32 %tmp1, -1
br i1 false, label %cont_BackTrack.exit107.i.i, label %if.then.i106.i.i
if.then.i106.i.i: ; preds = %while.end.i103.i.i
br label %cont_BackTrack.exit107.i.i
cont_BackTrack.exit107.i.i: ; preds = %if.then.i106.i.i, %while.end.i103.i.i
%tmp2 = phi i32 [ %dec.i.i102.i.i, %if.then.i106.i.i ], [ 0, %while.end.i103.i.i ]
%symbol.i.i.i = getelementptr inbounds %struct1, %struct1* %tmp, i64 0, i32 0
br i1 undef, label %land.lhs.true23.i.i, label %for.inc.i.i
land.lhs.true23.i.i: ; preds = %cont_BackTrack.exit107.i.i
%idxprom.i.i57.i.i = sext i32 %tmp2 to i64
%arrayidx.i.i58.i.i = getelementptr inbounds [1000 x i32], [1000 x i32]* @cont_STACK, i64 0, i64 %idxprom.i.i57.i.i
store i32 undef, i32* %arrayidx.i.i58.i.i, align 4
br i1 false, label %if.then.i45.i.i, label %fol_Atom.exit47.i.i
if.then.i45.i.i: ; preds = %land.lhs.true23.i.i
br label %fol_Atom.exit47.i.i
fol_Atom.exit47.i.i: ; preds = %if.then.i45.i.i, %land.lhs.true23.i.i
unreachable
for.inc.i.i: ; preds = %cont_BackTrack.exit107.i.i
br label %for.end.i.i
for.end.i.i: ; preds = %for.inc.i.i
ret void
}