233 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4declare void @use(i8)5 6define i1 @fold_sext_to_and(i8 %x) {7; CHECK-LABEL: define i1 @fold_sext_to_and(8; CHECK-SAME: i8 [[X:%.*]]) {9; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X]], -12710; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP1]], 111; CHECK-NEXT: ret i1 [[TMP3]]12;13 %1 = sext i8 %x to i3214 %2 = and i32 %1, -214748364715 %3 = icmp eq i32 %2, 116 ret i1 %317}18 19define i1 @fold_sext_to_and1(i8 %x) {20; CHECK-LABEL: define i1 @fold_sext_to_and1(21; CHECK-SAME: i8 [[X:%.*]]) {22; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X]], -12723; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP1]], 124; CHECK-NEXT: ret i1 [[TMP3]]25;26 %1 = sext i8 %x to i3227 %2 = and i32 %1, -214748364728 %3 = icmp ne i32 %2, 129 ret i1 %330}31 32define i1 @fold_sext_to_and2(i8 %x) {33; CHECK-LABEL: define i1 @fold_sext_to_and2(34; CHECK-SAME: i8 [[X:%.*]]) {35; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X]], -12636; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP1]], 237; CHECK-NEXT: ret i1 [[TMP3]]38;39 %1 = sext i8 %x to i3240 %2 = and i32 %1, 107374182641 %3 = icmp eq i32 %2, 242 ret i1 %343}44 45define i1 @fold_sext_to_and3(i8 %x) {46; CHECK-LABEL: define i1 @fold_sext_to_and3(47; CHECK-SAME: i8 [[X:%.*]]) {48; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X]], -12649; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP1]], 250; CHECK-NEXT: ret i1 [[TMP3]]51;52 %1 = sext i8 %x to i3253 %2 = and i32 %1, 107374182654 %3 = icmp ne i32 %2, 255 ret i1 %356}57 58define i1 @fold_sext_to_and_multi_use(i8 %x) {59; CHECK-LABEL: define i1 @fold_sext_to_and_multi_use(60; CHECK-SAME: i8 [[X:%.*]]) {61; CHECK-NEXT: [[TMP1:%.*]] = sext i8 [[X]] to i3262; CHECK-NEXT: call void @use(i32 [[TMP1]])63; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[X]], -12764; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP2]], 165; CHECK-NEXT: ret i1 [[TMP3]]66;67 %1 = sext i8 %x to i3268 call void @use(i32 %1)69 %2 = and i32 %1, -214748364770 %3 = icmp eq i32 %2, 171 ret i1 %372}73 74define i1 @fold_sext_to_and_multi_use1(i8 %x) {75; CHECK-LABEL: define i1 @fold_sext_to_and_multi_use1(76; CHECK-SAME: i8 [[X:%.*]]) {77; CHECK-NEXT: [[TMP1:%.*]] = sext i8 [[X]] to i3278; CHECK-NEXT: call void @use(i32 [[TMP1]])79; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[X]], -12780; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP2]], 181; CHECK-NEXT: ret i1 [[TMP3]]82;83 %1 = sext i8 %x to i3284 call void @use(i32 %1)85 %2 = and i32 %1, -214748364786 %3 = icmp ne i32 %2, 187 ret i1 %388}89 90define i1 @fold_sext_to_and_multi_use2(i8 %x) {91; CHECK-LABEL: define i1 @fold_sext_to_and_multi_use2(92; CHECK-SAME: i8 [[X:%.*]]) {93; CHECK-NEXT: [[TMP1:%.*]] = sext i8 [[X]] to i3294; CHECK-NEXT: call void @use(i32 [[TMP1]])95; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[X]], -12696; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP2]], 297; CHECK-NEXT: ret i1 [[TMP3]]98;99 %1 = sext i8 %x to i32100 call void @use(i32 %1)101 %2 = and i32 %1, 1073741826102 %3 = icmp eq i32 %2, 2103 ret i1 %3104}105 106define i1 @fold_sext_to_and_multi_use3(i8 %x) {107; CHECK-LABEL: define i1 @fold_sext_to_and_multi_use3(108; CHECK-SAME: i8 [[X:%.*]]) {109; CHECK-NEXT: [[TMP1:%.*]] = sext i8 [[X]] to i32110; CHECK-NEXT: call void @use(i32 [[TMP1]])111; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[X]], -126112; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP2]], 2113; CHECK-NEXT: ret i1 [[TMP3]]114;115 %1 = sext i8 %x to i32116 call void @use(i32 %1)117 %2 = and i32 %1, 1073741826118 %3 = icmp ne i32 %2, 2119 ret i1 %3120}121 122; Negative tests123 124define i1 @fold_sext_to_and_wrong(i8 %x) {125; CHECK-LABEL: define i1 @fold_sext_to_and_wrong(126; CHECK-SAME: i8 [[X:%.*]]) {127; CHECK-NEXT: ret i1 false128;129 %1 = sext i8 %x to i32130 %2 = and i32 %1, -2147483647131 %3 = icmp eq i32 %2, -1132 ret i1 %3133}134 135define i1 @fold_sext_to_and_wrong2(i8 %x) {136; CHECK-LABEL: define i1 @fold_sext_to_and_wrong2(137; CHECK-SAME: i8 [[X:%.*]]) {138; CHECK-NEXT: ret i1 false139;140 %1 = sext i8 %x to i32141 %2 = and i32 %1, -2147483647142 %3 = icmp eq i32 %2, 128143 ret i1 %3144}145 146define i1 @fold_sext_to_and_wrong3(i8 %x) {147; CHECK-LABEL: define i1 @fold_sext_to_and_wrong3(148; CHECK-SAME: i8 [[X:%.*]]) {149; CHECK-NEXT: ret i1 false150;151 %1 = sext i8 %x to i32152 %2 = and i32 %1, 128153 %3 = icmp eq i32 %2, -2147483648154 ret i1 %3155}156 157define i1 @fold_sext_to_and_wrong4(i8 %x) {158; CHECK-LABEL: define i1 @fold_sext_to_and_wrong4(159; CHECK-SAME: i8 [[X:%.*]]) {160; CHECK-NEXT: ret i1 false161;162 %1 = sext i8 %x to i32163 %2 = and i32 %1, 128164 %3 = icmp eq i32 %2, 1165 ret i1 %3166}167 168define i1 @fold_sext_to_and_wrong5(i8 %x) {169; CHECK-LABEL: define i1 @fold_sext_to_and_wrong5(170; CHECK-SAME: i8 [[X:%.*]]) {171; CHECK-NEXT: ret i1 false172;173 %1 = sext i8 %x to i32174 %2 = and i32 %1, -256175 %3 = icmp eq i32 %2, 1176 ret i1 %3177}178 179define i1 @fold_sext_to_and_wrong6(i8 %x) {180; CHECK-LABEL: define i1 @fold_sext_to_and_wrong6(181; CHECK-SAME: i8 [[X:%.*]]) {182; CHECK-NEXT: ret i1 true183;184 %1 = sext i8 %x to i32185 %2 = and i32 %1, -2147483647186 %3 = icmp ne i32 %2, -1187 ret i1 %3188}189 190define i1 @fold_sext_to_and_wrong7(i8 %x) {191; CHECK-LABEL: define i1 @fold_sext_to_and_wrong7(192; CHECK-SAME: i8 [[X:%.*]]) {193; CHECK-NEXT: ret i1 true194;195 %1 = sext i8 %x to i32196 %2 = and i32 %1, -2147483647197 %3 = icmp ne i32 %2, 128198 ret i1 %3199}200 201define i1 @fold_sext_to_and_wrong8(i8 %x) {202; CHECK-LABEL: define i1 @fold_sext_to_and_wrong8(203; CHECK-SAME: i8 [[X:%.*]]) {204; CHECK-NEXT: ret i1 true205;206 %1 = sext i8 %x to i32207 %2 = and i32 %1, 128208 %3 = icmp ne i32 %2, -2147483648209 ret i1 %3210}211 212define i1 @fold_sext_to_and_wrong9(i8 %x) {213; CHECK-LABEL: define i1 @fold_sext_to_and_wrong9(214; CHECK-SAME: i8 [[X:%.*]]) {215; CHECK-NEXT: ret i1 true216;217 %1 = sext i8 %x to i32218 %2 = and i32 %1, 128219 %3 = icmp ne i32 %2, 1220 ret i1 %3221}222 223define i1 @fold_sext_to_and_wrong10(i8 %x) {224; CHECK-LABEL: define i1 @fold_sext_to_and_wrong10(225; CHECK-SAME: i8 [[X:%.*]]) {226; CHECK-NEXT: ret i1 true227;228 %1 = sext i8 %x to i32229 %2 = and i32 %1, -256230 %3 = icmp ne i32 %2, 1231 ret i1 %3232}233