1560dd1cdSUsman Nadeem; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2acdc419cSBjorn Pettersson; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3560dd1cdSUsman Nadeem 4560dd1cdSUsman Nadeem; (X < +/-0.0) ? X : -X --> -fabs(X) 5560dd1cdSUsman Nadeem; (X <= +/-0.0) ? X : -X --> -fabs(X) 6560dd1cdSUsman Nadeem; One negative test with no fmf 7560dd1cdSUsman Nadeemdefine double @select_noFMF_nfabs_lt(double %x) { 8560dd1cdSUsman Nadeem; CHECK-LABEL: @select_noFMF_nfabs_lt( 9560dd1cdSUsman Nadeem; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00 10560dd1cdSUsman Nadeem; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]] 11560dd1cdSUsman Nadeem; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]] 12560dd1cdSUsman Nadeem; CHECK-NEXT: ret double [[SEL]] 13560dd1cdSUsman Nadeem; 14560dd1cdSUsman Nadeem %cmp = fcmp olt double %x, 0.000000e+00 15560dd1cdSUsman Nadeem %negX = fneg double %x 16560dd1cdSUsman Nadeem %sel = select i1 %cmp, double %x, double %negX 17560dd1cdSUsman Nadeem ret double %sel 18560dd1cdSUsman Nadeem} 19560dd1cdSUsman Nadeem 20560dd1cdSUsman Nadeem; One test where the neg has fmfs. 21560dd1cdSUsman Nadeemdefine double @select_nsz_nfabs_lt_fmfProp(double %x) { 22560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_nfabs_lt_fmfProp( 230ee6bad6SSanjay Patel; CHECK-NEXT: [[TMP1:%.*]] = call nnan ninf nsz double @llvm.fabs.f64(double [[X:%.*]]) 240ee6bad6SSanjay Patel; CHECK-NEXT: [[SEL:%.*]] = fneg nnan ninf nsz double [[TMP1]] 25560dd1cdSUsman Nadeem; CHECK-NEXT: ret double [[SEL]] 26560dd1cdSUsman Nadeem; 27560dd1cdSUsman Nadeem %cmp = fcmp olt double %x, 0.000000e+00 28560dd1cdSUsman Nadeem %negX = fneg fast double %x 29560dd1cdSUsman Nadeem %sel = select nsz i1 %cmp, double %x, double %negX 30560dd1cdSUsman Nadeem ret double %sel 31560dd1cdSUsman Nadeem} 32560dd1cdSUsman Nadeem 3383ed93c0SSanjay Pateldefine double @select_nsz_nnan_nfabs_lt_fmfProp(double %x) { 3483ed93c0SSanjay Patel; CHECK-LABEL: @select_nsz_nnan_nfabs_lt_fmfProp( 350ee6bad6SSanjay Patel; CHECK-NEXT: [[TMP1:%.*]] = call nnan ninf nsz double @llvm.fabs.f64(double [[X:%.*]]) 360ee6bad6SSanjay Patel; CHECK-NEXT: [[SEL:%.*]] = fneg nnan ninf nsz double [[TMP1]] 37560dd1cdSUsman Nadeem; CHECK-NEXT: ret double [[SEL]] 38560dd1cdSUsman Nadeem; 39560dd1cdSUsman Nadeem %cmp = fcmp olt double %x, 0.000000e+00 4083ed93c0SSanjay Patel %negX = fneg fast double %x 4183ed93c0SSanjay Patel %sel = select nsz nnan i1 %cmp, double %x, double %negX 42560dd1cdSUsman Nadeem ret double %sel 43560dd1cdSUsman Nadeem} 44560dd1cdSUsman Nadeem 4583ed93c0SSanjay Patel; Tests with various predicate types. 4683ed93c0SSanjay Patel 47*862e35e2SSanjay Patel; This is not fabs because that could produce a different signbit for a NAN input. 48*862e35e2SSanjay Patel; PR59279 49*862e35e2SSanjay Patel 50560dd1cdSUsman Nadeemdefine double @select_nsz_nfabs_ult(double %x) { 51560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_nfabs_ult( 52*862e35e2SSanjay Patel; CHECK-NEXT: [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00 53*862e35e2SSanjay Patel; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]] 54*862e35e2SSanjay Patel; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]] 55560dd1cdSUsman Nadeem; CHECK-NEXT: ret double [[SEL]] 56560dd1cdSUsman Nadeem; 57560dd1cdSUsman Nadeem %cmp = fcmp ult double %x, 0.000000e+00 58560dd1cdSUsman Nadeem %negX = fneg double %x 59560dd1cdSUsman Nadeem %sel = select nsz i1 %cmp, double %x, double %negX 60560dd1cdSUsman Nadeem ret double %sel 61560dd1cdSUsman Nadeem} 62560dd1cdSUsman Nadeem 6383ed93c0SSanjay Pateldefine double @select_nsz_nnan_nfabs_ult(double %x) { 6483ed93c0SSanjay Patel; CHECK-LABEL: @select_nsz_nnan_nfabs_ult( 6583ed93c0SSanjay Patel; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]]) 6683ed93c0SSanjay Patel; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]] 6783ed93c0SSanjay Patel; CHECK-NEXT: ret double [[SEL]] 6883ed93c0SSanjay Patel; 6983ed93c0SSanjay Patel %cmp = fcmp ult double %x, 0.000000e+00 7083ed93c0SSanjay Patel %negX = fneg double %x 7183ed93c0SSanjay Patel %sel = select nsz nnan i1 %cmp, double %x, double %negX 7283ed93c0SSanjay Patel ret double %sel 7383ed93c0SSanjay Patel} 7483ed93c0SSanjay Patel 75*862e35e2SSanjay Patel; This is not fabs because that could produce a different signbit for a NAN input. 76*862e35e2SSanjay Patel; PR59279 77*862e35e2SSanjay Patel 78560dd1cdSUsman Nadeemdefine double @select_nsz_nfabs_ole(double %x) { 79560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_nfabs_ole( 80*862e35e2SSanjay Patel; CHECK-NEXT: [[CMP:%.*]] = fcmp ole double [[X:%.*]], 0.000000e+00 81*862e35e2SSanjay Patel; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]] 82*862e35e2SSanjay Patel; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]] 83560dd1cdSUsman Nadeem; CHECK-NEXT: ret double [[SEL]] 84560dd1cdSUsman Nadeem; 85560dd1cdSUsman Nadeem %cmp = fcmp ole double %x, 0.000000e+00 86560dd1cdSUsman Nadeem %negX = fneg double %x 87560dd1cdSUsman Nadeem %sel = select nsz i1 %cmp, double %x, double %negX 88560dd1cdSUsman Nadeem ret double %sel 89560dd1cdSUsman Nadeem} 90560dd1cdSUsman Nadeem 9183ed93c0SSanjay Pateldefine double @select_nsz_nnan_nfabs_ole(double %x) { 9283ed93c0SSanjay Patel; CHECK-LABEL: @select_nsz_nnan_nfabs_ole( 9383ed93c0SSanjay Patel; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]]) 9483ed93c0SSanjay Patel; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]] 9583ed93c0SSanjay Patel; CHECK-NEXT: ret double [[SEL]] 9683ed93c0SSanjay Patel; 9783ed93c0SSanjay Patel %cmp = fcmp ole double %x, 0.000000e+00 9883ed93c0SSanjay Patel %negX = fneg double %x 9983ed93c0SSanjay Patel %sel = select nsz nnan i1 %cmp, double %x, double %negX 10083ed93c0SSanjay Patel ret double %sel 10183ed93c0SSanjay Patel} 10283ed93c0SSanjay Patel 103*862e35e2SSanjay Patel; This is not fabs because that could produce a different signbit for a NAN input. 104*862e35e2SSanjay Patel; PR59279 105*862e35e2SSanjay Patel 106560dd1cdSUsman Nadeemdefine double @select_nsz_nfabs_ule(double %x) { 107560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_nfabs_ule( 108*862e35e2SSanjay Patel; CHECK-NEXT: [[CMP:%.*]] = fcmp ule double [[X:%.*]], 0.000000e+00 109*862e35e2SSanjay Patel; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]] 110*862e35e2SSanjay Patel; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]] 111560dd1cdSUsman Nadeem; CHECK-NEXT: ret double [[SEL]] 112560dd1cdSUsman Nadeem; 113560dd1cdSUsman Nadeem %cmp = fcmp ule double %x, 0.000000e+00 114560dd1cdSUsman Nadeem %negX = fneg double %x 115560dd1cdSUsman Nadeem %sel = select nsz i1 %cmp, double %x, double %negX 116560dd1cdSUsman Nadeem ret double %sel 117560dd1cdSUsman Nadeem} 118560dd1cdSUsman Nadeem 11983ed93c0SSanjay Pateldefine double @select_nsz_nnan_nfabs_ule(double %x) { 12083ed93c0SSanjay Patel; CHECK-LABEL: @select_nsz_nnan_nfabs_ule( 12183ed93c0SSanjay Patel; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]]) 12283ed93c0SSanjay Patel; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]] 12383ed93c0SSanjay Patel; CHECK-NEXT: ret double [[SEL]] 12483ed93c0SSanjay Patel; 12583ed93c0SSanjay Patel %cmp = fcmp ule double %x, 0.000000e+00 12683ed93c0SSanjay Patel %negX = fneg double %x 12783ed93c0SSanjay Patel %sel = select nsz nnan i1 %cmp, double %x, double %negX 12883ed93c0SSanjay Patel ret double %sel 12983ed93c0SSanjay Patel} 13083ed93c0SSanjay Patel 131560dd1cdSUsman Nadeem; (X > +/-0.0) ? -X : X --> -fabs(X) 132560dd1cdSUsman Nadeem; (X >= +/-0.0) ? -X : X --> -fabs(X) 133560dd1cdSUsman Nadeem; One negative test with no fmf 134560dd1cdSUsman Nadeemdefine double @select_noFMF_nfabs_gt(double %x) { 135560dd1cdSUsman Nadeem; CHECK-LABEL: @select_noFMF_nfabs_gt( 136560dd1cdSUsman Nadeem; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X:%.*]], 0.000000e+00 137560dd1cdSUsman Nadeem; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]] 138560dd1cdSUsman Nadeem; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], double [[NEGX]], double [[X]] 139560dd1cdSUsman Nadeem; CHECK-NEXT: ret double [[SEL]] 140560dd1cdSUsman Nadeem; 141560dd1cdSUsman Nadeem %cmp = fcmp ogt double %x, 0.000000e+00 142560dd1cdSUsman Nadeem %negX = fneg double %x 143560dd1cdSUsman Nadeem %sel = select i1 %cmp, double %negX, double %x 144560dd1cdSUsman Nadeem ret double %sel 145560dd1cdSUsman Nadeem} 146560dd1cdSUsman Nadeem 147560dd1cdSUsman Nadeem; One test where the neg has fmfs. 148560dd1cdSUsman Nadeemdefine double @select_nsz_nfabs_gt_fmfProp(double %x) { 149560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_nfabs_gt_fmfProp( 1500ee6bad6SSanjay Patel; CHECK-NEXT: [[TMP1:%.*]] = call nnan ninf nsz double @llvm.fabs.f64(double [[X:%.*]]) 1510ee6bad6SSanjay Patel; CHECK-NEXT: [[SEL:%.*]] = fneg nnan ninf nsz double [[TMP1]] 152560dd1cdSUsman Nadeem; CHECK-NEXT: ret double [[SEL]] 153560dd1cdSUsman Nadeem; 154560dd1cdSUsman Nadeem %cmp = fcmp ogt double %x, 0.000000e+00 155560dd1cdSUsman Nadeem %negX = fneg fast double %x 156560dd1cdSUsman Nadeem %sel = select nsz i1 %cmp, double %negX, double %x 157560dd1cdSUsman Nadeem ret double %sel 158560dd1cdSUsman Nadeem} 159560dd1cdSUsman Nadeem 16083ed93c0SSanjay Pateldefine double @select_nsz_nnan_nfabs_gt_fmfProp(double %x) { 16183ed93c0SSanjay Patel; CHECK-LABEL: @select_nsz_nnan_nfabs_gt_fmfProp( 1620ee6bad6SSanjay Patel; CHECK-NEXT: [[TMP1:%.*]] = call nnan ninf nsz double @llvm.fabs.f64(double [[X:%.*]]) 1630ee6bad6SSanjay Patel; CHECK-NEXT: [[SEL:%.*]] = fneg nnan ninf nsz double [[TMP1]] 16483ed93c0SSanjay Patel; CHECK-NEXT: ret double [[SEL]] 16583ed93c0SSanjay Patel; 16683ed93c0SSanjay Patel %cmp = fcmp ogt double %x, 0.000000e+00 16783ed93c0SSanjay Patel %negX = fneg fast double %x 16883ed93c0SSanjay Patel %sel = select nsz nnan i1 %cmp, double %negX, double %x 16983ed93c0SSanjay Patel ret double %sel 17083ed93c0SSanjay Patel} 17183ed93c0SSanjay Patel 172*862e35e2SSanjay Patel; This is not fabs because that could produce a different signbit for a NAN input. 173*862e35e2SSanjay Patel; PR59279 174*862e35e2SSanjay Patel 175560dd1cdSUsman Nadeemdefine double @select_nsz_nfabs_ogt(double %x) { 176560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_nfabs_ogt( 177*862e35e2SSanjay Patel; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X:%.*]], 0.000000e+00 178*862e35e2SSanjay Patel; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]] 179*862e35e2SSanjay Patel; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]] 180560dd1cdSUsman Nadeem; CHECK-NEXT: ret double [[SEL]] 181560dd1cdSUsman Nadeem; 182560dd1cdSUsman Nadeem %cmp = fcmp ogt double %x, 0.000000e+00 183560dd1cdSUsman Nadeem %negX = fneg double %x 184560dd1cdSUsman Nadeem %sel = select nsz i1 %cmp, double %negX, double %x 185560dd1cdSUsman Nadeem ret double %sel 186560dd1cdSUsman Nadeem} 187560dd1cdSUsman Nadeem 188*862e35e2SSanjay Patel; Tests with various predicate types. 189*862e35e2SSanjay Patel 19083ed93c0SSanjay Pateldefine double @select_nsz_nnan_nfabs_ogt(double %x) { 19183ed93c0SSanjay Patel; CHECK-LABEL: @select_nsz_nnan_nfabs_ogt( 19283ed93c0SSanjay Patel; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]]) 19383ed93c0SSanjay Patel; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]] 19483ed93c0SSanjay Patel; CHECK-NEXT: ret double [[SEL]] 19583ed93c0SSanjay Patel; 19683ed93c0SSanjay Patel %cmp = fcmp ogt double %x, 0.000000e+00 19783ed93c0SSanjay Patel %negX = fneg double %x 19883ed93c0SSanjay Patel %sel = select nsz nnan i1 %cmp, double %negX, double %x 19983ed93c0SSanjay Patel ret double %sel 20083ed93c0SSanjay Patel} 20183ed93c0SSanjay Patel 202*862e35e2SSanjay Patel; This is not fabs because that could produce a different signbit for a NAN input. 203*862e35e2SSanjay Patel; PR59279 204*862e35e2SSanjay Patel 205560dd1cdSUsman Nadeemdefine double @select_nsz_nfabs_ugt(double %x) { 206560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_nfabs_ugt( 207*862e35e2SSanjay Patel; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt double [[X:%.*]], 0.000000e+00 208*862e35e2SSanjay Patel; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]] 209*862e35e2SSanjay Patel; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]] 210560dd1cdSUsman Nadeem; CHECK-NEXT: ret double [[SEL]] 211560dd1cdSUsman Nadeem; 212560dd1cdSUsman Nadeem %cmp = fcmp ugt double %x, 0.000000e+00 213560dd1cdSUsman Nadeem %negX = fneg double %x 214560dd1cdSUsman Nadeem %sel = select nsz i1 %cmp, double %negX, double %x 215560dd1cdSUsman Nadeem ret double %sel 216560dd1cdSUsman Nadeem} 217560dd1cdSUsman Nadeem 21883ed93c0SSanjay Pateldefine double @select_nsz_nnan_nfabs_ugt(double %x) { 21983ed93c0SSanjay Patel; CHECK-LABEL: @select_nsz_nnan_nfabs_ugt( 22083ed93c0SSanjay Patel; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]]) 22183ed93c0SSanjay Patel; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]] 22283ed93c0SSanjay Patel; CHECK-NEXT: ret double [[SEL]] 22383ed93c0SSanjay Patel; 22483ed93c0SSanjay Patel %cmp = fcmp ugt double %x, 0.000000e+00 22583ed93c0SSanjay Patel %negX = fneg double %x 22683ed93c0SSanjay Patel %sel = select nsz nnan i1 %cmp, double %negX, double %x 22783ed93c0SSanjay Patel ret double %sel 22883ed93c0SSanjay Patel} 22983ed93c0SSanjay Patel 230*862e35e2SSanjay Patel; This is not fabs because that could produce a different signbit for a NAN input. 231*862e35e2SSanjay Patel; PR59279 232*862e35e2SSanjay Patel 233560dd1cdSUsman Nadeemdefine double @select_nsz_nfabs_oge(double %x) { 234560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_nfabs_oge( 235*862e35e2SSanjay Patel; CHECK-NEXT: [[CMP:%.*]] = fcmp oge double [[X:%.*]], 0.000000e+00 236*862e35e2SSanjay Patel; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]] 237*862e35e2SSanjay Patel; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]] 238560dd1cdSUsman Nadeem; CHECK-NEXT: ret double [[SEL]] 239560dd1cdSUsman Nadeem; 240560dd1cdSUsman Nadeem %cmp = fcmp oge double %x, 0.000000e+00 241560dd1cdSUsman Nadeem %negX = fneg double %x 242560dd1cdSUsman Nadeem %sel = select nsz i1 %cmp, double %negX, double %x 243560dd1cdSUsman Nadeem ret double %sel 244560dd1cdSUsman Nadeem} 245560dd1cdSUsman Nadeem 24683ed93c0SSanjay Pateldefine double @select_nsz_nnan_nfabs_oge(double %x) { 24783ed93c0SSanjay Patel; CHECK-LABEL: @select_nsz_nnan_nfabs_oge( 24883ed93c0SSanjay Patel; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]]) 24983ed93c0SSanjay Patel; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]] 25083ed93c0SSanjay Patel; CHECK-NEXT: ret double [[SEL]] 25183ed93c0SSanjay Patel; 25283ed93c0SSanjay Patel %cmp = fcmp oge double %x, 0.000000e+00 25383ed93c0SSanjay Patel %negX = fneg double %x 25483ed93c0SSanjay Patel %sel = select nsz nnan i1 %cmp, double %negX, double %x 25583ed93c0SSanjay Patel ret double %sel 25683ed93c0SSanjay Patel} 25783ed93c0SSanjay Patel 258*862e35e2SSanjay Patel; This is not fabs because that could produce a different signbit for a NAN input. 259*862e35e2SSanjay Patel; PR59279 260*862e35e2SSanjay Patel 261560dd1cdSUsman Nadeemdefine double @select_nsz_nfabs_uge(double %x) { 262560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_nfabs_uge( 263*862e35e2SSanjay Patel; CHECK-NEXT: [[CMP:%.*]] = fcmp uge double [[X:%.*]], 0.000000e+00 264*862e35e2SSanjay Patel; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]] 265*862e35e2SSanjay Patel; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]] 266560dd1cdSUsman Nadeem; CHECK-NEXT: ret double [[SEL]] 267560dd1cdSUsman Nadeem; 268560dd1cdSUsman Nadeem %cmp = fcmp uge double %x, 0.000000e+00 269560dd1cdSUsman Nadeem %negX = fneg double %x 270560dd1cdSUsman Nadeem %sel = select nsz i1 %cmp, double %negX, double %x 271560dd1cdSUsman Nadeem ret double %sel 272560dd1cdSUsman Nadeem} 273560dd1cdSUsman Nadeem 27483ed93c0SSanjay Pateldefine double @select_nsz_nnan_nfabs_uge(double %x) { 27583ed93c0SSanjay Patel; CHECK-LABEL: @select_nsz_nnan_nfabs_uge( 27683ed93c0SSanjay Patel; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]]) 27783ed93c0SSanjay Patel; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]] 27883ed93c0SSanjay Patel; CHECK-NEXT: ret double [[SEL]] 27983ed93c0SSanjay Patel; 28083ed93c0SSanjay Patel %cmp = fcmp uge double %x, 0.000000e+00 28183ed93c0SSanjay Patel %negX = fneg double %x 28283ed93c0SSanjay Patel %sel = select nsz nnan i1 %cmp, double %negX, double %x 28383ed93c0SSanjay Patel ret double %sel 28483ed93c0SSanjay Patel} 28583ed93c0SSanjay Patel 286560dd1cdSUsman Nadeem; (X < +/-0.0) ? X : (0.0 - X) --> (0.0 - fabs(X)) 287560dd1cdSUsman Nadeem; One negative test with <=. 288560dd1cdSUsman Nadeemdefine double @select_noFMF_fsubfabs_le(double %x) { 289560dd1cdSUsman Nadeem; CHECK-LABEL: @select_noFMF_fsubfabs_le( 290560dd1cdSUsman Nadeem; CHECK-NEXT: [[CMP:%.*]] = fcmp ole double [[X:%.*]], 0.000000e+00 291560dd1cdSUsman Nadeem; CHECK-NEXT: [[SUB:%.*]] = fsub double 0.000000e+00, [[X]] 292560dd1cdSUsman Nadeem; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[SUB]] 293560dd1cdSUsman Nadeem; CHECK-NEXT: ret double [[RETVAL_0]] 294560dd1cdSUsman Nadeem; 295560dd1cdSUsman Nadeem %cmp = fcmp ole double %x, 0.000000e+00 296560dd1cdSUsman Nadeem %sub = fsub double 0.000000e+00, %x 297560dd1cdSUsman Nadeem %retval.0 = select i1 %cmp, double %x, double %sub 298560dd1cdSUsman Nadeem ret double %retval.0 299560dd1cdSUsman Nadeem} 300560dd1cdSUsman Nadeem 301560dd1cdSUsman Nadeemdefine double @select_noFMF_fsubfabs_olt(double %x) { 302560dd1cdSUsman Nadeem; CHECK-LABEL: @select_noFMF_fsubfabs_olt( 303560dd1cdSUsman Nadeem; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00 304560dd1cdSUsman Nadeem; CHECK-NEXT: [[SUB:%.*]] = fsub double 0.000000e+00, [[X]] 305560dd1cdSUsman Nadeem; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[SUB]] 306560dd1cdSUsman Nadeem; CHECK-NEXT: ret double [[RETVAL_0]] 307560dd1cdSUsman Nadeem; 308560dd1cdSUsman Nadeem %cmp = fcmp olt double %x, 0.000000e+00 309560dd1cdSUsman Nadeem %sub = fsub double 0.000000e+00, %x 310560dd1cdSUsman Nadeem %retval.0 = select i1 %cmp, double %x, double %sub 311560dd1cdSUsman Nadeem ret double %retval.0 312560dd1cdSUsman Nadeem} 313560dd1cdSUsman Nadeem 314560dd1cdSUsman Nadeemdefine double @select_noFMF_fsubfabs_ult(double %x) { 315560dd1cdSUsman Nadeem; CHECK-LABEL: @select_noFMF_fsubfabs_ult( 316560dd1cdSUsman Nadeem; CHECK-NEXT: [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00 317560dd1cdSUsman Nadeem; CHECK-NEXT: [[SUB:%.*]] = fsub double 0.000000e+00, [[X]] 318560dd1cdSUsman Nadeem; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[SUB]] 319560dd1cdSUsman Nadeem; CHECK-NEXT: ret double [[RETVAL_0]] 320560dd1cdSUsman Nadeem; 321560dd1cdSUsman Nadeem %cmp = fcmp ult double %x, 0.000000e+00 322560dd1cdSUsman Nadeem %sub = fsub double 0.000000e+00, %x 323560dd1cdSUsman Nadeem %retval.0 = select i1 %cmp, double %x, double %sub 324560dd1cdSUsman Nadeem ret double %retval.0 325560dd1cdSUsman Nadeem} 326560dd1cdSUsman Nadeem 327560dd1cdSUsman Nadeem 328560dd1cdSUsman Nadeem; With nsz: 329560dd1cdSUsman Nadeem; (X < +/-0.0) ? X : -X --> -fabs(X) 330560dd1cdSUsman Nadeemdefine double @select_nsz_fnegfabs_olt(double %x) { 331560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_fnegfabs_olt( 332560dd1cdSUsman Nadeem; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00 333560dd1cdSUsman Nadeem; CHECK-NEXT: [[NEGX:%.*]] = fneg nsz double [[X]] 334560dd1cdSUsman Nadeem; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]] 335560dd1cdSUsman Nadeem; CHECK-NEXT: ret double [[RETVAL_0]] 336560dd1cdSUsman Nadeem; 337560dd1cdSUsman Nadeem %cmp = fcmp olt double %x, 0.000000e+00 338560dd1cdSUsman Nadeem %negX = fneg nsz double %x 339560dd1cdSUsman Nadeem %retval.0 = select i1 %cmp, double %x, double %negX 340560dd1cdSUsman Nadeem ret double %retval.0 341560dd1cdSUsman Nadeem} 342560dd1cdSUsman Nadeem 343560dd1cdSUsman Nadeemdefine double @select_nsz_fnegfabs_ult(double %x) { 344560dd1cdSUsman Nadeem; CHECK-LABEL: @select_nsz_fnegfabs_ult( 345560dd1cdSUsman Nadeem; CHECK-NEXT: [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00 346560dd1cdSUsman Nadeem; CHECK-NEXT: [[NEGX:%.*]] = fneg nsz double [[X]] 347560dd1cdSUsman Nadeem; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]] 348560dd1cdSUsman Nadeem; CHECK-NEXT: ret double [[RETVAL_0]] 349560dd1cdSUsman Nadeem; 350560dd1cdSUsman Nadeem %cmp = fcmp ult double %x, 0.000000e+00 351560dd1cdSUsman Nadeem %negX = fneg nsz double %x 352560dd1cdSUsman Nadeem %retval.0 = select i1 %cmp, double %x, double %negX 353560dd1cdSUsman Nadeem ret double %retval.0 354560dd1cdSUsman Nadeem} 355