505 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=instcombine -S < %s | FileCheck %s3 4declare double @llvm.powi.f64.i16(double, i16) nounwind readonly5declare double @llvm.powi.f64.i32(double, i32) nounwind readonly6declare i32 @llvm.cttz.i32(i32, i1) nounwind readnone7declare i32 @llvm.ctlz.i32(i32, i1) nounwind readnone8declare i1 @llvm.cttz.i1(i1, i1) nounwind readnone9declare i1 @llvm.ctlz.i1(i1, i1) nounwind readnone10declare <2 x i1> @llvm.cttz.v2i1(<2 x i1>, i1) nounwind readnone11declare <2 x i1> @llvm.ctlz.v2i1(<2 x i1>, i1) nounwind readnone12declare i32 @llvm.ctpop.i32(i32) nounwind readnone13declare <2 x i32> @llvm.cttz.v2i32(<2 x i32>, i1) nounwind readnone14declare <2 x i32> @llvm.ctlz.v2i32(<2 x i32>, i1) nounwind readnone15declare <2 x i32> @llvm.ctpop.v2i32(<2 x i32>) nounwind readnone16declare i8 @llvm.ctlz.i8(i8, i1) nounwind readnone17declare <2 x i8> @llvm.ctlz.v2i8(<2 x i8>, i1) nounwind readnone18declare double @llvm.cos.f64(double %Val) nounwind readonly19declare double @llvm.sin.f64(double %Val) nounwind readonly20declare double @llvm.floor.f64(double %Val) nounwind readonly21declare double @llvm.ceil.f64(double %Val) nounwind readonly22declare double @llvm.trunc.f64(double %Val) nounwind readonly23declare double @llvm.rint.f64(double %Val) nounwind readonly24declare double @llvm.nearbyint.f64(double %Val) nounwind readonly25declare <vscale x 1 x i32> @llvm.cttz.nxv1i32(<vscale x 1 x i32>, i1) nounwind readnone26 27define void @powi(double %V, ptr %P) {28; CHECK-LABEL: @powi(29; CHECK-NEXT: [[A:%.*]] = fdiv fast double 1.000000e+00, [[V:%.*]]30; CHECK-NEXT: store volatile double [[A]], ptr [[P:%.*]], align 831; CHECK-NEXT: [[D:%.*]] = fmul nnan double [[V]], [[V]]32; CHECK-NEXT: store volatile double [[D]], ptr [[P]], align 833; CHECK-NEXT: [[A2:%.*]] = fdiv fast double 1.000000e+00, [[V]]34; CHECK-NEXT: store volatile double [[A2]], ptr [[P]], align 835; CHECK-NEXT: [[D2:%.*]] = fmul nnan double [[V]], [[V]]36; CHECK-NEXT: store volatile double [[D2]], ptr [[P]], align 837; CHECK-NEXT: ret void38;39 %A = tail call fast double @llvm.powi.f64.i32(double %V, i32 -1) nounwind40 store volatile double %A, ptr %P41 42 %D = tail call nnan double @llvm.powi.f64.i32(double %V, i32 2) nounwind43 store volatile double %D, ptr %P44 45 %A2 = tail call fast double @llvm.powi.f64.i16(double %V, i16 -1) nounwind46 store volatile double %A2, ptr %P47 48 %D2 = tail call nnan double @llvm.powi.f64.i16(double %V, i16 2) nounwind49 store volatile double %D2, ptr %P50 ret void51}52 53define i32 @cttz(i32 %a) {54; CHECK-LABEL: @cttz(55; CHECK-NEXT: ret i32 356;57 %or = or i32 %a, 858 %and = and i32 %or, -859 %count = tail call i32 @llvm.cttz.i32(i32 %and, i1 true) nounwind readnone60 ret i32 %count61}62 63define <2 x i32> @cttz_vec(<2 x i32> %a) {64; CHECK-LABEL: @cttz_vec(65; CHECK-NEXT: ret <2 x i32> splat (i32 3)66;67 %or = or <2 x i32> %a, <i32 8, i32 8>68 %and = and <2 x i32> %or, <i32 -8, i32 -8>69 %count = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %and, i1 true) nounwind readnone70 ret <2 x i32> %count71}72 73; Make sure we don't add range metadata to i1 cttz.74define i1 @cttz_i1(i1 %arg) {75; CHECK-LABEL: @cttz_i1(76; CHECK-NEXT: [[CNT:%.*]] = xor i1 [[ARG:%.*]], true77; CHECK-NEXT: ret i1 [[CNT]]78;79 %cnt = call i1 @llvm.cttz.i1(i1 %arg, i1 false) nounwind readnone80 ret i1 %cnt81}82 83define i1 @cttz_i1_zero_is_poison(i1 %arg) {84; CHECK-LABEL: @cttz_i1_zero_is_poison(85; CHECK-NEXT: ret i1 false86;87 %cnt = call i1 @llvm.cttz.i1(i1 %arg, i1 true) nounwind readnone88 ret i1 %cnt89}90 91define <2 x i1> @cttz_v2i1(<2 x i1> %arg) {92; CHECK-LABEL: @cttz_v2i1(93; CHECK-NEXT: [[CNT:%.*]] = xor <2 x i1> [[ARG:%.*]], splat (i1 true)94; CHECK-NEXT: ret <2 x i1> [[CNT]]95;96 %cnt = call <2 x i1> @llvm.cttz.v2i1(<2 x i1> %arg, i1 false) nounwind readnone97 ret <2 x i1> %cnt98}99 100define <2 x i1> @cttz_v2i1_zero_is_poison(<2 x i1> %arg) {101; CHECK-LABEL: @cttz_v2i1_zero_is_poison(102; CHECK-NEXT: ret <2 x i1> zeroinitializer103;104 %cnt = call <2 x i1> @llvm.cttz.v2i1(<2 x i1> %arg, i1 true) nounwind readnone105 ret <2 x i1> %cnt106}107 108define i1 @cttz_knownbits(i32 %arg) {109; CHECK-LABEL: @cttz_knownbits(110; CHECK-NEXT: ret i1 false111;112 %or = or i32 %arg, 4113 %cnt = call i32 @llvm.cttz.i32(i32 %or, i1 true) nounwind readnone114 %res = icmp eq i32 %cnt, 4115 ret i1 %res116}117 118define <2 x i1> @cttz_knownbits_vec(<2 x i32> %arg) {119; CHECK-LABEL: @cttz_knownbits_vec(120; CHECK-NEXT: ret <2 x i1> zeroinitializer121;122 %or = or <2 x i32> %arg, <i32 4, i32 4>123 %cnt = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %or, i1 true) nounwind readnone124 %res = icmp eq <2 x i32> %cnt, <i32 4, i32 4>125 ret <2 x i1> %res126}127 128define <vscale x 1 x i1> @cttz_knownbits_scalable_vec(<vscale x 1 x i32> %arg) {129; CHECK-LABEL: @cttz_knownbits_scalable_vec(130; CHECK-NEXT: ret <vscale x 1 x i1> zeroinitializer131;132 %or = or <vscale x 1 x i32> %arg, splat (i32 4)133 %cnt = call <vscale x 1 x i32> @llvm.cttz.nxv1i32(<vscale x 1 x i32> %or, i1 true) nounwind readnone134 %res = icmp eq <vscale x 1 x i32> %cnt, splat (i32 4)135 ret <vscale x 1 x i1> %res136}137 138 139define i32 @cttz_knownbits2(i32 %arg) {140; CHECK-LABEL: @cttz_knownbits2(141; CHECK-NEXT: [[OR:%.*]] = or i32 [[ARG:%.*]], 4142; CHECK-NEXT: [[CNT:%.*]] = call range(i32 0, 3) i32 @llvm.cttz.i32(i32 [[OR]], i1 true) #[[ATTR2:[0-9]+]]143; CHECK-NEXT: ret i32 [[CNT]]144;145 %or = or i32 %arg, 4146 %cnt = call i32 @llvm.cttz.i32(i32 %or, i1 true) nounwind readnone147 ret i32 %cnt148}149 150define <2 x i32> @cttz_knownbits2_vec(<2 x i32> %arg) {151; CHECK-LABEL: @cttz_knownbits2_vec(152; CHECK-NEXT: [[OR:%.*]] = or <2 x i32> [[ARG:%.*]], splat (i32 4)153; CHECK-NEXT: [[CNT:%.*]] = call range(i32 0, 3) <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[OR]], i1 true) #[[ATTR2]]154; CHECK-NEXT: ret <2 x i32> [[CNT]]155;156 %or = or <2 x i32> %arg, <i32 4, i32 4>157 %cnt = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %or, i1 true) nounwind readnone158 ret <2 x i32> %cnt159}160 161define i1 @cttz_knownbits3(i32 %arg) {162; CHECK-LABEL: @cttz_knownbits3(163; CHECK-NEXT: ret i1 false164;165 %or = or i32 %arg, 4166 %cnt = call i32 @llvm.cttz.i32(i32 %or, i1 true) nounwind readnone167 %res = icmp eq i32 %cnt, 3168 ret i1 %res169}170 171define <2 x i1> @cttz_knownbits3_vec(<2 x i32> %arg) {172; CHECK-LABEL: @cttz_knownbits3_vec(173; CHECK-NEXT: ret <2 x i1> zeroinitializer174;175 %or = or <2 x i32> %arg, <i32 4, i32 4>176 %cnt = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %or, i1 true) nounwind readnone177 %res = icmp eq <2 x i32> %cnt, <i32 3, i32 3>178 ret <2 x i1> %res179}180 181define i8 @ctlz(i8 %a) {182; CHECK-LABEL: @ctlz(183; CHECK-NEXT: ret i8 2184;185 %or = or i8 %a, 32186 %and = and i8 %or, 63187 %count = tail call i8 @llvm.ctlz.i8(i8 %and, i1 true) nounwind readnone188 ret i8 %count189}190 191define <2 x i8> @ctlz_vec(<2 x i8> %a) {192; CHECK-LABEL: @ctlz_vec(193; CHECK-NEXT: ret <2 x i8> splat (i8 2)194;195 %or = or <2 x i8> %a, <i8 32, i8 32>196 %and = and <2 x i8> %or, <i8 63, i8 63>197 %count = tail call <2 x i8> @llvm.ctlz.v2i8(<2 x i8> %and, i1 true) nounwind readnone198 ret <2 x i8> %count199}200 201; Make sure we don't add range metadata to i1 ctlz.202define i1 @ctlz_i1(i1 %arg) {203; CHECK-LABEL: @ctlz_i1(204; CHECK-NEXT: [[CNT:%.*]] = xor i1 [[ARG:%.*]], true205; CHECK-NEXT: ret i1 [[CNT]]206;207 %cnt = call i1 @llvm.ctlz.i1(i1 %arg, i1 false) nounwind readnone208 ret i1 %cnt209}210 211define i1 @ctlz_i1_zero_is_poison(i1 %arg) {212; CHECK-LABEL: @ctlz_i1_zero_is_poison(213; CHECK-NEXT: ret i1 false214;215 %cnt = call i1 @llvm.ctlz.i1(i1 %arg, i1 true) nounwind readnone216 ret i1 %cnt217}218 219define <2 x i1> @ctlz_v2i1(<2 x i1> %arg) {220; CHECK-LABEL: @ctlz_v2i1(221; CHECK-NEXT: [[CNT:%.*]] = xor <2 x i1> [[ARG:%.*]], splat (i1 true)222; CHECK-NEXT: ret <2 x i1> [[CNT]]223;224 %cnt = call <2 x i1> @llvm.ctlz.v2i1(<2 x i1> %arg, i1 false) nounwind readnone225 ret <2 x i1> %cnt226}227 228define <2 x i1> @ctlz_v2i1_zero_is_poison(<2 x i1> %arg) {229; CHECK-LABEL: @ctlz_v2i1_zero_is_poison(230; CHECK-NEXT: ret <2 x i1> zeroinitializer231;232 %cnt = call <2 x i1> @llvm.ctlz.v2i1(<2 x i1> %arg, i1 true) nounwind readnone233 ret <2 x i1> %cnt234}235 236define i1 @ctlz_knownbits(i8 %arg) {237; CHECK-LABEL: @ctlz_knownbits(238; CHECK-NEXT: ret i1 false239;240 %or = or i8 %arg, 32241 %cnt = call i8 @llvm.ctlz.i8(i8 %or, i1 true) nounwind readnone242 %res = icmp eq i8 %cnt, 4243 ret i1 %res244}245 246define <2 x i1> @ctlz_knownbits_vec(<2 x i8> %arg) {247; CHECK-LABEL: @ctlz_knownbits_vec(248; CHECK-NEXT: ret <2 x i1> zeroinitializer249;250 %or = or <2 x i8> %arg, <i8 32, i8 32>251 %cnt = call <2 x i8> @llvm.ctlz.v2i8(<2 x i8> %or, i1 true) nounwind readnone252 %res = icmp eq <2 x i8> %cnt, <i8 4, i8 4>253 ret <2 x i1> %res254}255 256define i8 @ctlz_knownbits2(i8 %arg) {257; CHECK-LABEL: @ctlz_knownbits2(258; CHECK-NEXT: [[OR:%.*]] = or i8 [[ARG:%.*]], 32259; CHECK-NEXT: [[CNT:%.*]] = call range(i8 0, 3) i8 @llvm.ctlz.i8(i8 [[OR]], i1 true) #[[ATTR2]]260; CHECK-NEXT: ret i8 [[CNT]]261;262 %or = or i8 %arg, 32263 %cnt = call i8 @llvm.ctlz.i8(i8 %or, i1 true) nounwind readnone264 ret i8 %cnt265}266 267define <2 x i8> @ctlz_knownbits2_vec(<2 x i8> %arg) {268; CHECK-LABEL: @ctlz_knownbits2_vec(269; CHECK-NEXT: [[OR:%.*]] = or <2 x i8> [[ARG:%.*]], splat (i8 32)270; CHECK-NEXT: [[CNT:%.*]] = call range(i8 0, 3) <2 x i8> @llvm.ctlz.v2i8(<2 x i8> [[OR]], i1 true) #[[ATTR2]]271; CHECK-NEXT: ret <2 x i8> [[CNT]]272;273 %or = or <2 x i8> %arg, <i8 32, i8 32>274 %cnt = call <2 x i8> @llvm.ctlz.v2i8(<2 x i8> %or, i1 true) nounwind readnone275 ret <2 x i8> %cnt276}277 278define i1 @ctlz_knownbits3(i8 %arg) {279; CHECK-LABEL: @ctlz_knownbits3(280; CHECK-NEXT: ret i1 false281;282 %or = or i8 %arg, 32283 %cnt = call i8 @llvm.ctlz.i8(i8 %or, i1 true) nounwind readnone284 %res = icmp eq i8 %cnt, 3285 ret i1 %res286}287 288define <2 x i1> @ctlz_knownbits3_vec(<2 x i8> %arg) {289; CHECK-LABEL: @ctlz_knownbits3_vec(290; CHECK-NEXT: ret <2 x i1> zeroinitializer291;292 %or = or <2 x i8> %arg, <i8 32, i8 32>293 %cnt = call <2 x i8> @llvm.ctlz.v2i8(<2 x i8> %or, i1 true) nounwind readnone294 %res = icmp eq <2 x i8> %cnt, <i8 3, i8 3>295 ret <2 x i1> %res296}297 298define i32 @ctlz_poison(i32 %Value) {299; CHECK-LABEL: @ctlz_poison(300; CHECK-NEXT: ret i32 poison301;302 %ctlz = call i32 @llvm.ctlz.i32(i32 0, i1 true)303 ret i32 %ctlz304}305 306define <2 x i32> @ctlz_poison_vec(<2 x i32> %Value) {307; CHECK-LABEL: @ctlz_poison_vec(308; CHECK-NEXT: ret <2 x i32> poison309;310 %ctlz = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> zeroinitializer, i1 true)311 ret <2 x i32> %ctlz312}313 314define i32 @ctlz_no_zero(i32 %a) {315; CHECK-LABEL: @ctlz_no_zero(316; CHECK-NEXT: [[OR:%.*]] = or i32 [[A:%.*]], 8317; CHECK-NEXT: [[CTLZ:%.*]] = tail call range(i32 0, 29) i32 @llvm.ctlz.i32(i32 [[OR]], i1 true)318; CHECK-NEXT: ret i32 [[CTLZ]]319;320 %or = or i32 %a, 8321 %ctlz = tail call i32 @llvm.ctlz.i32(i32 %or, i1 false)322 ret i32 %ctlz323}324 325define <2 x i32> @ctlz_no_zero_vec(<2 x i32> %a) {326; CHECK-LABEL: @ctlz_no_zero_vec(327; CHECK-NEXT: [[OR:%.*]] = or <2 x i32> [[A:%.*]], splat (i32 8)328; CHECK-NEXT: [[CTLZ:%.*]] = tail call range(i32 0, 29) <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[OR]], i1 true)329; CHECK-NEXT: ret <2 x i32> [[CTLZ]]330;331 %or = or <2 x i32> %a, <i32 8, i32 8>332 %ctlz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %or, i1 false)333 ret <2 x i32> %ctlz334}335 336define i32 @cttz_poison(i32 %Value) {337; CHECK-LABEL: @cttz_poison(338; CHECK-NEXT: ret i32 poison339;340 %cttz = call i32 @llvm.cttz.i32(i32 0, i1 true)341 ret i32 %cttz342}343 344define <2 x i32> @cttz_poison_vec(<2 x i32> %Value) {345; CHECK-LABEL: @cttz_poison_vec(346; CHECK-NEXT: ret <2 x i32> poison347;348 %cttz = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> zeroinitializer, i1 true)349 ret <2 x i32> %cttz350}351 352define i32 @cttz_no_zero(i32 %a) {353; CHECK-LABEL: @cttz_no_zero(354; CHECK-NEXT: [[OR:%.*]] = or i32 [[A:%.*]], 8355; CHECK-NEXT: [[CTTZ:%.*]] = tail call range(i32 0, 4) i32 @llvm.cttz.i32(i32 [[OR]], i1 true)356; CHECK-NEXT: ret i32 [[CTTZ]]357;358 %or = or i32 %a, 8359 %cttz = tail call i32 @llvm.cttz.i32(i32 %or, i1 false)360 ret i32 %cttz361}362 363define <2 x i32> @cttz_no_zero_vec(<2 x i32> %a) {364; CHECK-LABEL: @cttz_no_zero_vec(365; CHECK-NEXT: [[OR:%.*]] = or <2 x i32> [[A:%.*]], splat (i32 8)366; CHECK-NEXT: [[CTTZ:%.*]] = tail call range(i32 0, 4) <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[OR]], i1 true)367; CHECK-NEXT: ret <2 x i32> [[CTTZ]]368;369 %or = or <2 x i32> %a, <i32 8, i32 8>370 %cttz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %or, i1 false)371 ret <2 x i32> %cttz372}373 374define i32 @ctlz_select(i32 %Value) nounwind {375; CHECK-LABEL: @ctlz_select(376; CHECK-NEXT: [[CTLZ:%.*]] = call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[VALUE:%.*]], i1 false)377; CHECK-NEXT: ret i32 [[CTLZ]]378;379 %tobool = icmp ne i32 %Value, 0380 %ctlz = call i32 @llvm.ctlz.i32(i32 %Value, i1 true)381 %s = select i1 %tobool, i32 %ctlz, i32 32382 ret i32 %s383}384 385define <2 x i32> @ctlz_select_vec(<2 x i32> %Value) nounwind {386; CHECK-LABEL: @ctlz_select_vec(387; CHECK-NEXT: [[CTLZ:%.*]] = call range(i32 0, 33) <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[VALUE:%.*]], i1 false)388; CHECK-NEXT: ret <2 x i32> [[CTLZ]]389;390 %tobool = icmp ne <2 x i32> %Value, zeroinitializer391 %ctlz = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %Value, i1 true)392 %s = select <2 x i1> %tobool, <2 x i32> %ctlz, <2 x i32> <i32 32, i32 32>393 ret <2 x i32> %s394}395 396define i32 @cttz_select(i32 %Value) nounwind {397; CHECK-LABEL: @cttz_select(398; CHECK-NEXT: [[CTTZ:%.*]] = call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[VALUE:%.*]], i1 false)399; CHECK-NEXT: ret i32 [[CTTZ]]400;401 %tobool = icmp ne i32 %Value, 0402 %cttz = call i32 @llvm.cttz.i32(i32 %Value, i1 true)403 %s = select i1 %tobool, i32 %cttz, i32 32404 ret i32 %s405}406 407define <2 x i32> @cttz_select_vec(<2 x i32> %Value) nounwind {408; CHECK-LABEL: @cttz_select_vec(409; CHECK-NEXT: [[CTTZ:%.*]] = call range(i32 0, 33) <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[VALUE:%.*]], i1 false)410; CHECK-NEXT: ret <2 x i32> [[CTTZ]]411;412 %tobool = icmp ne <2 x i32> %Value, zeroinitializer413 %cttz = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %Value, i1 true)414 %s = select <2 x i1> %tobool, <2 x i32> %cttz, <2 x i32> <i32 32, i32 32>415 ret <2 x i32> %s416}417 418define void @cos(ptr %P) {419; CHECK-LABEL: @cos(420; CHECK-NEXT: store volatile double 1.000000e+00, ptr [[P:%.*]], align 8421; CHECK-NEXT: ret void422;423 %B = tail call double @llvm.cos.f64(double 0.0) nounwind424 store volatile double %B, ptr %P425 426 ret void427}428 429define void @sin(ptr %P) {430; CHECK-LABEL: @sin(431; CHECK-NEXT: store volatile double 0.000000e+00, ptr [[P:%.*]], align 8432; CHECK-NEXT: ret void433;434 %B = tail call double @llvm.sin.f64(double 0.0) nounwind435 store volatile double %B, ptr %P436 437 ret void438}439 440define void @floor(ptr %P) {441; CHECK-LABEL: @floor(442; CHECK-NEXT: store volatile double 1.000000e+00, ptr [[P:%.*]], align 8443; CHECK-NEXT: store volatile double -2.000000e+00, ptr [[P]], align 8444; CHECK-NEXT: ret void445;446 %B = tail call double @llvm.floor.f64(double 1.5) nounwind447 store volatile double %B, ptr %P448 %C = tail call double @llvm.floor.f64(double -1.5) nounwind449 store volatile double %C, ptr %P450 ret void451}452 453define void @ceil(ptr %P) {454; CHECK-LABEL: @ceil(455; CHECK-NEXT: store volatile double 2.000000e+00, ptr [[P:%.*]], align 8456; CHECK-NEXT: store volatile double -1.000000e+00, ptr [[P]], align 8457; CHECK-NEXT: ret void458;459 %B = tail call double @llvm.ceil.f64(double 1.5) nounwind460 store volatile double %B, ptr %P461 %C = tail call double @llvm.ceil.f64(double -1.5) nounwind462 store volatile double %C, ptr %P463 ret void464}465 466define void @trunc(ptr %P) {467; CHECK-LABEL: @trunc(468; CHECK-NEXT: store volatile double 1.000000e+00, ptr [[P:%.*]], align 8469; CHECK-NEXT: store volatile double -1.000000e+00, ptr [[P]], align 8470; CHECK-NEXT: ret void471;472 %B = tail call double @llvm.trunc.f64(double 1.5) nounwind473 store volatile double %B, ptr %P474 %C = tail call double @llvm.trunc.f64(double -1.5) nounwind475 store volatile double %C, ptr %P476 ret void477}478 479define void @rint(ptr %P) {480; CHECK-LABEL: @rint(481; CHECK-NEXT: store volatile double 2.000000e+00, ptr [[P:%.*]], align 8482; CHECK-NEXT: store volatile double -2.000000e+00, ptr [[P]], align 8483; CHECK-NEXT: ret void484;485 %B = tail call double @llvm.rint.f64(double 1.5) nounwind486 store volatile double %B, ptr %P487 %C = tail call double @llvm.rint.f64(double -1.5) nounwind488 store volatile double %C, ptr %P489 ret void490}491 492define void @nearbyint(ptr %P) {493; CHECK-LABEL: @nearbyint(494; CHECK-NEXT: store volatile double 2.000000e+00, ptr [[P:%.*]], align 8495; CHECK-NEXT: store volatile double -2.000000e+00, ptr [[P]], align 8496; CHECK-NEXT: ret void497;498 %B = tail call double @llvm.nearbyint.f64(double 1.5) nounwind499 store volatile double %B, ptr %P500 %C = tail call double @llvm.nearbyint.f64(double -1.5) nounwind501 store volatile double %C, ptr %P502 ret void503}504 505