brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.4 KiB · 9dceb41 Raw
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