fix a globalopt crash on two Adobe-C++ testcases that the recent
[llvm.git] / test / Transforms / InstCombine / 2004-11-27-SetCCForCastLargerAndConstant.ll
blob6672b6c6d4e5fea950e98327148dfd5aa51c3724
1 ; This test case tests the InstructionCombining optimization that
2 ; reduces things like:
3 ;   %Y = sext i8 %X to i32 
4 ;   %C = icmp ult i32 %Y, 1024
5 ; to
6 ;   %C = i1 true
7 ; It includes test cases for different constant values, signedness of the
8 ; cast operands, and types of setCC operators. In all cases, the cast should
9 ; be eliminated. In many cases the setCC is also eliminated based on the
10 ; constant value and the range of the casted value.
12 ; RUN: opt < %s -instcombine -S | FileCheck %s
13 ; END.
14 define i1 @lt_signed_to_large_unsigned(i8 %SB) {
15         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
16         %C = icmp ult i32 %Y, 1024              ; <i1> [#uses=1]
17         ret i1 %C
18 ; CHECK: %C1 = icmp sgt i8 %SB, -1
19 ; CHECK: ret i1 %C1
22 define i1 @lt_signed_to_large_signed(i8 %SB) {
23         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
24         %C = icmp slt i32 %Y, 1024              ; <i1> [#uses=1]
25         ret i1 %C
26 ; CHECK: ret i1 true
29 define i1 @lt_signed_to_large_negative(i8 %SB) {
30         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
31         %C = icmp slt i32 %Y, -1024             ; <i1> [#uses=1]
32         ret i1 %C
33 ; CHECK: ret i1 false
36 define i1 @lt_signed_to_small_unsigned(i8 %SB) {
37         %Y = sext i8 %SB to i32
38         %C = icmp ult i32 %Y, 17
39         ret i1 %C
40 ; CHECK: %C = icmp ult i8 %SB, 17
41 ; CHECK: ret i1 %C
44 define i1 @lt_signed_to_small_signed(i8 %SB) {
45         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
46         %C = icmp slt i32 %Y, 17                ; <i1> [#uses=1]
47         ret i1 %C
48 ; CHECK: %C = icmp slt i8 %SB, 17
49 ; CHECK: ret i1 %C
51 define i1 @lt_signed_to_small_negative(i8 %SB) {
52         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
53         %C = icmp slt i32 %Y, -17               ; <i1> [#uses=1]
54         ret i1 %C
55 ; CHECK: %C = icmp slt i8 %SB, -17
56 ; CHECK: ret i1 %C
59 define i1 @lt_unsigned_to_large_unsigned(i8 %SB) {
60         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
61         %C = icmp ult i32 %Y, 1024              ; <i1> [#uses=1]
62         ret i1 %C
63 ; CHECK: ret i1 true
66 define i1 @lt_unsigned_to_large_signed(i8 %SB) {
67         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
68         %C = icmp slt i32 %Y, 1024              ; <i1> [#uses=1]
69         ret i1 %C
70 ; CHECK: ret i1 true
73 define i1 @lt_unsigned_to_large_negative(i8 %SB) {
74         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
75         %C = icmp slt i32 %Y, -1024             ; <i1> [#uses=1]
76         ret i1 %C
77 ; CHECK: ret i1 false
80 define i1 @lt_unsigned_to_small_unsigned(i8 %SB) {
81         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
82         %C = icmp ult i32 %Y, 17                ; <i1> [#uses=1]
83         ret i1 %C
84 ; CHECK: %C = icmp ult i8 %SB, 17
85 ; CHECK: ret i1 %C
88 define i1 @lt_unsigned_to_small_signed(i8 %SB) {
89         %Y = zext i8 %SB to i32
90         %C = icmp slt i32 %Y, 17
91         ret i1 %C
92 ; CHECK: %C = icmp ult i8 %SB, 17
93 ; CHECK: ret i1 %C
96 define i1 @lt_unsigned_to_small_negative(i8 %SB) {
97         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
98         %C = icmp slt i32 %Y, -17               ; <i1> [#uses=1]
99         ret i1 %C
100 ; CHECK: ret i1 false
103 define i1 @gt_signed_to_large_unsigned(i8 %SB) {
104         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
105         %C = icmp ugt i32 %Y, 1024              ; <i1> [#uses=1]
106         ret i1 %C
107 ; CHECK: %C = icmp slt i8 %SB, 0
108 ; CHECK: ret i1 %C
111 define i1 @gt_signed_to_large_signed(i8 %SB) {
112         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
113         %C = icmp sgt i32 %Y, 1024              ; <i1> [#uses=1]
114         ret i1 %C
115 ; CHECK: ret i1 false
118 define i1 @gt_signed_to_large_negative(i8 %SB) {
119         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
120         %C = icmp sgt i32 %Y, -1024             ; <i1> [#uses=1]
121         ret i1 %C
122 ; CHECK: ret i1 true
125 define i1 @gt_signed_to_small_unsigned(i8 %SB) {
126         %Y = sext i8 %SB to i32
127         %C = icmp ugt i32 %Y, 17
128         ret i1 %C
129 ; CHECK: %C = icmp ugt i8 %SB, 17
130 ; CHECK: ret i1 %C
133 define i1 @gt_signed_to_small_signed(i8 %SB) {
134         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
135         %C = icmp sgt i32 %Y, 17                ; <i1> [#uses=1]
136         ret i1 %C
137 ; CHECK: %C = icmp sgt i8 %SB, 17
138 ; CHECK: ret i1 %C
141 define i1 @gt_signed_to_small_negative(i8 %SB) {
142         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
143         %C = icmp sgt i32 %Y, -17               ; <i1> [#uses=1]
144         ret i1 %C
145 ; CHECK: %C = icmp sgt i8 %SB, -17
146 ; CHECK: ret i1 %C
149 define i1 @gt_unsigned_to_large_unsigned(i8 %SB) {
150         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
151         %C = icmp ugt i32 %Y, 1024              ; <i1> [#uses=1]
152         ret i1 %C
153 ; CHECK: ret i1 false
156 define i1 @gt_unsigned_to_large_signed(i8 %SB) {
157         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
158         %C = icmp sgt i32 %Y, 1024              ; <i1> [#uses=1]
159         ret i1 %C
160 ; CHECK: ret i1 false
163 define i1 @gt_unsigned_to_large_negative(i8 %SB) {
164         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
165         %C = icmp sgt i32 %Y, -1024             ; <i1> [#uses=1]
166         ret i1 %C
167 ; CHECK: ret i1 true
170 define i1 @gt_unsigned_to_small_unsigned(i8 %SB) {
171         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
172         %C = icmp ugt i32 %Y, 17                ; <i1> [#uses=1]
173         ret i1 %C
174 ; CHECK: %C = icmp ugt i8 %SB, 17
175 ; CHECK: ret i1 %C
178 define i1 @gt_unsigned_to_small_signed(i8 %SB) {
179         %Y = zext i8 %SB to i32
180         %C = icmp sgt i32 %Y, 17
181         ret i1 %C
182 ; CHECK: %C = icmp ugt i8 %SB, 17
183 ; CHECK: ret i1 %C
186 define i1 @gt_unsigned_to_small_negative(i8 %SB) {
187         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
188         %C = icmp sgt i32 %Y, -17               ; <i1> [#uses=1]
189         ret i1 %C
190 ; CHECK: ret i1 true