brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.6 KiB · c013a2c Raw
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