274 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i8 @add-shl-sdiv-scalar0(i8 %x) {5; CHECK-LABEL: @add-shl-sdiv-scalar0(6; CHECK-NEXT: [[RZ:%.*]] = srem i8 [[X:%.*]], 47; CHECK-NEXT: ret i8 [[RZ]]8;9 %sd = sdiv i8 %x, -410 %sl = shl i8 %sd, 211 %rz = add i8 %sl, %x12 ret i8 %rz13}14 15define i8 @add-shl-sdiv-scalar0_commuted(i8 %x) {16; CHECK-LABEL: @add-shl-sdiv-scalar0_commuted(17; CHECK-NEXT: [[RZ:%.*]] = srem i8 [[X:%.*]], 418; CHECK-NEXT: ret i8 [[RZ]]19;20 %sd = sdiv i8 %x, -421 %sl = shl i8 %sd, 222 %rz = add i8 %x, %sl23 ret i8 %rz24}25 26define i8 @add-shl-sdiv-scalar1(i8 %x) {27; CHECK-LABEL: @add-shl-sdiv-scalar1(28; CHECK-NEXT: [[RZ:%.*]] = srem i8 [[X:%.*]], 6429; CHECK-NEXT: ret i8 [[RZ]]30;31 %sd = sdiv i8 %x, -6432 %sl = shl i8 %sd, 633 %rz = add i8 %sl, %x34 ret i8 %rz35}36 37define i32 @add-shl-sdiv-scalar2(i32 %x) {38; CHECK-LABEL: @add-shl-sdiv-scalar2(39; CHECK-NEXT: [[RZ:%.*]] = srem i32 [[X:%.*]], 107374182440; CHECK-NEXT: ret i32 [[RZ]]41;42 %sd = sdiv i32 %x, -107374182443 %sl = shl i32 %sd, 3044 %rz = add i32 %sl, %x45 ret i32 %rz46}47 48; Splat vectors49 50define <3 x i8> @add-shl-sdiv-splat0(<3 x i8> %x) {51; CHECK-LABEL: @add-shl-sdiv-splat0(52; CHECK-NEXT: [[RZ:%.*]] = srem <3 x i8> [[X:%.*]], splat (i8 4)53; CHECK-NEXT: ret <3 x i8> [[RZ]]54;55 %sd = sdiv <3 x i8> %x, <i8 -4, i8 -4, i8 -4>56 %sl = shl <3 x i8> %sd, <i8 2, i8 2, i8 2>57 %rz = add <3 x i8> %sl, %x58 ret <3 x i8> %rz59}60 61define <4 x i32> @add-shl-sdiv-splat1(<4 x i32> %x) {62; CHECK-LABEL: @add-shl-sdiv-splat1(63; CHECK-NEXT: [[RZ:%.*]] = srem <4 x i32> [[X:%.*]], splat (i32 1073741824)64; CHECK-NEXT: ret <4 x i32> [[RZ]]65;66 %sd = sdiv <4 x i32> %x, <i32 -1073741824, i32 -1073741824, i32 -1073741824, i32 -1073741824>67 %sl = shl <4 x i32> %sd, <i32 30, i32 30, i32 30, i32 30>68 %rz = add <4 x i32> %sl, %x69 ret <4 x i32> %rz70}71 72define <2 x i64> @add-shl-sdiv-splat2(<2 x i64> %x) {73; CHECK-LABEL: @add-shl-sdiv-splat2(74; CHECK-NEXT: [[RZ:%.*]] = srem <2 x i64> [[X:%.*]], splat (i64 32)75; CHECK-NEXT: ret <2 x i64> [[RZ]]76;77 %sd = sdiv <2 x i64> %x, <i64 -32, i64 -32>78 %sl = shl <2 x i64> %sd, <i64 5, i64 5>79 %rz = add <2 x i64> %sl, %x80 ret <2 x i64> %rz81}82 83; One-use tests84 85declare void @use32(i32)86define i32 @add-shl-sdiv-i32-4-use0(i32 %x) {87; CHECK-LABEL: @add-shl-sdiv-i32-4-use0(88; CHECK-NEXT: call void @use32(i32 [[X:%.*]])89; CHECK-NEXT: [[RZ:%.*]] = srem i32 [[X]], 1690; CHECK-NEXT: ret i32 [[RZ]]91;92 call void @use32(i32 %x)93 %sd = sdiv i32 %x, -1694 %sl = shl i32 %sd, 495 %rz = add i32 %sl, %x96 ret i32 %rz97}98 99define i32 @add-shl-sdiv-i32-use1(i32 %x) {100; CHECK-LABEL: @add-shl-sdiv-i32-use1(101; CHECK-NEXT: [[SD:%.*]] = sdiv i32 [[X:%.*]], -16102; CHECK-NEXT: call void @use32(i32 [[SD]])103; CHECK-NEXT: [[RZ:%.*]] = srem i32 [[X]], 16104; CHECK-NEXT: ret i32 [[RZ]]105;106 %sd = sdiv i32 %x, -16107 call void @use32(i32 %sd)108 %sl = shl i32 %sd, 4109 %rz = add i32 %sl, %x110 ret i32 %rz111}112 113define i32 @add-shl-sdiv-i32-use2(i32 %x) {114; CHECK-LABEL: @add-shl-sdiv-i32-use2(115; CHECK-NEXT: [[SD:%.*]] = sdiv i32 [[X:%.*]], -16116; CHECK-NEXT: [[SL:%.*]] = shl i32 [[SD]], 4117; CHECK-NEXT: call void @use32(i32 [[SL]])118; CHECK-NEXT: [[RZ:%.*]] = srem i32 [[X]], 16119; CHECK-NEXT: ret i32 [[RZ]]120;121 %sd = sdiv i32 %x, -16122 %sl = shl i32 %sd, 4123 call void @use32(i32 %sl)124 %rz = add i32 %sl, %x125 ret i32 %rz126}127 128define i32 @add-shl-sdiv-i32-use3(i32 %x) {129; CHECK-LABEL: @add-shl-sdiv-i32-use3(130; CHECK-NEXT: [[SD:%.*]] = sdiv i32 [[X:%.*]], -16131; CHECK-NEXT: call void @use32(i32 [[SD]])132; CHECK-NEXT: [[SL:%.*]] = shl i32 [[SD]], 4133; CHECK-NEXT: call void @use32(i32 [[SL]])134; CHECK-NEXT: [[RZ:%.*]] = srem i32 [[X]], 16135; CHECK-NEXT: ret i32 [[RZ]]136;137 %sd = sdiv i32 %x, -16138 call void @use32(i32 %sd)139 %sl = shl i32 %sd, 4140 call void @use32(i32 %sl)141 %rz = add i32 %sl, %x142 ret i32 %rz143}144 145declare void @use3xi8(<3 x i8>)146define <3 x i8> @add-shl-sdiv-use4(<3 x i8> %x) {147; CHECK-LABEL: @add-shl-sdiv-use4(148; CHECK-NEXT: [[SD:%.*]] = sdiv <3 x i8> [[X:%.*]], splat (i8 -4)149; CHECK-NEXT: call void @use3xi8(<3 x i8> [[SD]])150; CHECK-NEXT: [[RZ:%.*]] = srem <3 x i8> [[X]], splat (i8 4)151; CHECK-NEXT: ret <3 x i8> [[RZ]]152;153 %sd = sdiv <3 x i8> %x, <i8 -4, i8 -4, i8 -4>154 call void @use3xi8(<3 x i8> %sd)155 %sl = shl <3 x i8> %sd, <i8 2, i8 2, i8 2>156 %rz = add <3 x i8> %sl, %x157 ret <3 x i8> %rz158}159 160; Negative161 162define i8 @add-shl-sdiv-negative0(i8 %x) {163; CHECK-LABEL: @add-shl-sdiv-negative0(164; CHECK-NEXT: [[SD:%.*]] = sdiv i8 [[X:%.*]], 4165; CHECK-NEXT: [[SL:%.*]] = shl nsw i8 [[SD]], 2166; CHECK-NEXT: [[RZ:%.*]] = add i8 [[SL]], [[X]]167; CHECK-NEXT: ret i8 [[RZ]]168;169 %sd = sdiv i8 %x, 4170 %sl = shl i8 %sd, 2171 %rz = add i8 %sl, %x172 ret i8 %rz173}174 175define i32 @add-shl-sdiv-negative1(i32 %x) {176; CHECK-LABEL: @add-shl-sdiv-negative1(177; CHECK-NEXT: [[RZ:%.*]] = sub i32 0, [[X:%.*]]178; CHECK-NEXT: ret i32 [[RZ]]179;180 %sd = sdiv i32 %x, -1181 %sl = shl i32 %sd, 1182 %rz = add i32 %sl, %x183 ret i32 %rz184}185 186define i32 @add-shl-sdiv-negative2(i32 %x) {187; CHECK-LABEL: @add-shl-sdiv-negative2(188; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[X:%.*]], -2147483648189; CHECK-NEXT: [[SL:%.*]] = select i1 [[TMP1]], i32 -2147483648, i32 0190; CHECK-NEXT: [[RZ:%.*]] = add i32 [[SL]], [[X]]191; CHECK-NEXT: ret i32 [[RZ]]192;193 %sd = sdiv i32 %x, -2147483648194 %sl = shl i32 %sd, 31195 %rz = add i32 %sl, %x196 ret i32 %rz197}198 199define <3 x i8> @add-shl-sdiv-negative3(<3 x i8> %x) {200; CHECK-LABEL: @add-shl-sdiv-negative3(201; CHECK-NEXT: [[SD:%.*]] = sdiv <3 x i8> [[X:%.*]], splat (i8 -5)202; CHECK-NEXT: [[SL:%.*]] = shl <3 x i8> [[SD]], splat (i8 2)203; CHECK-NEXT: [[RZ:%.*]] = add <3 x i8> [[SL]], [[X]]204; CHECK-NEXT: ret <3 x i8> [[RZ]]205;206 %sd = sdiv <3 x i8> %x, <i8 -5, i8 -5, i8 -5>207 %sl = shl <3 x i8> %sd, <i8 2, i8 2, i8 2>208 %rz = add <3 x i8> %sl, %x209 ret <3 x i8> %rz210}211 212define <2 x i64> @add-shl-sdiv-negative4(<2 x i64> %x) {213; CHECK-LABEL: @add-shl-sdiv-negative4(214; CHECK-NEXT: ret <2 x i64> poison215;216 %sd = sdiv <2 x i64> %x, <i64 32, i64 32>217 %sl = shl <2 x i64> %sd, <i64 -5, i64 -5>218 %rz = add <2 x i64> %sl, %x219 ret <2 x i64> %rz220}221 222; Vectors with undef values223 224define <3 x i8> @add-shl-sdiv-3xi8-undef0(<3 x i8> %x) {225; CHECK-LABEL: @add-shl-sdiv-3xi8-undef0(226; CHECK-NEXT: ret <3 x i8> poison227;228 %sd = sdiv <3 x i8> %x, <i8 -4, i8 undef, i8 -4>229 %sl = shl <3 x i8> %sd, <i8 2, i8 2, i8 2>230 %rz = add <3 x i8> %sl, %x231 ret <3 x i8> %rz232}233 234define <3 x i8> @add-shl-sdiv-3xi8-undef1(<3 x i8> %x) {235; CHECK-LABEL: @add-shl-sdiv-3xi8-undef1(236; CHECK-NEXT: [[SD:%.*]] = sdiv <3 x i8> [[X:%.*]], splat (i8 -4)237; CHECK-NEXT: [[SL:%.*]] = shl <3 x i8> [[SD]], <i8 2, i8 undef, i8 2>238; CHECK-NEXT: [[RZ:%.*]] = add <3 x i8> [[SL]], [[X]]239; CHECK-NEXT: ret <3 x i8> [[RZ]]240;241 %sd = sdiv <3 x i8> %x, <i8 -4, i8 -4, i8 -4>242 %sl = shl <3 x i8> %sd, <i8 2, i8 undef, i8 2>243 %rz = add <3 x i8> %sl, %x244 ret <3 x i8> %rz245}246 247; Non-splat vectors248 249define <2 x i64> @add-shl-sdiv-nonsplat0(<2 x i64> %x) {250; CHECK-LABEL: @add-shl-sdiv-nonsplat0(251; CHECK-NEXT: [[SD:%.*]] = sdiv <2 x i64> [[X:%.*]], <i64 -32, i64 -64>252; CHECK-NEXT: [[SL:%.*]] = shl <2 x i64> [[SD]], <i64 5, i64 6>253; CHECK-NEXT: [[RZ:%.*]] = add <2 x i64> [[SL]], [[X]]254; CHECK-NEXT: ret <2 x i64> [[RZ]]255;256 %sd = sdiv <2 x i64> %x, <i64 -32, i64 -64>257 %sl = shl <2 x i64> %sd, <i64 5, i64 6>258 %rz = add <2 x i64> %sl, %x259 ret <2 x i64> %rz260}261 262define <3 x i8> @add-shl-sdiv-nonsplat1(<3 x i8> %x) {263; CHECK-LABEL: @add-shl-sdiv-nonsplat1(264; CHECK-NEXT: [[SD:%.*]] = sdiv <3 x i8> [[X:%.*]], splat (i8 -4)265; CHECK-NEXT: [[SL:%.*]] = shl <3 x i8> [[SD]], <i8 2, i8 2, i8 3>266; CHECK-NEXT: [[RZ:%.*]] = add <3 x i8> [[SL]], [[X]]267; CHECK-NEXT: ret <3 x i8> [[RZ]]268;269 %sd = sdiv <3 x i8> %x, <i8 -4, i8 -4, i8 -4>270 %sl = shl <3 x i8> %sd, <i8 2, i8 2, i8 3>271 %rz = add <3 x i8> %sl, %x272 ret <3 x i8> %rz273}274