[Unroll] Handle SwitchInst properly.
[oota-llvm.git] / test / Transforms / LoopUnroll / full-unroll-crashers.ll
1 ; Check that we don't crash on corner cases.
2 ; RUN: opt < %s -S -loop-unroll -unroll-max-iteration-count-to-analyze=1000 -unroll-threshold=10 -unroll-percent-dynamic-cost-saved-threshold=20 -o /dev/null
3 target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
4
5 @known_constant = internal unnamed_addr constant [10 x i32] [i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1], align 16
6
7 define void @foo1() {
8 entry:
9   br label %for.body
10
11 for.body:
12   %phi = phi i64 [ 0, %entry ], [ %inc, %for.body ]
13   %idx = zext i32 undef to i64
14   %add.ptr = getelementptr inbounds i64, i64* null, i64 %idx
15   %inc = add nuw nsw i64 %phi, 1
16   %cmp = icmp ult i64 %inc, 999
17   br i1 %cmp, label %for.body, label %for.exit
18
19 for.exit:
20   ret void
21 }
22
23 define void @foo2() {
24 entry:
25   br label %for.body
26
27 for.body:
28   %phi = phi i64 [ 0, %entry ], [ %inc, %for.body ]
29   %x = getelementptr i32, <4 x i32*> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
30   %inc = add nuw nsw i64 %phi, 1
31   %cmp = icmp ult i64 %inc, 999
32   br i1 %cmp, label %for.body, label %for.exit
33
34 for.exit:
35   ret void
36 }
37
38 define void @cmp_undef() {
39 entry:
40   br label %for.body
41
42 for.body:                                         ; preds = %for.inc, %entry
43   %iv.0 = phi i64 [ 0, %entry ], [ %iv.1, %for.inc ]
44   %arrayidx1 = getelementptr inbounds [10 x i32], [10 x i32]* @known_constant, i64 0, i64 %iv.0
45   %x1 = load i32, i32* %arrayidx1, align 4
46   %cmp = icmp eq i32 %x1, undef
47   br i1 %cmp, label %if.then, label %for.inc
48
49 if.then:                                          ; preds = %for.body
50   br label %for.inc
51
52 for.inc:                                          ; preds = %for.body, %if.then
53   %iv.1 = add nuw nsw i64 %iv.0, 1
54   %exitcond = icmp eq i64 %iv.1, 10
55   br i1 %exitcond, label %for.end, label %for.body
56
57 for.end:                                          ; preds = %for.inc
58   ret void
59 }
60
61 define void @switch() {
62 entry:
63   br label %for.body
64
65 for.body:
66   %iv.0 = phi i64 [ 0, %entry ], [ %iv.1, %for.inc ]
67   %arrayidx1 = getelementptr inbounds [10 x i32], [10 x i32]* @known_constant, i64 0, i64 %iv.0
68   %x1 = load i32, i32* %arrayidx1, align 4
69   switch i32 %x1, label %l1 [
70   ]
71
72 l1:
73   %x2 = add i32 %x1, 2
74   br label %for.inc
75
76 for.inc:
77   %iv.1 = add nuw nsw i64 %iv.0, 1
78   %exitcond = icmp eq i64 %iv.1, 10
79   br i1 %exitcond, label %for.end, label %for.body
80
81 for.end:
82   ret void
83 }