1223 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i32 @abs_abs_x01(i32 %x) {5; CHECK-LABEL: @abs_abs_x01(6; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)7; CHECK-NEXT: ret i32 [[COND]]8;9 %cmp = icmp sgt i32 %x, -110 %sub = sub nsw i32 0, %x11 %cond = select i1 %cmp, i32 %x, i32 %sub12 %cmp1 = icmp sgt i32 %cond, -113 %sub16 = sub nsw i32 0, %cond14 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub1615 ret i32 %cond1816}17 18define <2 x i32> @abs_abs_x01_vec(<2 x i32> %x) {19; CHECK-LABEL: @abs_abs_x01_vec(20; CHECK-NEXT: [[COND:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[X:%.*]], i1 true)21; CHECK-NEXT: ret <2 x i32> [[COND]]22;23 %cmp = icmp sgt <2 x i32> %x, <i32 -1, i32 -1>24 %sub = sub nsw <2 x i32> zeroinitializer, %x25 %cond = select <2 x i1> %cmp, <2 x i32> %x, <2 x i32> %sub26 %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>27 %sub16 = sub nsw <2 x i32> zeroinitializer, %cond28 %cond18 = select <2 x i1> %cmp1, <2 x i32> %cond, <2 x i32> %sub1629 ret <2 x i32> %cond1830}31 32define i32 @abs_abs_x02(i32 %x) {33; CHECK-LABEL: @abs_abs_x02(34; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)35; CHECK-NEXT: ret i32 [[COND]]36;37 %cmp = icmp sgt i32 %x, 038 %sub = sub nsw i32 0, %x39 %cond = select i1 %cmp, i32 %x, i32 %sub40 %cmp1 = icmp sgt i32 %cond, -141 %sub16 = sub nsw i32 0, %cond42 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub1643 ret i32 %cond1844}45 46define i32 @abs_abs_x03(i32 %x) {47; CHECK-LABEL: @abs_abs_x03(48; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)49; CHECK-NEXT: ret i32 [[COND]]50;51 %cmp = icmp slt i32 %x, 052 %sub = sub nsw i32 0, %x53 %cond = select i1 %cmp, i32 %sub, i32 %x54 %cmp1 = icmp sgt i32 %cond, -155 %sub16 = sub nsw i32 0, %cond56 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub1657 ret i32 %cond1858}59 60define i32 @abs_abs_x04(i32 %x) {61; CHECK-LABEL: @abs_abs_x04(62; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)63; CHECK-NEXT: ret i32 [[COND]]64;65 %cmp = icmp slt i32 %x, 166 %sub = sub nsw i32 0, %x67 %cond = select i1 %cmp, i32 %sub, i32 %x68 %cmp1 = icmp sgt i32 %cond, -169 %sub16 = sub nsw i32 0, %cond70 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub1671 ret i32 %cond1872}73 74define <2 x i32> @abs_abs_x04_vec(<2 x i32> %x) {75; CHECK-LABEL: @abs_abs_x04_vec(76; CHECK-NEXT: [[COND:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[X:%.*]], i1 true)77; CHECK-NEXT: ret <2 x i32> [[COND]]78;79 %cmp = icmp slt <2 x i32> %x, <i32 1, i32 1>80 %sub = sub nsw <2 x i32> zeroinitializer, %x81 %cond = select <2 x i1> %cmp, <2 x i32> %sub, <2 x i32> %x82 %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>83 %sub16 = sub nsw <2 x i32> zeroinitializer, %cond84 %cond18 = select <2 x i1> %cmp1, <2 x i32> %cond, <2 x i32> %sub1685 ret <2 x i32> %cond1886}87 88define i32 @abs_abs_x05(i32 %x) {89; CHECK-LABEL: @abs_abs_x05(90; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)91; CHECK-NEXT: ret i32 [[COND]]92;93 %cmp = icmp sgt i32 %x, -194 %sub = sub nsw i32 0, %x95 %cond = select i1 %cmp, i32 %x, i32 %sub96 %cmp1 = icmp sgt i32 %cond, 097 %sub16 = sub nsw i32 0, %cond98 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub1699 ret i32 %cond18100}101 102define i32 @abs_abs_x06(i32 %x) {103; CHECK-LABEL: @abs_abs_x06(104; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)105; CHECK-NEXT: ret i32 [[COND]]106;107 %cmp = icmp sgt i32 %x, 0108 %sub = sub nsw i32 0, %x109 %cond = select i1 %cmp, i32 %x, i32 %sub110 %cmp1 = icmp sgt i32 %cond, 0111 %sub16 = sub nsw i32 0, %cond112 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16113 ret i32 %cond18114}115 116define i32 @abs_abs_x07(i32 %x) {117; CHECK-LABEL: @abs_abs_x07(118; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)119; CHECK-NEXT: ret i32 [[COND]]120;121 %cmp = icmp slt i32 %x, 0122 %sub = sub nsw i32 0, %x123 %cond = select i1 %cmp, i32 %sub, i32 %x124 %cmp1 = icmp sgt i32 %cond, 0125 %sub16 = sub nsw i32 0, %cond126 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16127 ret i32 %cond18128}129 130define i32 @abs_abs_x08(i32 %x) {131; CHECK-LABEL: @abs_abs_x08(132; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)133; CHECK-NEXT: ret i32 [[COND]]134;135 %cmp = icmp slt i32 %x, 1136 %sub = sub nsw i32 0, %x137 %cond = select i1 %cmp, i32 %sub, i32 %x138 %cmp1 = icmp sgt i32 %cond, 0139 %sub16 = sub nsw i32 0, %cond140 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16141 ret i32 %cond18142}143 144define i32 @abs_abs_x09(i32 %x) {145; CHECK-LABEL: @abs_abs_x09(146; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)147; CHECK-NEXT: ret i32 [[COND]]148;149 %cmp = icmp sgt i32 %x, -1150 %sub = sub nsw i32 0, %x151 %cond = select i1 %cmp, i32 %x, i32 %sub152 %cmp1 = icmp slt i32 %cond, 0153 %sub9 = sub nsw i32 0, %cond154 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond155 ret i32 %cond18156}157 158define i32 @abs_abs_x10(i32 %x) {159; CHECK-LABEL: @abs_abs_x10(160; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)161; CHECK-NEXT: ret i32 [[COND]]162;163 %cmp = icmp sgt i32 %x, 0164 %sub = sub nsw i32 0, %x165 %cond = select i1 %cmp, i32 %x, i32 %sub166 %cmp1 = icmp slt i32 %cond, 0167 %sub9 = sub nsw i32 0, %cond168 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond169 ret i32 %cond18170}171 172define i32 @abs_abs_x11(i32 %x) {173; CHECK-LABEL: @abs_abs_x11(174; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)175; CHECK-NEXT: ret i32 [[COND]]176;177 %cmp = icmp slt i32 %x, 0178 %sub = sub nsw i32 0, %x179 %cond = select i1 %cmp, i32 %sub, i32 %x180 %cmp1 = icmp slt i32 %cond, 0181 %sub9 = sub nsw i32 0, %cond182 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond183 ret i32 %cond18184}185 186define i32 @abs_abs_x12(i32 %x) {187; CHECK-LABEL: @abs_abs_x12(188; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)189; CHECK-NEXT: ret i32 [[COND]]190;191 %cmp = icmp slt i32 %x, 1192 %sub = sub nsw i32 0, %x193 %cond = select i1 %cmp, i32 %sub, i32 %x194 %cmp1 = icmp slt i32 %cond, 0195 %sub9 = sub nsw i32 0, %cond196 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond197 ret i32 %cond18198}199 200define i32 @abs_abs_x13(i32 %x) {201; CHECK-LABEL: @abs_abs_x13(202; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)203; CHECK-NEXT: ret i32 [[COND]]204;205 %cmp = icmp sgt i32 %x, -1206 %sub = sub nsw i32 0, %x207 %cond = select i1 %cmp, i32 %x, i32 %sub208 %cmp1 = icmp slt i32 %cond, 1209 %sub9 = sub nsw i32 0, %cond210 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond211 ret i32 %cond18212}213 214define i32 @abs_abs_x14(i32 %x) {215; CHECK-LABEL: @abs_abs_x14(216; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)217; CHECK-NEXT: ret i32 [[COND]]218;219 %cmp = icmp sgt i32 %x, 0220 %sub = sub nsw i32 0, %x221 %cond = select i1 %cmp, i32 %x, i32 %sub222 %cmp1 = icmp slt i32 %cond, 1223 %sub9 = sub nsw i32 0, %cond224 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond225 ret i32 %cond18226}227 228define i32 @abs_abs_x15(i32 %x) {229; CHECK-LABEL: @abs_abs_x15(230; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)231; CHECK-NEXT: ret i32 [[COND]]232;233 %cmp = icmp slt i32 %x, 0234 %sub = sub nsw i32 0, %x235 %cond = select i1 %cmp, i32 %sub, i32 %x236 %cmp1 = icmp slt i32 %cond, 1237 %sub9 = sub nsw i32 0, %cond238 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond239 ret i32 %cond18240}241 242define i32 @abs_abs_x16(i32 %x) {243; CHECK-LABEL: @abs_abs_x16(244; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)245; CHECK-NEXT: ret i32 [[COND]]246;247 %cmp = icmp slt i32 %x, 1248 %sub = sub nsw i32 0, %x249 %cond = select i1 %cmp, i32 %sub, i32 %x250 %cmp1 = icmp slt i32 %cond, 1251 %sub9 = sub nsw i32 0, %cond252 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond253 ret i32 %cond18254}255 256; abs(abs(-x)) -> abs(-x) -> abs(x)257define i32 @abs_abs_x17(i32 %x) {258; CHECK-LABEL: @abs_abs_x17(259; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)260; CHECK-NEXT: ret i32 [[COND]]261;262 %sub = sub nsw i32 0, %x263 %cmp = icmp sgt i32 %sub, -1264 %cond = select i1 %cmp, i32 %sub, i32 %x265 %cmp1 = icmp sgt i32 %cond, -1266 %sub16 = sub nsw i32 0, %cond267 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16268 ret i32 %cond18269}270 271; abs(abs(x - y)) -> abs(x - y)272define i32 @abs_abs_x18(i32 %x, i32 %y) {273; CHECK-LABEL: @abs_abs_x18(274; CHECK-NEXT: [[A:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]275; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[A]], i1 false)276; CHECK-NEXT: ret i32 [[COND]]277;278 %a = sub nsw i32 %x, %y279 %b = sub nsw i32 %y, %x280 %cmp = icmp sgt i32 %a, -1281 %cond = select i1 %cmp, i32 %a, i32 %b282 %cmp1 = icmp sgt i32 %cond, -1283 %sub16 = sub nsw i32 0, %cond284 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16285 ret i32 %cond18286}287 288; abs(abs(-x)) -> abs(-x) -> abs(x)289define <2 x i32> @abs_abs_x02_vec(<2 x i32> %x) {290; CHECK-LABEL: @abs_abs_x02_vec(291; CHECK-NEXT: [[COND:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[X:%.*]], i1 true)292; CHECK-NEXT: ret <2 x i32> [[COND]]293;294 %sub = sub nsw <2 x i32> zeroinitializer, %x295 %cmp = icmp sgt <2 x i32> %sub, <i32 -1, i32 -1>296 %cond = select <2 x i1> %cmp, <2 x i32> %sub, <2 x i32> %x297 %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>298 %sub16 = sub nsw <2 x i32> zeroinitializer, %cond299 %cond18 = select <2 x i1> %cmp1, <2 x i32> %cond, <2 x i32> %sub16300 ret <2 x i32> %cond18301}302 303; abs(abs(x - y)) -> abs(x - y)304define <2 x i32> @abs_abs_x03_vec(<2 x i32> %x, <2 x i32> %y) {305; CHECK-LABEL: @abs_abs_x03_vec(306; CHECK-NEXT: [[A:%.*]] = sub nsw <2 x i32> [[X:%.*]], [[Y:%.*]]307; CHECK-NEXT: [[COND:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[A]], i1 false)308; CHECK-NEXT: ret <2 x i32> [[COND]]309;310 %a = sub nsw <2 x i32> %x, %y311 %b = sub nsw <2 x i32> %y, %x312 %cmp = icmp sgt <2 x i32> %a, <i32 -1, i32 -1>313 %cond = select <2 x i1> %cmp, <2 x i32> %a, <2 x i32> %b314 %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>315 %sub16 = sub nsw <2 x i32> zeroinitializer, %cond316 %cond18 = select <2 x i1> %cmp1, <2 x i32> %cond, <2 x i32> %sub16317 ret <2 x i32> %cond18318}319 320define i32 @nabs_nabs_x01(i32 %x) {321; CHECK-LABEL: @nabs_nabs_x01(322; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)323; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[TMP1]]324; CHECK-NEXT: ret i32 [[COND18]]325;326 %cmp = icmp sgt i32 %x, -1327 %sub = sub nsw i32 0, %x328 %cond = select i1 %cmp, i32 %sub, i32 %x329 %cmp1 = icmp sgt i32 %cond, -1330 %sub9 = sub nsw i32 0, %cond331 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond332 ret i32 %cond18333}334 335define i32 @nabs_nabs_x02(i32 %x) {336; CHECK-LABEL: @nabs_nabs_x02(337; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)338; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[TMP1]]339; CHECK-NEXT: ret i32 [[COND18]]340;341 %cmp = icmp sgt i32 %x, 0342 %sub = sub nsw i32 0, %x343 %cond = select i1 %cmp, i32 %sub, i32 %x344 %cmp1 = icmp sgt i32 %cond, -1345 %sub9 = sub nsw i32 0, %cond346 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond347 ret i32 %cond18348}349 350define i32 @nabs_nabs_x03(i32 %x) {351; CHECK-LABEL: @nabs_nabs_x03(352; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)353; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[TMP1]]354; CHECK-NEXT: ret i32 [[COND18]]355;356 %cmp = icmp slt i32 %x, 0357 %sub = sub nsw i32 0, %x358 %cond = select i1 %cmp, i32 %x, i32 %sub359 %cmp1 = icmp sgt i32 %cond, -1360 %sub9 = sub nsw i32 0, %cond361 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond362 ret i32 %cond18363}364 365define i32 @nabs_nabs_x04(i32 %x) {366; CHECK-LABEL: @nabs_nabs_x04(367; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)368; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[TMP1]]369; CHECK-NEXT: ret i32 [[COND18]]370;371 %cmp = icmp slt i32 %x, 1372 %sub = sub nsw i32 0, %x373 %cond = select i1 %cmp, i32 %x, i32 %sub374 %cmp1 = icmp sgt i32 %cond, -1375 %sub9 = sub nsw i32 0, %cond376 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond377 ret i32 %cond18378}379 380define i32 @nabs_nabs_x05(i32 %x) {381; CHECK-LABEL: @nabs_nabs_x05(382; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)383; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[TMP1]]384; CHECK-NEXT: ret i32 [[COND18]]385;386 %cmp = icmp sgt i32 %x, -1387 %sub = sub nsw i32 0, %x388 %cond = select i1 %cmp, i32 %sub, i32 %x389 %cmp1 = icmp sgt i32 %cond, 0390 %sub9 = sub nsw i32 0, %cond391 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond392 ret i32 %cond18393}394 395define i32 @nabs_nabs_x06(i32 %x) {396; CHECK-LABEL: @nabs_nabs_x06(397; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)398; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[TMP1]]399; CHECK-NEXT: ret i32 [[COND18]]400;401 %cmp = icmp sgt i32 %x, 0402 %sub = sub nsw i32 0, %x403 %cond = select i1 %cmp, i32 %sub, i32 %x404 %cmp1 = icmp sgt i32 %cond, 0405 %sub9 = sub nsw i32 0, %cond406 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond407 ret i32 %cond18408}409 410define i32 @nabs_nabs_x07(i32 %x) {411; CHECK-LABEL: @nabs_nabs_x07(412; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)413; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[TMP1]]414; CHECK-NEXT: ret i32 [[COND18]]415;416 %cmp = icmp slt i32 %x, 0417 %sub = sub nsw i32 0, %x418 %cond = select i1 %cmp, i32 %x, i32 %sub419 %cmp1 = icmp sgt i32 %cond, 0420 %sub9 = sub nsw i32 0, %cond421 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond422 ret i32 %cond18423}424 425define i32 @nabs_nabs_x08(i32 %x) {426; CHECK-LABEL: @nabs_nabs_x08(427; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)428; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[TMP1]]429; CHECK-NEXT: ret i32 [[COND18]]430;431 %cmp = icmp slt i32 %x, 1432 %sub = sub nsw i32 0, %x433 %cond = select i1 %cmp, i32 %x, i32 %sub434 %cmp1 = icmp sgt i32 %cond, 0435 %sub9 = sub nsw i32 0, %cond436 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond437 ret i32 %cond18438}439 440define i32 @nabs_nabs_x09(i32 %x) {441; CHECK-LABEL: @nabs_nabs_x09(442; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)443; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[TMP1]]444; CHECK-NEXT: ret i32 [[COND18]]445;446 %cmp = icmp sgt i32 %x, -1447 %sub = sub nsw i32 0, %x448 %cond = select i1 %cmp, i32 %sub, i32 %x449 %cmp1 = icmp slt i32 %cond, 0450 %sub16 = sub nsw i32 0, %cond451 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16452 ret i32 %cond18453}454 455define i32 @nabs_nabs_x10(i32 %x) {456; CHECK-LABEL: @nabs_nabs_x10(457; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)458; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[TMP1]]459; CHECK-NEXT: ret i32 [[COND18]]460;461 %cmp = icmp sgt i32 %x, 0462 %sub = sub nsw i32 0, %x463 %cond = select i1 %cmp, i32 %sub, i32 %x464 %cmp1 = icmp slt i32 %cond, 0465 %sub16 = sub nsw i32 0, %cond466 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16467 ret i32 %cond18468}469 470define i32 @nabs_nabs_x11(i32 %x) {471; CHECK-LABEL: @nabs_nabs_x11(472; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)473; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[TMP1]]474; CHECK-NEXT: ret i32 [[COND18]]475;476 %cmp = icmp slt i32 %x, 0477 %sub = sub nsw i32 0, %x478 %cond = select i1 %cmp, i32 %x, i32 %sub479 %cmp1 = icmp slt i32 %cond, 0480 %sub16 = sub nsw i32 0, %cond481 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16482 ret i32 %cond18483}484 485define i32 @nabs_nabs_x12(i32 %x) {486; CHECK-LABEL: @nabs_nabs_x12(487; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)488; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[TMP1]]489; CHECK-NEXT: ret i32 [[COND18]]490;491 %cmp = icmp slt i32 %x, 1492 %sub = sub nsw i32 0, %x493 %cond = select i1 %cmp, i32 %x, i32 %sub494 %cmp1 = icmp slt i32 %cond, 0495 %sub16 = sub nsw i32 0, %cond496 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16497 ret i32 %cond18498}499 500define i32 @nabs_nabs_x13(i32 %x) {501; CHECK-LABEL: @nabs_nabs_x13(502; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)503; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[TMP1]]504; CHECK-NEXT: ret i32 [[COND18]]505;506 %cmp = icmp sgt i32 %x, -1507 %sub = sub nsw i32 0, %x508 %cond = select i1 %cmp, i32 %sub, i32 %x509 %cmp1 = icmp slt i32 %cond, 1510 %sub16 = sub nsw i32 0, %cond511 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16512 ret i32 %cond18513}514 515define i32 @nabs_nabs_x14(i32 %x) {516; CHECK-LABEL: @nabs_nabs_x14(517; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)518; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[TMP1]]519; CHECK-NEXT: ret i32 [[COND18]]520;521 %cmp = icmp sgt i32 %x, 0522 %sub = sub nsw i32 0, %x523 %cond = select i1 %cmp, i32 %sub, i32 %x524 %cmp1 = icmp slt i32 %cond, 1525 %sub16 = sub nsw i32 0, %cond526 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16527 ret i32 %cond18528}529 530define i32 @nabs_nabs_x15(i32 %x) {531; CHECK-LABEL: @nabs_nabs_x15(532; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)533; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[TMP1]]534; CHECK-NEXT: ret i32 [[COND18]]535;536 %cmp = icmp slt i32 %x, 0537 %sub = sub nsw i32 0, %x538 %cond = select i1 %cmp, i32 %x, i32 %sub539 %cmp1 = icmp slt i32 %cond, 1540 %sub16 = sub nsw i32 0, %cond541 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16542 ret i32 %cond18543}544 545define i32 @nabs_nabs_x16(i32 %x) {546; CHECK-LABEL: @nabs_nabs_x16(547; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)548; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[TMP1]]549; CHECK-NEXT: ret i32 [[COND18]]550;551 %cmp = icmp slt i32 %x, 1552 %sub = sub nsw i32 0, %x553 %cond = select i1 %cmp, i32 %x, i32 %sub554 %cmp1 = icmp slt i32 %cond, 1555 %sub16 = sub nsw i32 0, %cond556 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16557 ret i32 %cond18558}559 560; nabs(nabs(-x)) -> nabs(-x) -> nabs(x)561define i32 @nabs_nabs_x17(i32 %x) {562; CHECK-LABEL: @nabs_nabs_x17(563; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)564; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[TMP1]]565; CHECK-NEXT: ret i32 [[COND18]]566;567 %sub = sub nsw i32 0, %x568 %cmp = icmp sgt i32 %sub, -1569 %cond = select i1 %cmp, i32 %x, i32 %sub570 %cmp1 = icmp sgt i32 %cond, -1571 %sub16 = sub nsw i32 0, %cond572 %cond18 = select i1 %cmp1, i32 %sub16, i32 %cond573 ret i32 %cond18574}575 576; nabs(nabs(x - y)) -> nabs(x - y)577define i32 @nabs_nabs_x18(i32 %x, i32 %y) {578; CHECK-LABEL: @nabs_nabs_x18(579; CHECK-NEXT: [[A:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]580; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[A]], i1 false)581; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[TMP1]]582; CHECK-NEXT: ret i32 [[COND18]]583;584 %a = sub nsw i32 %x, %y585 %b = sub nsw i32 %y, %x586 %cmp = icmp sgt i32 %a, -1587 %cond = select i1 %cmp, i32 %b, i32 %a588 %cmp1 = icmp sgt i32 %cond, -1589 %sub16 = sub nsw i32 0, %cond590 %cond18 = select i1 %cmp1, i32 %sub16, i32 %cond591 ret i32 %cond18592}593 594; nabs(nabs(-x)) -> nabs(-x) -> nabs(x)595define <2 x i32> @nabs_nabs_x01_vec(<2 x i32> %x) {596; CHECK-LABEL: @nabs_nabs_x01_vec(597; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[X:%.*]], i1 false)598; CHECK-NEXT: [[COND18:%.*]] = sub <2 x i32> zeroinitializer, [[TMP1]]599; CHECK-NEXT: ret <2 x i32> [[COND18]]600;601 %sub = sub nsw <2 x i32> zeroinitializer, %x602 %cmp = icmp sgt <2 x i32> %sub, <i32 -1, i32 -1>603 %cond = select <2 x i1> %cmp, <2 x i32> %x, <2 x i32> %sub604 %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>605 %sub16 = sub nsw <2 x i32> zeroinitializer, %cond606 %cond18 = select <2 x i1> %cmp1, <2 x i32> %sub16, <2 x i32> %cond607 ret <2 x i32> %cond18608}609 610; nabs(nabs(x - y)) -> nabs(x - y)611define <2 x i32> @nabs_nabs_x02_vec(<2 x i32> %x, <2 x i32> %y) {612; CHECK-LABEL: @nabs_nabs_x02_vec(613; CHECK-NEXT: [[A:%.*]] = sub nsw <2 x i32> [[X:%.*]], [[Y:%.*]]614; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[A]], i1 false)615; CHECK-NEXT: [[COND18:%.*]] = sub <2 x i32> zeroinitializer, [[TMP1]]616; CHECK-NEXT: ret <2 x i32> [[COND18]]617;618 %a = sub nsw <2 x i32> %x, %y619 %b = sub nsw <2 x i32> %y, %x620 %cmp = icmp sgt <2 x i32> %a, <i32 -1, i32 -1>621 %cond = select <2 x i1> %cmp, <2 x i32> %b, <2 x i32> %a622 %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>623 %sub16 = sub nsw <2 x i32> zeroinitializer, %cond624 %cond18 = select <2 x i1> %cmp1, <2 x i32> %sub16, <2 x i32> %cond625 ret <2 x i32> %cond18626}627 628define i32 @abs_nabs_x01(i32 %x) {629; CHECK-LABEL: @abs_nabs_x01(630; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)631; CHECK-NEXT: ret i32 [[TMP1]]632;633 %cmp = icmp sgt i32 %x, -1634 %sub = sub nsw i32 0, %x635 %cond = select i1 %cmp, i32 %sub, i32 %x636 %cmp1 = icmp sgt i32 %cond, -1637 %sub16 = sub nsw i32 0, %cond638 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16639 ret i32 %cond18640}641 642define i32 @abs_nabs_x02(i32 %x) {643; CHECK-LABEL: @abs_nabs_x02(644; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)645; CHECK-NEXT: ret i32 [[TMP1]]646;647 %cmp = icmp sgt i32 %x, 0648 %sub = sub nsw i32 0, %x649 %cond = select i1 %cmp, i32 %sub, i32 %x650 %cmp1 = icmp sgt i32 %cond, -1651 %sub16 = sub nsw i32 0, %cond652 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16653 ret i32 %cond18654}655 656define i32 @abs_nabs_x03(i32 %x) {657; CHECK-LABEL: @abs_nabs_x03(658; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)659; CHECK-NEXT: ret i32 [[TMP1]]660;661 %cmp = icmp slt i32 %x, 0662 %sub = sub nsw i32 0, %x663 %cond = select i1 %cmp, i32 %x, i32 %sub664 %cmp1 = icmp sgt i32 %cond, -1665 %sub16 = sub nsw i32 0, %cond666 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16667 ret i32 %cond18668}669 670define i32 @abs_nabs_x04(i32 %x) {671; CHECK-LABEL: @abs_nabs_x04(672; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)673; CHECK-NEXT: ret i32 [[TMP1]]674;675 %cmp = icmp slt i32 %x, 1676 %sub = sub nsw i32 0, %x677 %cond = select i1 %cmp, i32 %x, i32 %sub678 %cmp1 = icmp sgt i32 %cond, -1679 %sub16 = sub nsw i32 0, %cond680 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16681 ret i32 %cond18682}683 684define i32 @abs_nabs_x05(i32 %x) {685; CHECK-LABEL: @abs_nabs_x05(686; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)687; CHECK-NEXT: ret i32 [[TMP1]]688;689 %cmp = icmp sgt i32 %x, -1690 %sub = sub nsw i32 0, %x691 %cond = select i1 %cmp, i32 %sub, i32 %x692 %cmp1 = icmp sgt i32 %cond, 0693 %sub16 = sub nsw i32 0, %cond694 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16695 ret i32 %cond18696}697 698define i32 @abs_nabs_x06(i32 %x) {699; CHECK-LABEL: @abs_nabs_x06(700; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)701; CHECK-NEXT: ret i32 [[TMP1]]702;703 %cmp = icmp sgt i32 %x, 0704 %sub = sub nsw i32 0, %x705 %cond = select i1 %cmp, i32 %sub, i32 %x706 %cmp1 = icmp sgt i32 %cond, 0707 %sub16 = sub nsw i32 0, %cond708 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16709 ret i32 %cond18710}711 712define i32 @abs_nabs_x07(i32 %x) {713; CHECK-LABEL: @abs_nabs_x07(714; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)715; CHECK-NEXT: ret i32 [[TMP1]]716;717 %cmp = icmp slt i32 %x, 0718 %sub = sub nsw i32 0, %x719 %cond = select i1 %cmp, i32 %x, i32 %sub720 %cmp1 = icmp sgt i32 %cond, 0721 %sub16 = sub nsw i32 0, %cond722 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16723 ret i32 %cond18724}725 726define i32 @abs_nabs_x08(i32 %x) {727; CHECK-LABEL: @abs_nabs_x08(728; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)729; CHECK-NEXT: ret i32 [[TMP1]]730;731 %cmp = icmp slt i32 %x, 1732 %sub = sub nsw i32 0, %x733 %cond = select i1 %cmp, i32 %x, i32 %sub734 %cmp1 = icmp sgt i32 %cond, 0735 %sub16 = sub nsw i32 0, %cond736 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16737 ret i32 %cond18738}739 740define i32 @abs_nabs_x09(i32 %x) {741; CHECK-LABEL: @abs_nabs_x09(742; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)743; CHECK-NEXT: ret i32 [[TMP1]]744;745 %cmp = icmp sgt i32 %x, -1746 %sub = sub nsw i32 0, %x747 %cond = select i1 %cmp, i32 %sub, i32 %x748 %cmp1 = icmp slt i32 %cond, 0749 %sub9 = sub nsw i32 0, %cond750 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond751 ret i32 %cond18752}753 754define i32 @abs_nabs_x10(i32 %x) {755; CHECK-LABEL: @abs_nabs_x10(756; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)757; CHECK-NEXT: ret i32 [[TMP1]]758;759 %cmp = icmp sgt i32 %x, 0760 %sub = sub nsw i32 0, %x761 %cond = select i1 %cmp, i32 %sub, i32 %x762 %cmp1 = icmp slt i32 %cond, 0763 %sub9 = sub nsw i32 0, %cond764 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond765 ret i32 %cond18766}767 768define i32 @abs_nabs_x11(i32 %x) {769; CHECK-LABEL: @abs_nabs_x11(770; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)771; CHECK-NEXT: ret i32 [[TMP1]]772;773 %cmp = icmp slt i32 %x, 0774 %sub = sub nsw i32 0, %x775 %cond = select i1 %cmp, i32 %x, i32 %sub776 %cmp1 = icmp slt i32 %cond, 0777 %sub9 = sub nsw i32 0, %cond778 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond779 ret i32 %cond18780}781 782define i32 @abs_nabs_x12(i32 %x) {783; CHECK-LABEL: @abs_nabs_x12(784; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)785; CHECK-NEXT: ret i32 [[TMP1]]786;787 %cmp = icmp slt i32 %x, 1788 %sub = sub nsw i32 0, %x789 %cond = select i1 %cmp, i32 %x, i32 %sub790 %cmp1 = icmp slt i32 %cond, 0791 %sub9 = sub nsw i32 0, %cond792 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond793 ret i32 %cond18794}795 796define i32 @abs_nabs_x13(i32 %x) {797; CHECK-LABEL: @abs_nabs_x13(798; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)799; CHECK-NEXT: ret i32 [[TMP1]]800;801 %cmp = icmp sgt i32 %x, -1802 %sub = sub nsw i32 0, %x803 %cond = select i1 %cmp, i32 %sub, i32 %x804 %cmp1 = icmp slt i32 %cond, 1805 %sub9 = sub nsw i32 0, %cond806 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond807 ret i32 %cond18808}809 810define i32 @abs_nabs_x14(i32 %x) {811; CHECK-LABEL: @abs_nabs_x14(812; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)813; CHECK-NEXT: ret i32 [[TMP1]]814;815 %cmp = icmp sgt i32 %x, 0816 %sub = sub nsw i32 0, %x817 %cond = select i1 %cmp, i32 %sub, i32 %x818 %cmp1 = icmp slt i32 %cond, 1819 %sub9 = sub nsw i32 0, %cond820 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond821 ret i32 %cond18822}823 824define i32 @abs_nabs_x15(i32 %x) {825; CHECK-LABEL: @abs_nabs_x15(826; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)827; CHECK-NEXT: ret i32 [[TMP1]]828;829 %cmp = icmp slt i32 %x, 0830 %sub = sub nsw i32 0, %x831 %cond = select i1 %cmp, i32 %x, i32 %sub832 %cmp1 = icmp slt i32 %cond, 1833 %sub9 = sub nsw i32 0, %cond834 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond835 ret i32 %cond18836}837 838define i32 @abs_nabs_x16(i32 %x) {839; CHECK-LABEL: @abs_nabs_x16(840; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)841; CHECK-NEXT: ret i32 [[TMP1]]842;843 %cmp = icmp slt i32 %x, 1844 %sub = sub nsw i32 0, %x845 %cond = select i1 %cmp, i32 %x, i32 %sub846 %cmp1 = icmp slt i32 %cond, 1847 %sub9 = sub nsw i32 0, %cond848 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond849 ret i32 %cond18850}851 852; abs(nabs(-x)) -> abs(-x) -> abs(x)853define i32 @abs_nabs_x17(i32 %x) {854; CHECK-LABEL: @abs_nabs_x17(855; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)856; CHECK-NEXT: ret i32 [[TMP1]]857;858 %sub = sub nsw i32 0, %x859 %cmp = icmp sgt i32 %sub, -1860 %cond = select i1 %cmp, i32 %x, i32 %sub861 %cmp1 = icmp sgt i32 %cond, -1862 %sub16 = sub nsw i32 0, %cond863 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16864 ret i32 %cond18865}866 867; abs(nabs(x - y)) -> abs(x - y)868define i32 @abs_nabs_x18(i32 %x, i32 %y) {869; CHECK-LABEL: @abs_nabs_x18(870; CHECK-NEXT: [[A:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]871; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.abs.i32(i32 [[A]], i1 false)872; CHECK-NEXT: ret i32 [[TMP1]]873;874 %a = sub nsw i32 %x, %y875 %b = sub nsw i32 %y, %x876 %cmp = icmp sgt i32 %a, -1877 %cond = select i1 %cmp, i32 %b, i32 %a878 %cmp1 = icmp sgt i32 %cond, -1879 %sub16 = sub nsw i32 0, %cond880 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub16881 ret i32 %cond18882}883 884; abs(nabs(-x)) -> abs(-x) -> abs(x)885define <2 x i32> @abs_nabs_x01_vec(<2 x i32> %x) {886; CHECK-LABEL: @abs_nabs_x01_vec(887; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[X:%.*]], i1 false)888; CHECK-NEXT: ret <2 x i32> [[TMP1]]889;890 %sub = sub nsw <2 x i32> zeroinitializer, %x891 %cmp = icmp sgt <2 x i32> %sub, <i32 -1, i32 -1>892 %cond = select <2 x i1> %cmp, <2 x i32> %x, <2 x i32> %sub893 %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>894 %sub16 = sub nsw <2 x i32> zeroinitializer, %cond895 %cond18 = select <2 x i1> %cmp1, <2 x i32> %cond, <2 x i32> %sub16896 ret <2 x i32> %cond18897}898 899; abs(nabs(x - y)) -> abs(x - y)900define <2 x i32> @abs_nabs_x02_vec(<2 x i32> %x, <2 x i32> %y) {901; CHECK-LABEL: @abs_nabs_x02_vec(902; CHECK-NEXT: [[A:%.*]] = sub nsw <2 x i32> [[X:%.*]], [[Y:%.*]]903; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[A]], i1 false)904; CHECK-NEXT: ret <2 x i32> [[TMP1]]905;906 %a = sub nsw <2 x i32> %x, %y907 %b = sub nsw <2 x i32> %y, %x908 %cmp = icmp sgt <2 x i32> %a, <i32 -1, i32 -1>909 %cond = select <2 x i1> %cmp, <2 x i32> %b, <2 x i32> %a910 %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>911 %sub16 = sub nsw <2 x i32> zeroinitializer, %cond912 %cond18 = select <2 x i1> %cmp1, <2 x i32> %cond, <2 x i32> %sub16913 ret <2 x i32> %cond18914}915 916define i32 @nabs_abs_x01(i32 %x) {917; CHECK-LABEL: @nabs_abs_x01(918; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)919; CHECK-NEXT: [[SUB9:%.*]] = sub nsw i32 0, [[COND]]920; CHECK-NEXT: ret i32 [[SUB9]]921;922 %cmp = icmp sgt i32 %x, -1923 %sub = sub nsw i32 0, %x924 %cond = select i1 %cmp, i32 %x, i32 %sub925 %cmp1 = icmp sgt i32 %cond, -1926 %sub9 = sub nsw i32 0, %cond927 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond928 ret i32 %cond18929}930 931define i32 @nabs_abs_x02(i32 %x) {932; CHECK-LABEL: @nabs_abs_x02(933; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)934; CHECK-NEXT: [[SUB9:%.*]] = sub nsw i32 0, [[COND]]935; CHECK-NEXT: ret i32 [[SUB9]]936;937 %cmp = icmp sgt i32 %x, 0938 %sub = sub nsw i32 0, %x939 %cond = select i1 %cmp, i32 %x, i32 %sub940 %cmp1 = icmp sgt i32 %cond, -1941 %sub9 = sub nsw i32 0, %cond942 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond943 ret i32 %cond18944}945 946define i32 @nabs_abs_x03(i32 %x) {947; CHECK-LABEL: @nabs_abs_x03(948; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)949; CHECK-NEXT: [[SUB9:%.*]] = sub nsw i32 0, [[COND]]950; CHECK-NEXT: ret i32 [[SUB9]]951;952 %cmp = icmp slt i32 %x, 0953 %sub = sub nsw i32 0, %x954 %cond = select i1 %cmp, i32 %sub, i32 %x955 %cmp1 = icmp sgt i32 %cond, -1956 %sub9 = sub nsw i32 0, %cond957 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond958 ret i32 %cond18959}960 961define i32 @nabs_abs_x04(i32 %x) {962; CHECK-LABEL: @nabs_abs_x04(963; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)964; CHECK-NEXT: [[SUB9:%.*]] = sub nsw i32 0, [[COND]]965; CHECK-NEXT: ret i32 [[SUB9]]966;967 %cmp = icmp slt i32 %x, 1968 %sub = sub nsw i32 0, %x969 %cond = select i1 %cmp, i32 %sub, i32 %x970 %cmp1 = icmp sgt i32 %cond, -1971 %sub9 = sub nsw i32 0, %cond972 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond973 ret i32 %cond18974}975 976define i32 @nabs_abs_x05(i32 %x) {977; CHECK-LABEL: @nabs_abs_x05(978; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)979; CHECK-NEXT: [[SUB9:%.*]] = sub nsw i32 0, [[COND]]980; CHECK-NEXT: ret i32 [[SUB9]]981;982 %cmp = icmp sgt i32 %x, -1983 %sub = sub nsw i32 0, %x984 %cond = select i1 %cmp, i32 %x, i32 %sub985 %cmp1 = icmp sgt i32 %cond, 0986 %sub9 = sub nsw i32 0, %cond987 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond988 ret i32 %cond18989}990 991define i32 @nabs_abs_x06(i32 %x) {992; CHECK-LABEL: @nabs_abs_x06(993; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)994; CHECK-NEXT: [[SUB9:%.*]] = sub nsw i32 0, [[COND]]995; CHECK-NEXT: ret i32 [[SUB9]]996;997 %cmp = icmp sgt i32 %x, 0998 %sub = sub nsw i32 0, %x999 %cond = select i1 %cmp, i32 %x, i32 %sub1000 %cmp1 = icmp sgt i32 %cond, 01001 %sub9 = sub nsw i32 0, %cond1002 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond1003 ret i32 %cond181004}1005 1006define i32 @nabs_abs_x07(i32 %x) {1007; CHECK-LABEL: @nabs_abs_x07(1008; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)1009; CHECK-NEXT: [[SUB9:%.*]] = sub nsw i32 0, [[COND]]1010; CHECK-NEXT: ret i32 [[SUB9]]1011;1012 %cmp = icmp slt i32 %x, 01013 %sub = sub nsw i32 0, %x1014 %cond = select i1 %cmp, i32 %sub, i32 %x1015 %cmp1 = icmp sgt i32 %cond, 01016 %sub9 = sub nsw i32 0, %cond1017 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond1018 ret i32 %cond181019}1020 1021define i32 @nabs_abs_x08(i32 %x) {1022; CHECK-LABEL: @nabs_abs_x08(1023; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)1024; CHECK-NEXT: [[SUB9:%.*]] = sub nsw i32 0, [[COND]]1025; CHECK-NEXT: ret i32 [[SUB9]]1026;1027 %cmp = icmp slt i32 %x, 11028 %sub = sub nsw i32 0, %x1029 %cond = select i1 %cmp, i32 %sub, i32 %x1030 %cmp1 = icmp sgt i32 %cond, 01031 %sub9 = sub nsw i32 0, %cond1032 %cond18 = select i1 %cmp1, i32 %sub9, i32 %cond1033 ret i32 %cond181034}1035 1036define i32 @nabs_abs_x09(i32 %x) {1037; CHECK-LABEL: @nabs_abs_x09(1038; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)1039; CHECK-NEXT: [[SUB16:%.*]] = sub nsw i32 0, [[COND]]1040; CHECK-NEXT: ret i32 [[SUB16]]1041;1042 %cmp = icmp sgt i32 %x, -11043 %sub = sub nsw i32 0, %x1044 %cond = select i1 %cmp, i32 %x, i32 %sub1045 %cmp1 = icmp slt i32 %cond, 01046 %sub16 = sub nsw i32 0, %cond1047 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub161048 ret i32 %cond181049}1050 1051define i32 @nabs_abs_x10(i32 %x) {1052; CHECK-LABEL: @nabs_abs_x10(1053; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)1054; CHECK-NEXT: [[SUB16:%.*]] = sub nsw i32 0, [[COND]]1055; CHECK-NEXT: ret i32 [[SUB16]]1056;1057 %cmp = icmp sgt i32 %x, 01058 %sub = sub nsw i32 0, %x1059 %cond = select i1 %cmp, i32 %x, i32 %sub1060 %cmp1 = icmp slt i32 %cond, 01061 %sub16 = sub nsw i32 0, %cond1062 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub161063 ret i32 %cond181064}1065 1066define i32 @nabs_abs_x11(i32 %x) {1067; CHECK-LABEL: @nabs_abs_x11(1068; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)1069; CHECK-NEXT: [[SUB16:%.*]] = sub nsw i32 0, [[COND]]1070; CHECK-NEXT: ret i32 [[SUB16]]1071;1072 %cmp = icmp slt i32 %x, 01073 %sub = sub nsw i32 0, %x1074 %cond = select i1 %cmp, i32 %sub, i32 %x1075 %cmp1 = icmp slt i32 %cond, 01076 %sub16 = sub nsw i32 0, %cond1077 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub161078 ret i32 %cond181079}1080 1081define i32 @nabs_abs_x12(i32 %x) {1082; CHECK-LABEL: @nabs_abs_x12(1083; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)1084; CHECK-NEXT: [[SUB16:%.*]] = sub nsw i32 0, [[COND]]1085; CHECK-NEXT: ret i32 [[SUB16]]1086;1087 %cmp = icmp slt i32 %x, 11088 %sub = sub nsw i32 0, %x1089 %cond = select i1 %cmp, i32 %sub, i32 %x1090 %cmp1 = icmp slt i32 %cond, 01091 %sub16 = sub nsw i32 0, %cond1092 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub161093 ret i32 %cond181094}1095 1096define i32 @nabs_abs_x13(i32 %x) {1097; CHECK-LABEL: @nabs_abs_x13(1098; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)1099; CHECK-NEXT: [[SUB16:%.*]] = sub nsw i32 0, [[COND]]1100; CHECK-NEXT: ret i32 [[SUB16]]1101;1102 %cmp = icmp sgt i32 %x, -11103 %sub = sub nsw i32 0, %x1104 %cond = select i1 %cmp, i32 %x, i32 %sub1105 %cmp1 = icmp slt i32 %cond, 11106 %sub16 = sub nsw i32 0, %cond1107 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub161108 ret i32 %cond181109}1110 1111define i32 @nabs_abs_x14(i32 %x) {1112; CHECK-LABEL: @nabs_abs_x14(1113; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)1114; CHECK-NEXT: [[SUB16:%.*]] = sub nsw i32 0, [[COND]]1115; CHECK-NEXT: ret i32 [[SUB16]]1116;1117 %cmp = icmp sgt i32 %x, 01118 %sub = sub nsw i32 0, %x1119 %cond = select i1 %cmp, i32 %x, i32 %sub1120 %cmp1 = icmp slt i32 %cond, 11121 %sub16 = sub nsw i32 0, %cond1122 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub161123 ret i32 %cond181124}1125 1126define i32 @nabs_abs_x15(i32 %x) {1127; CHECK-LABEL: @nabs_abs_x15(1128; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)1129; CHECK-NEXT: [[SUB16:%.*]] = sub nsw i32 0, [[COND]]1130; CHECK-NEXT: ret i32 [[SUB16]]1131;1132 %cmp = icmp slt i32 %x, 01133 %sub = sub nsw i32 0, %x1134 %cond = select i1 %cmp, i32 %sub, i32 %x1135 %cmp1 = icmp slt i32 %cond, 11136 %sub16 = sub nsw i32 0, %cond1137 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub161138 ret i32 %cond181139}1140 1141define i32 @nabs_abs_x16(i32 %x) {1142; CHECK-LABEL: @nabs_abs_x16(1143; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)1144; CHECK-NEXT: [[SUB16:%.*]] = sub nsw i32 0, [[COND]]1145; CHECK-NEXT: ret i32 [[SUB16]]1146;1147 %cmp = icmp slt i32 %x, 11148 %sub = sub nsw i32 0, %x1149 %cond = select i1 %cmp, i32 %sub, i32 %x1150 %cmp1 = icmp slt i32 %cond, 11151 %sub16 = sub nsw i32 0, %cond1152 %cond18 = select i1 %cmp1, i32 %cond, i32 %sub161153 ret i32 %cond181154}1155 1156; nabs(abs(-x)) -> nabs(-x) -> nabs(x)1157define i32 @nabs_abs_x17(i32 %x) {1158; CHECK-LABEL: @nabs_abs_x17(1159; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)1160; CHECK-NEXT: [[SUB16:%.*]] = sub nsw i32 0, [[COND]]1161; CHECK-NEXT: ret i32 [[SUB16]]1162;1163 %sub = sub nsw i32 0, %x1164 %cmp = icmp sgt i32 %sub, -11165 %cond = select i1 %cmp, i32 %sub, i32 %x1166 %cmp1 = icmp sgt i32 %cond, -11167 %sub16 = sub nsw i32 0, %cond1168 %cond18 = select i1 %cmp1, i32 %sub16, i32 %cond1169 ret i32 %cond181170}1171 1172; nabs(abs(x - y)) -> nabs(x - y)1173define i32 @nabs_abs_x18(i32 %x, i32 %y) {1174; CHECK-LABEL: @nabs_abs_x18(1175; CHECK-NEXT: [[A:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]1176; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.abs.i32(i32 [[A]], i1 false)1177; CHECK-NEXT: [[COND18:%.*]] = sub i32 0, [[COND]]1178; CHECK-NEXT: ret i32 [[COND18]]1179;1180 %a = sub nsw i32 %x, %y1181 %b = sub nsw i32 %y, %x1182 %cmp = icmp sgt i32 %a, -11183 %cond = select i1 %cmp, i32 %a, i32 %b1184 %cmp1 = icmp sgt i32 %cond, -11185 %sub16 = sub nsw i32 0, %cond1186 %cond18 = select i1 %cmp1, i32 %sub16, i32 %cond1187 ret i32 %cond181188}1189 1190; nabs(abs(-x)) -> nabs(-x) -> nabs(x)1191define <2 x i32> @nabs_abs_x01_vec(<2 x i32> %x) {1192; CHECK-LABEL: @nabs_abs_x01_vec(1193; CHECK-NEXT: [[COND:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[X:%.*]], i1 true)1194; CHECK-NEXT: [[SUB16:%.*]] = sub nsw <2 x i32> zeroinitializer, [[COND]]1195; CHECK-NEXT: ret <2 x i32> [[SUB16]]1196;1197 %sub = sub nsw <2 x i32> zeroinitializer, %x1198 %cmp = icmp sgt <2 x i32> %sub, <i32 -1, i32 -1>1199 %cond = select <2 x i1> %cmp, <2 x i32> %sub, <2 x i32> %x1200 %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>1201 %sub16 = sub nsw <2 x i32> zeroinitializer, %cond1202 %cond18 = select <2 x i1> %cmp1, <2 x i32> %sub16, <2 x i32> %cond1203 ret <2 x i32> %cond181204}1205 1206; nabs(abs(x - y)) -> nabs(x - y)1207define <2 x i32> @nabs_abs_x02_vec(<2 x i32> %x, <2 x i32> %y) {1208; CHECK-LABEL: @nabs_abs_x02_vec(1209; CHECK-NEXT: [[A:%.*]] = sub nsw <2 x i32> [[X:%.*]], [[Y:%.*]]1210; CHECK-NEXT: [[COND:%.*]] = call <2 x i32> @llvm.abs.v2i32(<2 x i32> [[A]], i1 false)1211; CHECK-NEXT: [[COND18:%.*]] = sub <2 x i32> zeroinitializer, [[COND]]1212; CHECK-NEXT: ret <2 x i32> [[COND18]]1213;1214 %a = sub nsw <2 x i32> %x, %y1215 %b = sub nsw <2 x i32> %y, %x1216 %cmp = icmp sgt <2 x i32> %a, <i32 -1, i32 -1>1217 %cond = select <2 x i1> %cmp, <2 x i32> %a, <2 x i32> %b1218 %cmp1 = icmp sgt <2 x i32> %cond, <i32 -1, i32 -1>1219 %sub16 = sub nsw <2 x i32> zeroinitializer, %cond1220 %cond18 = select <2 x i1> %cmp1, <2 x i32> %sub16, <2 x i32> %cond1221 ret <2 x i32> %cond181222}1223