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