1 ; This test case tests the InstructionCombining optimization that
3 ; %Y = sext i8 %X to i32
4 ; %C = icmp ult i32 %Y, 1024
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
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]
18 ; CHECK: %C1 = icmp sgt i8 %SB, -1
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]
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]
36 define i1 @lt_signed_to_small_signed(i8 %SB) {
37 %Y = sext i8 %SB to i32 ; <i32> [#uses=1]
38 %C = icmp slt i32 %Y, 17 ; <i1> [#uses=1]
40 ; CHECK: %C = icmp slt i8 %SB, 17
43 define i1 @lt_signed_to_small_negative(i8 %SB) {
44 %Y = sext i8 %SB to i32 ; <i32> [#uses=1]
45 %C = icmp slt i32 %Y, -17 ; <i1> [#uses=1]
47 ; CHECK: %C = icmp slt i8 %SB, -17
51 define i1 @lt_unsigned_to_large_unsigned(i8 %SB) {
52 %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
53 %C = icmp ult i32 %Y, 1024 ; <i1> [#uses=1]
58 define i1 @lt_unsigned_to_large_signed(i8 %SB) {
59 %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
60 %C = icmp slt i32 %Y, 1024 ; <i1> [#uses=1]
65 define i1 @lt_unsigned_to_large_negative(i8 %SB) {
66 %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
67 %C = icmp slt i32 %Y, -1024 ; <i1> [#uses=1]
72 define i1 @lt_unsigned_to_small_unsigned(i8 %SB) {
73 %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
74 %C = icmp ult i32 %Y, 17 ; <i1> [#uses=1]
76 ; CHECK: %C = icmp ult i8 %SB, 17
80 define i1 @lt_unsigned_to_small_negative(i8 %SB) {
81 %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
82 %C = icmp slt i32 %Y, -17 ; <i1> [#uses=1]
87 define i1 @gt_signed_to_large_unsigned(i8 %SB) {
88 %Y = sext i8 %SB to i32 ; <i32> [#uses=1]
89 %C = icmp ugt i32 %Y, 1024 ; <i1> [#uses=1]
91 ; CHECK: %C = icmp slt i8 %SB, 0
95 define i1 @gt_signed_to_large_signed(i8 %SB) {
96 %Y = sext i8 %SB to i32 ; <i32> [#uses=1]
97 %C = icmp sgt i32 %Y, 1024 ; <i1> [#uses=1]
102 define i1 @gt_signed_to_large_negative(i8 %SB) {
103 %Y = sext i8 %SB to i32 ; <i32> [#uses=1]
104 %C = icmp sgt i32 %Y, -1024 ; <i1> [#uses=1]
109 define i1 @gt_signed_to_small_signed(i8 %SB) {
110 %Y = sext i8 %SB to i32 ; <i32> [#uses=1]
111 %C = icmp sgt i32 %Y, 17 ; <i1> [#uses=1]
113 ; CHECK: %C = icmp sgt i8 %SB, 17
117 define i1 @gt_signed_to_small_negative(i8 %SB) {
118 %Y = sext i8 %SB to i32 ; <i32> [#uses=1]
119 %C = icmp sgt i32 %Y, -17 ; <i1> [#uses=1]
121 ; CHECK: %C = icmp sgt i8 %SB, -17
125 define i1 @gt_unsigned_to_large_unsigned(i8 %SB) {
126 %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
127 %C = icmp ugt i32 %Y, 1024 ; <i1> [#uses=1]
129 ; CHECK: ret i1 false
132 define i1 @gt_unsigned_to_large_signed(i8 %SB) {
133 %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
134 %C = icmp sgt i32 %Y, 1024 ; <i1> [#uses=1]
136 ; CHECK: ret i1 false
139 define i1 @gt_unsigned_to_large_negative(i8 %SB) {
140 %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
141 %C = icmp sgt i32 %Y, -1024 ; <i1> [#uses=1]
146 define i1 @gt_unsigned_to_small_unsigned(i8 %SB) {
147 %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
148 %C = icmp ugt i32 %Y, 17 ; <i1> [#uses=1]
150 ; CHECK: %C = icmp ugt i8 %SB, 17
154 define i1 @gt_unsigned_to_small_negative(i8 %SB) {
155 %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
156 %C = icmp sgt i32 %Y, -17 ; <i1> [#uses=1]