356 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4; (X < +/-0.0) ? X : -X --> -fabs(X)5; (X <= +/-0.0) ? X : -X --> -fabs(X)6; One negative test with no fmf7define double @select_noFMF_nfabs_lt(double %x) {8; CHECK-LABEL: @select_noFMF_nfabs_lt(9; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+0010; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]11; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]]12; CHECK-NEXT: ret double [[SEL]]13;14 %cmp = fcmp olt double %x, 0.000000e+0015 %negX = fneg double %x16 %sel = select i1 %cmp, double %x, double %negX17 ret double %sel18}19 20; One test where the neg has fmfs.21define double @select_nsz_nfabs_lt_fmfProp(double %x) {22; CHECK-LABEL: @select_nsz_nfabs_lt_fmfProp(23; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])24; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]25; CHECK-NEXT: ret double [[SEL]]26;27 %cmp = fcmp olt double %x, 0.000000e+0028 %negX = fneg fast double %x29 %sel = select nsz i1 %cmp, double %x, double %negX30 ret double %sel31}32 33define double @select_nsz_nnan_nfabs_lt_fmfProp(double %x) {34; CHECK-LABEL: @select_nsz_nnan_nfabs_lt_fmfProp(35; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])36; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]37; CHECK-NEXT: ret double [[SEL]]38;39 %cmp = fcmp olt double %x, 0.000000e+0040 %negX = fneg fast double %x41 %sel = select nsz nnan i1 %cmp, double %x, double %negX42 ret double %sel43}44 45; Tests with various predicate types.46 47; This is not fabs because that could produce a different signbit for a NAN input.48; PR5927949 50define double @select_nsz_nfabs_ult(double %x) {51; CHECK-LABEL: @select_nsz_nfabs_ult(52; CHECK-NEXT: [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+0053; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]54; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]55; CHECK-NEXT: ret double [[SEL]]56;57 %cmp = fcmp ult double %x, 0.000000e+0058 %negX = fneg double %x59 %sel = select nsz i1 %cmp, double %x, double %negX60 ret double %sel61}62 63define double @select_nsz_nnan_nfabs_ult(double %x) {64; CHECK-LABEL: @select_nsz_nnan_nfabs_ult(65; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])66; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]67; CHECK-NEXT: ret double [[SEL]]68;69 %cmp = fcmp ult double %x, 0.000000e+0070 %negX = fneg double %x71 %sel = select nsz nnan i1 %cmp, double %x, double %negX72 ret double %sel73}74 75; This is not fabs because that could produce a different signbit for a NAN input.76; PR5927977 78define double @select_nsz_nfabs_ole(double %x) {79; CHECK-LABEL: @select_nsz_nfabs_ole(80; CHECK-NEXT: [[CMP:%.*]] = fcmp ole double [[X:%.*]], 0.000000e+0081; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]82; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]83; CHECK-NEXT: ret double [[SEL]]84;85 %cmp = fcmp ole double %x, 0.000000e+0086 %negX = fneg double %x87 %sel = select nsz i1 %cmp, double %x, double %negX88 ret double %sel89}90 91define double @select_nsz_nnan_nfabs_ole(double %x) {92; CHECK-LABEL: @select_nsz_nnan_nfabs_ole(93; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])94; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]95; CHECK-NEXT: ret double [[SEL]]96;97 %cmp = fcmp ole double %x, 0.000000e+0098 %negX = fneg double %x99 %sel = select nsz nnan i1 %cmp, double %x, double %negX100 ret double %sel101}102 103; This is not fabs because that could produce a different signbit for a NAN input.104; PR59279105 106define double @select_nsz_nfabs_ule(double %x) {107; CHECK-LABEL: @select_nsz_nfabs_ule(108; CHECK-NEXT: [[CMP:%.*]] = fcmp ule double [[X:%.*]], 0.000000e+00109; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]110; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]111; CHECK-NEXT: ret double [[SEL]]112;113 %cmp = fcmp ule double %x, 0.000000e+00114 %negX = fneg double %x115 %sel = select nsz i1 %cmp, double %x, double %negX116 ret double %sel117}118 119define double @select_nsz_nnan_nfabs_ule(double %x) {120; CHECK-LABEL: @select_nsz_nnan_nfabs_ule(121; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])122; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]123; CHECK-NEXT: ret double [[SEL]]124;125 %cmp = fcmp ule double %x, 0.000000e+00126 %negX = fneg double %x127 %sel = select nsz nnan i1 %cmp, double %x, double %negX128 ret double %sel129}130 131; (X > +/-0.0) ? -X : X --> -fabs(X)132; (X >= +/-0.0) ? -X : X --> -fabs(X)133; One negative test with no fmf134define double @select_noFMF_nfabs_gt(double %x) {135; CHECK-LABEL: @select_noFMF_nfabs_gt(136; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X:%.*]], 0.000000e+00137; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]138; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], double [[NEGX]], double [[X]]139; CHECK-NEXT: ret double [[SEL]]140;141 %cmp = fcmp ogt double %x, 0.000000e+00142 %negX = fneg double %x143 %sel = select i1 %cmp, double %negX, double %x144 ret double %sel145}146 147; One test where the neg has fmfs.148define double @select_nsz_nfabs_gt_fmfProp(double %x) {149; CHECK-LABEL: @select_nsz_nfabs_gt_fmfProp(150; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X:%.*]], 0.000000e+00151; CHECK-NEXT: [[NEGX:%.*]] = fneg fast double [[X]]152; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]153; CHECK-NEXT: ret double [[SEL]]154;155 %cmp = fcmp ogt double %x, 0.000000e+00156 %negX = fneg fast double %x157 %sel = select nsz i1 %cmp, double %negX, double %x158 ret double %sel159}160 161define double @select_nsz_nnan_nfabs_gt_fmfProp(double %x) {162; CHECK-LABEL: @select_nsz_nnan_nfabs_gt_fmfProp(163; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])164; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]165; CHECK-NEXT: ret double [[SEL]]166;167 %cmp = fcmp ogt double %x, 0.000000e+00168 %negX = fneg fast double %x169 %sel = select nsz nnan i1 %cmp, double %negX, double %x170 ret double %sel171}172 173; This is not fabs because that could produce a different signbit for a NAN input.174; PR59279175 176define double @select_nsz_nfabs_ogt(double %x) {177; CHECK-LABEL: @select_nsz_nfabs_ogt(178; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X:%.*]], 0.000000e+00179; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]180; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]181; CHECK-NEXT: ret double [[SEL]]182;183 %cmp = fcmp ogt double %x, 0.000000e+00184 %negX = fneg double %x185 %sel = select nsz i1 %cmp, double %negX, double %x186 ret double %sel187}188 189; Tests with various predicate types.190 191define double @select_nsz_nnan_nfabs_ogt(double %x) {192; CHECK-LABEL: @select_nsz_nnan_nfabs_ogt(193; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])194; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]195; CHECK-NEXT: ret double [[SEL]]196;197 %cmp = fcmp ogt double %x, 0.000000e+00198 %negX = fneg double %x199 %sel = select nsz nnan i1 %cmp, double %negX, double %x200 ret double %sel201}202 203; This is not fabs because that could produce a different signbit for a NAN input.204; PR59279205 206define double @select_nsz_nfabs_ugt(double %x) {207; CHECK-LABEL: @select_nsz_nfabs_ugt(208; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt double [[X:%.*]], 0.000000e+00209; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]210; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]211; CHECK-NEXT: ret double [[SEL]]212;213 %cmp = fcmp ugt double %x, 0.000000e+00214 %negX = fneg double %x215 %sel = select nsz i1 %cmp, double %negX, double %x216 ret double %sel217}218 219define double @select_nsz_nnan_nfabs_ugt(double %x) {220; CHECK-LABEL: @select_nsz_nnan_nfabs_ugt(221; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])222; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]223; CHECK-NEXT: ret double [[SEL]]224;225 %cmp = fcmp ugt double %x, 0.000000e+00226 %negX = fneg double %x227 %sel = select nsz nnan i1 %cmp, double %negX, double %x228 ret double %sel229}230 231; This is not fabs because that could produce a different signbit for a NAN input.232; PR59279233 234define double @select_nsz_nfabs_oge(double %x) {235; CHECK-LABEL: @select_nsz_nfabs_oge(236; CHECK-NEXT: [[CMP:%.*]] = fcmp oge double [[X:%.*]], 0.000000e+00237; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]238; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]239; CHECK-NEXT: ret double [[SEL]]240;241 %cmp = fcmp oge double %x, 0.000000e+00242 %negX = fneg double %x243 %sel = select nsz i1 %cmp, double %negX, double %x244 ret double %sel245}246 247define double @select_nsz_nnan_nfabs_oge(double %x) {248; CHECK-LABEL: @select_nsz_nnan_nfabs_oge(249; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])250; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]251; CHECK-NEXT: ret double [[SEL]]252;253 %cmp = fcmp oge double %x, 0.000000e+00254 %negX = fneg double %x255 %sel = select nsz nnan i1 %cmp, double %negX, double %x256 ret double %sel257}258 259; This is not fabs because that could produce a different signbit for a NAN input.260; PR59279261 262define double @select_nsz_nfabs_uge(double %x) {263; CHECK-LABEL: @select_nsz_nfabs_uge(264; CHECK-NEXT: [[CMP:%.*]] = fcmp uge double [[X:%.*]], 0.000000e+00265; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]266; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]267; CHECK-NEXT: ret double [[SEL]]268;269 %cmp = fcmp uge double %x, 0.000000e+00270 %negX = fneg double %x271 %sel = select nsz i1 %cmp, double %negX, double %x272 ret double %sel273}274 275define double @select_nsz_nnan_nfabs_uge(double %x) {276; CHECK-LABEL: @select_nsz_nnan_nfabs_uge(277; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])278; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]279; CHECK-NEXT: ret double [[SEL]]280;281 %cmp = fcmp uge double %x, 0.000000e+00282 %negX = fneg double %x283 %sel = select nsz nnan i1 %cmp, double %negX, double %x284 ret double %sel285}286 287; (X < +/-0.0) ? X : (0.0 - X) --> (0.0 - fabs(X))288; One negative test with <=.289define double @select_noFMF_fsubfabs_le(double %x) {290; CHECK-LABEL: @select_noFMF_fsubfabs_le(291; CHECK-NEXT: [[CMP:%.*]] = fcmp ole double [[X:%.*]], 0.000000e+00292; CHECK-NEXT: [[SUB:%.*]] = fsub double 0.000000e+00, [[X]]293; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[SUB]]294; CHECK-NEXT: ret double [[RETVAL_0]]295;296 %cmp = fcmp ole double %x, 0.000000e+00297 %sub = fsub double 0.000000e+00, %x298 %retval.0 = select i1 %cmp, double %x, double %sub299 ret double %retval.0300}301 302define double @select_noFMF_fsubfabs_olt(double %x) {303; CHECK-LABEL: @select_noFMF_fsubfabs_olt(304; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00305; CHECK-NEXT: [[SUB:%.*]] = fsub double 0.000000e+00, [[X]]306; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[SUB]]307; CHECK-NEXT: ret double [[RETVAL_0]]308;309 %cmp = fcmp olt double %x, 0.000000e+00310 %sub = fsub double 0.000000e+00, %x311 %retval.0 = select i1 %cmp, double %x, double %sub312 ret double %retval.0313}314 315define double @select_noFMF_fsubfabs_ult(double %x) {316; CHECK-LABEL: @select_noFMF_fsubfabs_ult(317; CHECK-NEXT: [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00318; CHECK-NEXT: [[SUB:%.*]] = fsub double 0.000000e+00, [[X]]319; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[SUB]]320; CHECK-NEXT: ret double [[RETVAL_0]]321;322 %cmp = fcmp ult double %x, 0.000000e+00323 %sub = fsub double 0.000000e+00, %x324 %retval.0 = select i1 %cmp, double %x, double %sub325 ret double %retval.0326}327 328 329; With nsz:330; (X < +/-0.0) ? X : -X --> -fabs(X)331define double @select_nsz_fnegfabs_olt(double %x) {332; CHECK-LABEL: @select_nsz_fnegfabs_olt(333; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00334; CHECK-NEXT: [[NEGX:%.*]] = fneg nsz double [[X]]335; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]]336; CHECK-NEXT: ret double [[RETVAL_0]]337;338 %cmp = fcmp olt double %x, 0.000000e+00339 %negX = fneg nsz double %x340 %retval.0 = select i1 %cmp, double %x, double %negX341 ret double %retval.0342}343 344define double @select_nsz_fnegfabs_ult(double %x) {345; CHECK-LABEL: @select_nsz_fnegfabs_ult(346; CHECK-NEXT: [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00347; CHECK-NEXT: [[NEGX:%.*]] = fneg nsz double [[X]]348; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]]349; CHECK-NEXT: ret double [[RETVAL_0]]350;351 %cmp = fcmp ult double %x, 0.000000e+00352 %negX = fneg nsz double %x353 %retval.0 = select i1 %cmp, double %x, double %negX354 ret double %retval.0355}356