Fix the expansion of umax and smax in the case where one or more of
[oota-llvm.git] / test / Transforms / IndVarSimplify / max-pointer.ll
1 ; RUN: llvm-as < %s | opt -indvars | llvm-dis > %t
2 ; RUN: grep {icmp ugt i8\\\*} %t | count 1
3 ; RUN: grep {icmp sgt i8\\\*} %t | count 1
4
5 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
6
7         %struct.CKenCodeCodec = type <{ i8 }>
8
9 define void @foo(i8* %str1Ptr, i8* %str2Ptr, i8* %inLastBytePtr) nounwind {
10 entry:
11         %0 = icmp ult i8* %str2Ptr, %str1Ptr            ; <i1> [#uses=1]
12         %str2Ptr_addr.0 = select i1 %0, i8* %str1Ptr, i8* %str2Ptr              ; <i8*> [#uses=1]
13         br label %bb2
14
15 bb2:            ; preds = %bb2, %entry
16         %str2Ptr_addr.1 = phi i8* [ %str2Ptr_addr.0, %entry ], [ %1, %bb2 ]             ; <i8*> [#uses=1]
17         %1 = getelementptr i8* %str2Ptr_addr.1, i64 1           ; <i8*> [#uses=2]
18         %2 = icmp ult i8* %1, %inLastBytePtr            ; <i1> [#uses=0]
19         br i1 false, label %bb2, label %return
20
21 return:         ; preds = %bb2
22         ret void
23 }
24
25 define void @bar(i8* %str1Ptr, i64 %s, i8* %inLastBytePtr) nounwind {
26 entry:
27         %str2Ptr = inttoptr i64 %s to i8*
28         %0 = icmp ult i8* %str2Ptr, %str1Ptr            ; <i1> [#uses=1]
29         %str2Ptr_addr.0 = select i1 %0, i8* %str1Ptr, i8* %str2Ptr              ; <i8*> [#uses=1]
30         br label %bb2
31
32 bb2:            ; preds = %bb2, %entry
33         %str2Ptr_addr.1 = phi i8* [ %str2Ptr_addr.0, %entry ], [ %1, %bb2 ]             ; <i8*> [#uses=1]
34         %1 = getelementptr i8* %str2Ptr_addr.1, i64 1           ; <i8*> [#uses=2]
35         %2 = icmp ult i8* %1, %inLastBytePtr            ; <i1> [#uses=0]
36         br i1 false, label %bb2, label %return
37
38 return:         ; preds = %bb2
39         ret void
40 }
41
42 define void @qux(i64 %t, i64 %s, i8* %inLastBytePtr) nounwind {
43 entry:
44         %str1Ptr = inttoptr i64 %t to i8*
45         %str2Ptr = inttoptr i64 %s to i8*
46         %0 = icmp ult i8* %str2Ptr, %str1Ptr            ; <i1> [#uses=1]
47         %str2Ptr_addr.0 = select i1 %0, i8* %str1Ptr, i8* %str2Ptr              ; <i8*> [#uses=1]
48         br label %bb2
49
50 bb2:            ; preds = %bb2, %entry
51         %str2Ptr_addr.1 = phi i8* [ %str2Ptr_addr.0, %entry ], [ %1, %bb2 ]             ; <i8*> [#uses=1]
52         %1 = getelementptr i8* %str2Ptr_addr.1, i64 1           ; <i8*> [#uses=2]
53         %2 = icmp ult i8* %1, %inLastBytePtr            ; <i1> [#uses=0]
54         br i1 false, label %bb2, label %return
55
56 return:         ; preds = %bb2
57         ret void
58 }
59
60 define void @vor(i64 %t, i8* %str2Ptr, i8* %inLastBytePtr) nounwind {
61 entry:
62         %str1Ptr = inttoptr i64 %t to i8*
63         %0 = icmp ult i8* %str2Ptr, %str1Ptr            ; <i1> [#uses=1]
64         %str2Ptr_addr.0 = select i1 %0, i8* %str1Ptr, i8* %str2Ptr              ; <i8*> [#uses=1]
65         br label %bb2
66
67 bb2:            ; preds = %bb2, %entry
68         %str2Ptr_addr.1 = phi i8* [ %str2Ptr_addr.0, %entry ], [ %1, %bb2 ]             ; <i8*> [#uses=1]
69         %1 = getelementptr i8* %str2Ptr_addr.1, i64 1           ; <i8*> [#uses=2]
70         %2 = icmp ult i8* %1, %inLastBytePtr            ; <i1> [#uses=0]
71         br i1 false, label %bb2, label %return
72
73 return:         ; preds = %bb2
74         ret void
75 }
76
77 define void @sfoo(i8* %str1Ptr, i8* %str2Ptr, i8* %inLastBytePtr) nounwind {
78 entry:
79         %0 = icmp slt i8* %str2Ptr, %str1Ptr            ; <i1> [#uses=1]
80         %str2Ptr_addr.0 = select i1 %0, i8* %str1Ptr, i8* %str2Ptr              ; <i8*> [#uses=1]
81         br label %bb2
82
83 bb2:            ; preds = %bb2, %entry
84         %str2Ptr_addr.1 = phi i8* [ %str2Ptr_addr.0, %entry ], [ %1, %bb2 ]             ; <i8*> [#uses=1]
85         %1 = getelementptr i8* %str2Ptr_addr.1, i64 1           ; <i8*> [#uses=2]
86         %2 = icmp slt i8* %1, %inLastBytePtr            ; <i1> [#uses=0]
87         br i1 false, label %bb2, label %return
88
89 return:         ; preds = %bb2
90         ret void
91 }
92
93 define void @sbar(i8* %str1Ptr, i64 %s, i8* %inLastBytePtr) nounwind {
94 entry:
95         %str2Ptr = inttoptr i64 %s to i8*
96         %0 = icmp slt i8* %str2Ptr, %str1Ptr            ; <i1> [#uses=1]
97         %str2Ptr_addr.0 = select i1 %0, i8* %str1Ptr, i8* %str2Ptr              ; <i8*> [#uses=1]
98         br label %bb2
99
100 bb2:            ; preds = %bb2, %entry
101         %str2Ptr_addr.1 = phi i8* [ %str2Ptr_addr.0, %entry ], [ %1, %bb2 ]             ; <i8*> [#uses=1]
102         %1 = getelementptr i8* %str2Ptr_addr.1, i64 1           ; <i8*> [#uses=2]
103         %2 = icmp slt i8* %1, %inLastBytePtr            ; <i1> [#uses=0]
104         br i1 false, label %bb2, label %return
105
106 return:         ; preds = %bb2
107         ret void
108 }
109
110 define void @squx(i64 %t, i64 %s, i8* %inLastBytePtr) nounwind {
111 entry:
112         %str1Ptr = inttoptr i64 %t to i8*
113         %str2Ptr = inttoptr i64 %s to i8*
114         %0 = icmp slt i8* %str2Ptr, %str1Ptr            ; <i1> [#uses=1]
115         %str2Ptr_addr.0 = select i1 %0, i8* %str1Ptr, i8* %str2Ptr              ; <i8*> [#uses=1]
116         br label %bb2
117
118 bb2:            ; preds = %bb2, %entry
119         %str2Ptr_addr.1 = phi i8* [ %str2Ptr_addr.0, %entry ], [ %1, %bb2 ]             ; <i8*> [#uses=1]
120         %1 = getelementptr i8* %str2Ptr_addr.1, i64 1           ; <i8*> [#uses=2]
121         %2 = icmp slt i8* %1, %inLastBytePtr            ; <i1> [#uses=0]
122         br i1 false, label %bb2, label %return
123
124 return:         ; preds = %bb2
125         ret void
126 }
127
128 define void @svor(i64 %t, i8* %str2Ptr, i8* %inLastBytePtr) nounwind {
129 entry:
130         %str1Ptr = inttoptr i64 %t to i8*
131         %0 = icmp slt i8* %str2Ptr, %str1Ptr            ; <i1> [#uses=1]
132         %str2Ptr_addr.0 = select i1 %0, i8* %str1Ptr, i8* %str2Ptr              ; <i8*> [#uses=1]
133         br label %bb2
134
135 bb2:            ; preds = %bb2, %entry
136         %str2Ptr_addr.1 = phi i8* [ %str2Ptr_addr.0, %entry ], [ %1, %bb2 ]             ; <i8*> [#uses=1]
137         %1 = getelementptr i8* %str2Ptr_addr.1, i64 1           ; <i8*> [#uses=2]
138         %2 = icmp slt i8* %1, %inLastBytePtr            ; <i1> [#uses=0]
139         br i1 false, label %bb2, label %return
140
141 return:         ; preds = %bb2
142         ret void
143 }
144
145