[BasicAA] Remove special casing of memset_pattern16 in favor of generic attribute...
[oota-llvm.git] / test / Transforms / SimplifyCFG / implied-cond.ll
1 ; RUN: opt %s -S -simplifycfg | FileCheck %s
2 ; Check for when one branch implies the value of a successors conditional and
3 ; it's not simply the same conditional repeated.
4
5 define void @test(i32 %length.i, i32 %i) {
6 ; CHECK-LABEL: @test
7   %iplus1 = add nsw i32 %i, 1
8   %var29 = icmp slt i32 %iplus1, %length.i
9 ; CHECK: br i1 %var29, label %in_bounds, label %out_of_bounds
10   br i1 %var29, label %next, label %out_of_bounds
11
12 next:
13 ; CHECK-LABEL: in_bounds:
14 ; CHECK-NEXT: ret void
15   %var30 = icmp slt i32 %i, %length.i
16   br i1 %var30, label %in_bounds, label %out_of_bounds2
17
18 in_bounds:
19   ret void
20
21 out_of_bounds:
22   call void @foo(i64 0)
23   unreachable
24
25 out_of_bounds2:
26   call void @foo(i64 1)
27   unreachable
28 }
29
30 ; If the add is not nsw, it's not safe to use the fact about i+1 to imply the
31 ; i condition since it could have overflowed.
32 define void @test_neg(i32 %length.i, i32 %i) {
33 ; CHECK-LABEL: @test_neg
34   %iplus1 = add i32 %i, 1
35   %var29 = icmp slt i32 %iplus1, %length.i
36 ; CHECK: br i1 %var29, label %next, label %out_of_bounds
37   br i1 %var29, label %next, label %out_of_bounds
38
39 next:
40   %var30 = icmp slt i32 %i, %length.i
41 ; CHECK: br i1 %var30, label %in_bounds, label %out_of_bounds2
42   br i1 %var30, label %in_bounds, label %out_of_bounds2
43
44 in_bounds:
45   ret void
46
47 out_of_bounds:
48   call void @foo(i64 0)
49   unreachable
50
51 out_of_bounds2:
52   call void @foo(i64 1)
53   unreachable
54 }
55
56
57 define void @test2(i32 %length.i, i32 %i) {
58 ; CHECK-LABEL: @test2
59   %iplus100 = add nsw i32 %i, 100
60   %var29 = icmp slt i32 %iplus100, %length.i
61 ; CHECK: br i1 %var29, label %in_bounds, label %out_of_bounds
62   br i1 %var29, label %next, label %out_of_bounds
63
64 next:
65   %var30 = icmp slt i32 %i, %length.i
66   br i1 %var30, label %in_bounds, label %out_of_bounds2
67
68 in_bounds:
69   ret void
70
71 out_of_bounds:
72   call void @foo(i64 0)
73   unreachable
74
75 out_of_bounds2:
76   call void @foo(i64 1)
77   unreachable
78 }
79
80 declare void @foo(i64)
81