~ubuntu-branches/ubuntu/quantal/llvm-3.1/quantal

« back to all changes in this revision

Viewing changes to test/Transforms/IndVarSimplify/sink-alloca.ll

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2012-03-29 19:09:51 UTC
  • Revision ID: package-import@ubuntu.com-20120329190951-aq83ivog4cg8bxun
Tags: upstream-3.1~svn153643
ImportĀ upstreamĀ versionĀ 3.1~svn153643

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
; RUN: opt < %s -indvars -S | FileCheck %s
 
2
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
 
3
target triple = "i386-apple-darwin10.0"
 
4
 
 
5
; PR4775
 
6
; Indvars shouldn't sink the alloca out of the entry block, even though
 
7
; it's not used until after the loop.
 
8
define i32 @main() nounwind {
 
9
; CHECK: entry:
 
10
; CHECK-NEXT: %result.i = alloca i32, align 4
 
11
entry:
 
12
  %result.i = alloca i32, align 4                 ; <i32*> [#uses=2]
 
13
  br label %while.cond
 
14
 
 
15
while.cond:                                       ; preds = %while.cond, %entry
 
16
  %call = call i32 @bar() nounwind                ; <i32> [#uses=1]
 
17
  %tobool = icmp eq i32 %call, 0                  ; <i1> [#uses=1]
 
18
  br i1 %tobool, label %while.end, label %while.cond
 
19
 
 
20
while.end:                                        ; preds = %while.cond
 
21
  store volatile i32 0, i32* %result.i
 
22
  %tmp.i = load volatile i32* %result.i           ; <i32> [#uses=0]
 
23
  ret i32 0
 
24
}
 
25
declare i32 @bar()
 
26
 
 
27
; <rdar://problem/10352360>
 
28
; Indvars shouldn't sink the first alloca between the stacksave and stackrestore
 
29
; intrinsics.
 
30
declare i8* @a(...)
 
31
declare i8* @llvm.stacksave() nounwind
 
32
declare void @llvm.stackrestore(i8*) nounwind
 
33
define void @h(i64 %n) nounwind uwtable ssp {
 
34
; CHECK: entry:
 
35
; CHECK-NEXT: %vla = alloca i8*
 
36
; CHECK-NEXT: %savedstack = call i8* @llvm.stacksave()
 
37
entry:
 
38
  %vla = alloca i8*, i64 %n, align 16
 
39
  %savedstack = call i8* @llvm.stacksave() nounwind
 
40
  %vla.i = alloca i8*, i64 %n, align 16
 
41
  br label %for.body.i
 
42
 
 
43
for.body.i:
 
44
  %indvars.iv37.i = phi i64 [ %indvars.iv.next38.i, %for.body.i ], [ 0, %entry ]
 
45
  %call.i = call i8* (...)* @a() nounwind
 
46
  %arrayidx.i = getelementptr inbounds i8** %vla.i, i64 %indvars.iv37.i
 
47
  store i8* %call.i, i8** %arrayidx.i, align 8
 
48
  %indvars.iv.next38.i = add i64 %indvars.iv37.i, 1
 
49
  %exitcond5 = icmp eq i64 %indvars.iv.next38.i, %n
 
50
  br i1 %exitcond5, label %g.exit, label %for.body.i
 
51
 
 
52
g.exit:
 
53
  call void @llvm.stackrestore(i8* %savedstack) nounwind
 
54
  %call1 = call i8* (...)* @a(i8** %vla) nounwind
 
55
  ret void
 
56
}