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
63 lines
2.5 KiB
LLVM
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
|
|
}
|