437 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+sse2 < %s | FileCheck %s --check-prefix=SSE3; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+avx < %s | FileCheck %s --check-prefix=AVX4; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+avx512f < %s | FileCheck %s --check-prefix=AVX5 6; Verify we fold loads into unary sse intrinsics only when optimizing for size7 8define float @rcpss(ptr %a) {9; SSE-LABEL: rcpss:10; SSE: # %bb.0:11; SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero12; SSE-NEXT: rcpss %xmm0, %xmm013; SSE-NEXT: retq14;15; AVX-LABEL: rcpss:16; AVX: # %bb.0:17; AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero18; AVX-NEXT: vrcpss %xmm0, %xmm0, %xmm019; AVX-NEXT: retq20 %ld = load float, ptr %a21 %ins = insertelement <4 x float> undef, float %ld, i32 022 %res = tail call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %ins)23 %ext = extractelement <4 x float> %res, i32 024 ret float %ext25}26 27define float @rsqrtss(ptr %a) {28; SSE-LABEL: rsqrtss:29; SSE: # %bb.0:30; SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero31; SSE-NEXT: rsqrtss %xmm0, %xmm032; SSE-NEXT: retq33;34; AVX-LABEL: rsqrtss:35; AVX: # %bb.0:36; AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero37; AVX-NEXT: vrsqrtss %xmm0, %xmm0, %xmm038; AVX-NEXT: retq39 %ld = load float, ptr %a40 %ins = insertelement <4 x float> undef, float %ld, i32 041 %res = tail call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %ins)42 %ext = extractelement <4 x float> %res, i32 043 ret float %ext44}45 46define float @sqrtss(ptr %a) {47; SSE-LABEL: sqrtss:48; SSE: # %bb.0:49; SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero50; SSE-NEXT: sqrtss %xmm0, %xmm051; SSE-NEXT: retq52;53; AVX-LABEL: sqrtss:54; AVX: # %bb.0:55; AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero56; AVX-NEXT: vsqrtss %xmm0, %xmm0, %xmm057; AVX-NEXT: retq58 %ld = load float, ptr %a59 %ins = insertelement <4 x float> undef, float %ld, i32 060 %res = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %ins)61 %ext = extractelement <4 x float> %res, i32 062 ret float %ext63}64 65define double @sqrtsd(ptr %a) {66; SSE-LABEL: sqrtsd:67; SSE: # %bb.0:68; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero69; SSE-NEXT: sqrtsd %xmm0, %xmm070; SSE-NEXT: retq71;72; AVX-LABEL: sqrtsd:73; AVX: # %bb.0:74; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero75; AVX-NEXT: vsqrtsd %xmm0, %xmm0, %xmm076; AVX-NEXT: retq77 %ld = load double, ptr %a78 %ins = insertelement <2 x double> undef, double %ld, i32 079 %res = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %ins)80 %ext = extractelement <2 x double> %res, i32 081 ret double %ext82}83 84define float @rcpss_size(ptr %a) optsize {85; SSE-LABEL: rcpss_size:86; SSE: # %bb.0:87; SSE-NEXT: rcpss (%rdi), %xmm088; SSE-NEXT: retq89;90; AVX-LABEL: rcpss_size:91; AVX: # %bb.0:92; AVX-NEXT: vrcpss (%rdi), %xmm15, %xmm093; AVX-NEXT: retq94 %ld = load float, ptr %a95 %ins = insertelement <4 x float> undef, float %ld, i32 096 %res = tail call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %ins)97 %ext = extractelement <4 x float> %res, i32 098 ret float %ext99}100 101define <4 x float> @rcpss_full_size(ptr %a) optsize {102; SSE-LABEL: rcpss_full_size:103; SSE: # %bb.0:104; SSE-NEXT: rcpss (%rdi), %xmm0105; SSE-NEXT: retq106;107; AVX-LABEL: rcpss_full_size:108; AVX: # %bb.0:109; AVX-NEXT: vrcpss (%rdi), %xmm15, %xmm0110; AVX-NEXT: retq111 %ld = load <4 x float>, ptr %a112 %res = tail call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %ld)113 ret <4 x float> %res114}115 116define float @rcpss_pgso(ptr %a) !prof !14 {117; SSE-LABEL: rcpss_pgso:118; SSE: # %bb.0:119; SSE-NEXT: rcpss (%rdi), %xmm0120; SSE-NEXT: retq121;122; AVX-LABEL: rcpss_pgso:123; AVX: # %bb.0:124; AVX-NEXT: vrcpss (%rdi), %xmm15, %xmm0125; AVX-NEXT: retq126 %ld = load float, ptr %a127 %ins = insertelement <4 x float> undef, float %ld, i32 0128 %res = tail call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %ins)129 %ext = extractelement <4 x float> %res, i32 0130 ret float %ext131}132 133define <4 x float> @rcpss_full_pgso(ptr %a) !prof !14 {134; SSE-LABEL: rcpss_full_pgso:135; SSE: # %bb.0:136; SSE-NEXT: rcpss (%rdi), %xmm0137; SSE-NEXT: retq138;139; AVX-LABEL: rcpss_full_pgso:140; AVX: # %bb.0:141; AVX-NEXT: vrcpss (%rdi), %xmm15, %xmm0142; AVX-NEXT: retq143 %ld = load <4 x float>, ptr %a144 %res = tail call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %ld)145 ret <4 x float> %res146}147 148define float @rsqrtss_size(ptr %a) optsize {149; SSE-LABEL: rsqrtss_size:150; SSE: # %bb.0:151; SSE-NEXT: rsqrtss (%rdi), %xmm0152; SSE-NEXT: retq153;154; AVX-LABEL: rsqrtss_size:155; AVX: # %bb.0:156; AVX-NEXT: vrsqrtss (%rdi), %xmm15, %xmm0157; AVX-NEXT: retq158 %ld = load float, ptr %a159 %ins = insertelement <4 x float> undef, float %ld, i32 0160 %res = tail call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %ins)161 %ext = extractelement <4 x float> %res, i32 0162 ret float %ext163}164 165define <4 x float> @rsqrtss_full_size(ptr %a) optsize {166; SSE-LABEL: rsqrtss_full_size:167; SSE: # %bb.0:168; SSE-NEXT: rsqrtss (%rdi), %xmm0169; SSE-NEXT: retq170;171; AVX-LABEL: rsqrtss_full_size:172; AVX: # %bb.0:173; AVX-NEXT: vrsqrtss (%rdi), %xmm15, %xmm0174; AVX-NEXT: retq175 %ld = load <4 x float>, ptr %a176 %res = tail call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %ld)177 ret <4 x float> %res178}179 180define float @rsqrtss_pgso(ptr %a) !prof !14 {181; SSE-LABEL: rsqrtss_pgso:182; SSE: # %bb.0:183; SSE-NEXT: rsqrtss (%rdi), %xmm0184; SSE-NEXT: retq185;186; AVX-LABEL: rsqrtss_pgso:187; AVX: # %bb.0:188; AVX-NEXT: vrsqrtss (%rdi), %xmm15, %xmm0189; AVX-NEXT: retq190 %ld = load float, ptr %a191 %ins = insertelement <4 x float> undef, float %ld, i32 0192 %res = tail call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %ins)193 %ext = extractelement <4 x float> %res, i32 0194 ret float %ext195}196 197define <4 x float> @rsqrtss_full_pgso(ptr %a) !prof !14 {198; SSE-LABEL: rsqrtss_full_pgso:199; SSE: # %bb.0:200; SSE-NEXT: rsqrtss (%rdi), %xmm0201; SSE-NEXT: retq202;203; AVX-LABEL: rsqrtss_full_pgso:204; AVX: # %bb.0:205; AVX-NEXT: vrsqrtss (%rdi), %xmm15, %xmm0206; AVX-NEXT: retq207 %ld = load <4 x float>, ptr %a208 %res = tail call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %ld)209 ret <4 x float> %res210}211 212define float @sqrtss_size(ptr %a) optsize{213; SSE-LABEL: sqrtss_size:214; SSE: # %bb.0:215; SSE-NEXT: sqrtss (%rdi), %xmm0216; SSE-NEXT: retq217;218; AVX-LABEL: sqrtss_size:219; AVX: # %bb.0:220; AVX-NEXT: vsqrtss (%rdi), %xmm15, %xmm0221; AVX-NEXT: retq222 %ld = load float, ptr %a223 %ins = insertelement <4 x float> undef, float %ld, i32 0224 %res = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %ins)225 %ext = extractelement <4 x float> %res, i32 0226 ret float %ext227}228 229define <4 x float> @sqrtss_full_size(ptr %a) optsize{230; SSE-LABEL: sqrtss_full_size:231; SSE: # %bb.0:232; SSE-NEXT: movaps (%rdi), %xmm0233; SSE-NEXT: sqrtss %xmm0, %xmm0234; SSE-NEXT: retq235;236; AVX-LABEL: sqrtss_full_size:237; AVX: # %bb.0:238; AVX-NEXT: vmovaps (%rdi), %xmm0239; AVX-NEXT: vsqrtss %xmm0, %xmm0, %xmm0240; AVX-NEXT: retq241 %ld = load <4 x float>, ptr %a242 %res = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %ld)243 ret <4 x float> %res244}245 246define <4 x float> @sqrtss_full_size_volatile(ptr %a) optsize{247; SSE-LABEL: sqrtss_full_size_volatile:248; SSE: # %bb.0:249; SSE-NEXT: movaps (%rdi), %xmm0250; SSE-NEXT: sqrtss %xmm0, %xmm0251; SSE-NEXT: retq252;253; AVX-LABEL: sqrtss_full_size_volatile:254; AVX: # %bb.0:255; AVX-NEXT: vmovaps (%rdi), %xmm0256; AVX-NEXT: vsqrtss %xmm0, %xmm0, %xmm0257; AVX-NEXT: retq258 %ld = load volatile <4 x float>, ptr %a259 %res = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %ld)260 ret <4 x float> %res261}262 263define float @sqrtss_pgso(ptr %a) !prof !14 {264; SSE-LABEL: sqrtss_pgso:265; SSE: # %bb.0:266; SSE-NEXT: sqrtss (%rdi), %xmm0267; SSE-NEXT: retq268;269; AVX-LABEL: sqrtss_pgso:270; AVX: # %bb.0:271; AVX-NEXT: vsqrtss (%rdi), %xmm15, %xmm0272; AVX-NEXT: retq273 %ld = load float, ptr %a274 %ins = insertelement <4 x float> undef, float %ld, i32 0275 %res = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %ins)276 %ext = extractelement <4 x float> %res, i32 0277 ret float %ext278}279 280define <4 x float> @sqrtss_full_pgso(ptr %a) !prof !14 {281; SSE-LABEL: sqrtss_full_pgso:282; SSE: # %bb.0:283; SSE-NEXT: movaps (%rdi), %xmm0284; SSE-NEXT: sqrtss %xmm0, %xmm0285; SSE-NEXT: retq286;287; AVX-LABEL: sqrtss_full_pgso:288; AVX: # %bb.0:289; AVX-NEXT: vmovaps (%rdi), %xmm0290; AVX-NEXT: vsqrtss %xmm0, %xmm0, %xmm0291; AVX-NEXT: retq292 %ld = load <4 x float>, ptr %a293 %res = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %ld)294 ret <4 x float> %res295}296 297define <4 x float> @sqrtss_full_pgso_volatile(ptr %a) !prof !14 {298; SSE-LABEL: sqrtss_full_pgso_volatile:299; SSE: # %bb.0:300; SSE-NEXT: movaps (%rdi), %xmm0301; SSE-NEXT: sqrtss %xmm0, %xmm0302; SSE-NEXT: retq303;304; AVX-LABEL: sqrtss_full_pgso_volatile:305; AVX: # %bb.0:306; AVX-NEXT: vmovaps (%rdi), %xmm0307; AVX-NEXT: vsqrtss %xmm0, %xmm0, %xmm0308; AVX-NEXT: retq309 %ld = load volatile <4 x float>, ptr %a310 %res = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %ld)311 ret <4 x float> %res312}313 314define double @sqrtsd_size(ptr %a) optsize {315; SSE-LABEL: sqrtsd_size:316; SSE: # %bb.0:317; SSE-NEXT: sqrtsd (%rdi), %xmm0318; SSE-NEXT: retq319;320; AVX-LABEL: sqrtsd_size:321; AVX: # %bb.0:322; AVX-NEXT: vsqrtsd (%rdi), %xmm15, %xmm0323; AVX-NEXT: retq324 %ld = load double, ptr %a325 %ins = insertelement <2 x double> undef, double %ld, i32 0326 %res = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %ins)327 %ext = extractelement <2 x double> %res, i32 0328 ret double %ext329}330 331define <2 x double> @sqrtsd_full_size(ptr %a) optsize {332; SSE-LABEL: sqrtsd_full_size:333; SSE: # %bb.0:334; SSE-NEXT: movapd (%rdi), %xmm0335; SSE-NEXT: sqrtsd %xmm0, %xmm0336; SSE-NEXT: retq337;338; AVX-LABEL: sqrtsd_full_size:339; AVX: # %bb.0:340; AVX-NEXT: vmovapd (%rdi), %xmm0341; AVX-NEXT: vsqrtsd %xmm0, %xmm0, %xmm0342; AVX-NEXT: retq343 %ld = load <2 x double>, ptr %a344 %res = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %ld)345 ret <2 x double> %res346}347 348define <2 x double> @sqrtsd_full_size_volatile(ptr %a) optsize {349; SSE-LABEL: sqrtsd_full_size_volatile:350; SSE: # %bb.0:351; SSE-NEXT: movapd (%rdi), %xmm0352; SSE-NEXT: sqrtsd %xmm0, %xmm0353; SSE-NEXT: retq354;355; AVX-LABEL: sqrtsd_full_size_volatile:356; AVX: # %bb.0:357; AVX-NEXT: vmovapd (%rdi), %xmm0358; AVX-NEXT: vsqrtsd %xmm0, %xmm0, %xmm0359; AVX-NEXT: retq360 %ld = load volatile <2 x double>, ptr %a361 %res = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %ld)362 ret <2 x double> %res363}364 365define double @sqrtsd_pgso(ptr %a) !prof !14 {366; SSE-LABEL: sqrtsd_pgso:367; SSE: # %bb.0:368; SSE-NEXT: sqrtsd (%rdi), %xmm0369; SSE-NEXT: retq370;371; AVX-LABEL: sqrtsd_pgso:372; AVX: # %bb.0:373; AVX-NEXT: vsqrtsd (%rdi), %xmm15, %xmm0374; AVX-NEXT: retq375 %ld = load double, ptr %a376 %ins = insertelement <2 x double> undef, double %ld, i32 0377 %res = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %ins)378 %ext = extractelement <2 x double> %res, i32 0379 ret double %ext380}381 382define <2 x double> @sqrtsd_full_pgso(ptr %a) !prof !14 {383; SSE-LABEL: sqrtsd_full_pgso:384; SSE: # %bb.0:385; SSE-NEXT: movapd (%rdi), %xmm0386; SSE-NEXT: sqrtsd %xmm0, %xmm0387; SSE-NEXT: retq388;389; AVX-LABEL: sqrtsd_full_pgso:390; AVX: # %bb.0:391; AVX-NEXT: vmovapd (%rdi), %xmm0392; AVX-NEXT: vsqrtsd %xmm0, %xmm0, %xmm0393; AVX-NEXT: retq394 %ld = load <2 x double>, ptr %a395 %res = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %ld)396 ret <2 x double> %res397}398 399define <2 x double> @sqrtsd_full_pgso_volatile(ptr %a) !prof !14 {400; SSE-LABEL: sqrtsd_full_pgso_volatile:401; SSE: # %bb.0:402; SSE-NEXT: movapd (%rdi), %xmm0403; SSE-NEXT: sqrtsd %xmm0, %xmm0404; SSE-NEXT: retq405;406; AVX-LABEL: sqrtsd_full_pgso_volatile:407; AVX: # %bb.0:408; AVX-NEXT: vmovapd (%rdi), %xmm0409; AVX-NEXT: vsqrtsd %xmm0, %xmm0, %xmm0410; AVX-NEXT: retq411 %ld = load volatile <2 x double>, ptr %a412 %res = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %ld)413 ret <2 x double> %res414}415 416declare <4 x float> @llvm.x86.sse.rcp.ss(<4 x float>) nounwind readnone417declare <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float>) nounwind readnone418declare <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float>) nounwind readnone419declare <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double>) nounwind readnone420 421!llvm.module.flags = !{!0}422!0 = !{i32 1, !"ProfileSummary", !1}423!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}424!2 = !{!"ProfileFormat", !"InstrProf"}425!3 = !{!"TotalCount", i64 10000}426!4 = !{!"MaxCount", i64 10}427!5 = !{!"MaxInternalCount", i64 1}428!6 = !{!"MaxFunctionCount", i64 1000}429!7 = !{!"NumCounts", i64 3}430!8 = !{!"NumFunctions", i64 3}431!9 = !{!"DetailedSummary", !10}432!10 = !{!11, !12, !13}433!11 = !{i32 10000, i64 100, i32 1}434!12 = !{i32 999000, i64 100, i32 1}435!13 = !{i32 999999, i64 1, i32 2}436!14 = !{!"function_entry_count", i64 0}437