131f3537ab1fb2bff41333b91a763fb159c419f1
[oota-llvm.git] / test / Transforms / GVN / pr25440.ll
1 ;RUN: opt -gvn -S < %s | FileCheck %s
2
3 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n8:16:32-S64"
4 target triple = "thumbv7--linux-gnueabi"
5
6 %struct.a = type { i16, i16, [1 x %union.a] }
7 %union.a = type { i32 }
8
9 @length = external global [0 x i32], align 4
10
11 ; Function Attrs: nounwind
12 define fastcc void @foo(%struct.a* nocapture readonly %x) {
13 ;CHECK-LABEL: foo
14 entry:
15   br label %bb0
16
17 bb0:                                      ; preds = %land.lhs.true, %entry
18 ;CHECK: bb0:
19   %x.tr = phi %struct.a* [ %x, %entry ], [ null, %land.lhs.true ]
20   %code1 = getelementptr inbounds %struct.a, %struct.a* %x.tr, i32 0, i32 0
21   %0 = load i16, i16* %code1, align 4
22 ; CHECK: load i32, i32*
23   %conv = zext i16 %0 to i32
24   switch i32 %conv, label %if.end.50 [
25     i32 43, label %cleanup
26     i32 52, label %if.then.5
27   ]
28
29 if.then.5:                                        ; preds = %bb0
30   br i1 undef, label %land.lhs.true, label %if.then.26
31
32 land.lhs.true:                                    ; preds = %if.then.5
33   br i1 undef, label %cleanup, label %bb0
34
35 if.then.26:                                       ; preds = %if.then.5
36   %x.tr.lcssa163 = phi %struct.a* [ %x.tr, %if.then.5 ]
37   br i1 undef, label %cond.end, label %cond.false
38
39 cond.false:                                       ; preds = %if.then.26
40 ; CHECK: cond.false:
41 ; CHECK-NOT: load
42   %mode = getelementptr inbounds %struct.a, %struct.a* %x.tr.lcssa163, i32 0, i32 1
43   %bf.load = load i16, i16* %mode, align 2
44   %bf.shl = shl i16 %bf.load, 8
45   br label %cond.end
46
47 cond.end:                                         ; preds = %cond.false, %if.then.26
48   br i1 undef, label %if.then.44, label %cleanup
49
50 if.then.44:                                       ; preds = %cond.end
51   unreachable
52
53 if.end.50:                                        ; preds = %bb0
54 ;%CHECK: if.end.50:
55   %conv.lcssa = phi i32 [ %conv, %bb0 ]
56   %arrayidx52 = getelementptr inbounds [0 x i32], [0 x i32]* @length, i32 0, i32 %conv.lcssa
57   %1 = load i32, i32* %arrayidx52, align 4
58   br i1 undef, label %for.body.57, label %cleanup
59
60 for.body.57:                                      ; preds = %if.end.50
61   %i.2157 = add nsw i32 %1, -1
62   unreachable
63
64 cleanup:                                          ; preds = %if.end.50, %cond.end, %land.lhs.true, %bb0
65   ret void
66 }