• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
11;
12; RUN: opt < %s -instcombine -S | FileCheck %s
13; END.
14define 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
20}
21
22define 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
27}
28
29define 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
34}
35
36define 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
42}
43
44define 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
50}
51define 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
57}
58
59define 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
64}
65
66define 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
71}
72
73define 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
78}
79
80define 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
86}
87
88define 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
94}
95
96define 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
101}
102
103define 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
109}
110
111define 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
116}
117
118define 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
123}
124
125define 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
131}
132
133define 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
139}
140
141define 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
147}
148
149define 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
154}
155
156define 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
161}
162
163define 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
168}
169
170define 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
176}
177
178define 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
184}
185
186define 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
191}
192
193