204 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 | FileCheck %s3 4; Test wide load+promote patterns, which after combines and legalization are5; represented differently than 128-bit load+promote patterns.6 7target triple = "wasm32-unknown-unknown"8 9define <4 x double> @load_promote_v2f64(ptr %p) {10; CHECK-LABEL: load_promote_v2f64:11; CHECK: .functype load_promote_v2f64 (i32, i32) -> ()12; CHECK-NEXT: # %bb.0:13; CHECK-NEXT: local.get 014; CHECK-NEXT: local.get 115; CHECK-NEXT: i32.const 816; CHECK-NEXT: i32.add17; CHECK-NEXT: v128.load64_zero 018; CHECK-NEXT: f64x2.promote_low_f32x419; CHECK-NEXT: v128.store 1620; CHECK-NEXT: local.get 021; CHECK-NEXT: local.get 122; CHECK-NEXT: v128.load64_zero 023; CHECK-NEXT: f64x2.promote_low_f32x424; CHECK-NEXT: v128.store 025; CHECK-NEXT: # fallthrough-return26 %e = load <4 x float>, ptr %p27 %v = fpext <4 x float> %e to <4 x double>28 ret <4 x double> %v29}30 31define <4 x double> @load_promote_v2f64_with_folded_offset(ptr %p) {32; CHECK-LABEL: load_promote_v2f64_with_folded_offset:33; CHECK: .functype load_promote_v2f64_with_folded_offset (i32, i32) -> ()34; CHECK-NEXT: # %bb.0:35; CHECK-NEXT: local.get 036; CHECK-NEXT: local.get 137; CHECK-NEXT: i32.const 2438; CHECK-NEXT: i32.add39; CHECK-NEXT: v128.load64_zero 040; CHECK-NEXT: f64x2.promote_low_f32x441; CHECK-NEXT: v128.store 1642; CHECK-NEXT: local.get 043; CHECK-NEXT: local.get 144; CHECK-NEXT: i32.const 1645; CHECK-NEXT: i32.add46; CHECK-NEXT: v128.load64_zero 047; CHECK-NEXT: f64x2.promote_low_f32x448; CHECK-NEXT: v128.store 049; CHECK-NEXT: # fallthrough-return50 %q = ptrtoint ptr %p to i3251 %r = add nuw i32 %q, 1652 %s = inttoptr i32 %r to ptr53 %e = load <4 x float>, ptr %s54 %v = fpext <4 x float> %e to <4 x double>55 ret <4 x double> %v56}57 58define <4 x double> @load_promote_v2f64_with_folded_gep_offset(ptr %p) {59; CHECK-LABEL: load_promote_v2f64_with_folded_gep_offset:60; CHECK: .functype load_promote_v2f64_with_folded_gep_offset (i32, i32) -> ()61; CHECK-NEXT: # %bb.0:62; CHECK-NEXT: local.get 063; CHECK-NEXT: local.get 164; CHECK-NEXT: i32.const 2465; CHECK-NEXT: i32.add66; CHECK-NEXT: v128.load64_zero 067; CHECK-NEXT: f64x2.promote_low_f32x468; CHECK-NEXT: v128.store 1669; CHECK-NEXT: local.get 070; CHECK-NEXT: local.get 171; CHECK-NEXT: i32.const 1672; CHECK-NEXT: i32.add73; CHECK-NEXT: v128.load64_zero 074; CHECK-NEXT: f64x2.promote_low_f32x475; CHECK-NEXT: v128.store 076; CHECK-NEXT: # fallthrough-return77 %s = getelementptr inbounds <4 x float>, ptr %p, i32 178 %e = load <4 x float>, ptr %s79 %v = fpext <4 x float> %e to <4 x double>80 ret <4 x double> %v81}82 83define <4 x double> @load_promote_v2f64_with_unfolded_gep_negative_offset(ptr %p) {84; CHECK-LABEL: load_promote_v2f64_with_unfolded_gep_negative_offset:85; CHECK: .functype load_promote_v2f64_with_unfolded_gep_negative_offset (i32, i32) -> ()86; CHECK-NEXT: # %bb.0:87; CHECK-NEXT: local.get 088; CHECK-NEXT: local.get 189; CHECK-NEXT: i32.const -1690; CHECK-NEXT: i32.add91; CHECK-NEXT: local.tee 192; CHECK-NEXT: v128.load64_zero 093; CHECK-NEXT: f64x2.promote_low_f32x494; CHECK-NEXT: v128.store 095; CHECK-NEXT: local.get 096; CHECK-NEXT: local.get 197; CHECK-NEXT: i32.const 898; CHECK-NEXT: i32.add99; CHECK-NEXT: v128.load64_zero 0100; CHECK-NEXT: f64x2.promote_low_f32x4101; CHECK-NEXT: v128.store 16102; CHECK-NEXT: # fallthrough-return103 %s = getelementptr inbounds <4 x float>, ptr %p, i32 -1104 %e = load <4 x float>, ptr %s105 %v = fpext <4 x float> %e to <4 x double>106 ret <4 x double> %v107}108 109define <4 x double> @load_promote_v2f64_with_unfolded_offset(ptr %p) {110; CHECK-LABEL: load_promote_v2f64_with_unfolded_offset:111; CHECK: .functype load_promote_v2f64_with_unfolded_offset (i32, i32) -> ()112; CHECK-NEXT: # %bb.0:113; CHECK-NEXT: local.get 0114; CHECK-NEXT: local.get 1115; CHECK-NEXT: i32.const 24116; CHECK-NEXT: i32.add117; CHECK-NEXT: v128.load64_zero 0118; CHECK-NEXT: f64x2.promote_low_f32x4119; CHECK-NEXT: v128.store 16120; CHECK-NEXT: local.get 0121; CHECK-NEXT: local.get 1122; CHECK-NEXT: i32.const 16123; CHECK-NEXT: i32.add124; CHECK-NEXT: v128.load64_zero 0125; CHECK-NEXT: f64x2.promote_low_f32x4126; CHECK-NEXT: v128.store 0127; CHECK-NEXT: # fallthrough-return128 %q = ptrtoint ptr %p to i32129 %r = add nsw i32 %q, 16130 %s = inttoptr i32 %r to ptr131 %e = load <4 x float>, ptr %s132 %v = fpext <4 x float> %e to <4 x double>133 ret <4 x double> %v134}135 136define <4 x double> @load_promote_v2f64_with_unfolded_gep_offset(ptr %p) {137; CHECK-LABEL: load_promote_v2f64_with_unfolded_gep_offset:138; CHECK: .functype load_promote_v2f64_with_unfolded_gep_offset (i32, i32) -> ()139; CHECK-NEXT: # %bb.0:140; CHECK-NEXT: local.get 0141; CHECK-NEXT: local.get 1142; CHECK-NEXT: i32.const 24143; CHECK-NEXT: i32.add144; CHECK-NEXT: v128.load64_zero 0145; CHECK-NEXT: f64x2.promote_low_f32x4146; CHECK-NEXT: v128.store 16147; CHECK-NEXT: local.get 0148; CHECK-NEXT: local.get 1149; CHECK-NEXT: i32.const 16150; CHECK-NEXT: i32.add151; CHECK-NEXT: v128.load64_zero 0152; CHECK-NEXT: f64x2.promote_low_f32x4153; CHECK-NEXT: v128.store 0154; CHECK-NEXT: # fallthrough-return155 %s = getelementptr <4 x float>, ptr %p, i32 1156 %e = load <4 x float>, ptr %s157 %v = fpext <4 x float> %e to <4 x double>158 ret <4 x double> %v159}160 161define <4 x double> @load_promote_v2f64_from_numeric_address() {162; CHECK-LABEL: load_promote_v2f64_from_numeric_address:163; CHECK: .functype load_promote_v2f64_from_numeric_address (i32) -> ()164; CHECK-NEXT: # %bb.0:165; CHECK-NEXT: local.get 0166; CHECK-NEXT: i32.const 40167; CHECK-NEXT: v128.load64_zero 0168; CHECK-NEXT: f64x2.promote_low_f32x4169; CHECK-NEXT: v128.store 16170; CHECK-NEXT: local.get 0171; CHECK-NEXT: i32.const 32172; CHECK-NEXT: v128.load64_zero 0173; CHECK-NEXT: f64x2.promote_low_f32x4174; CHECK-NEXT: v128.store 0175; CHECK-NEXT: # fallthrough-return176 %s = inttoptr i32 32 to ptr177 %e = load <4 x float>, ptr %s178 %v = fpext <4 x float> %e to <4 x double>179 ret <4 x double> %v180}181 182@gv_v4f32 = global <4 x float> <float 42., float 42., float 42., float 42.>183define <4 x double> @load_promote_v2f64_from_global_address() {184; CHECK-LABEL: load_promote_v2f64_from_global_address:185; CHECK: .functype load_promote_v2f64_from_global_address (i32) -> ()186; CHECK-NEXT: # %bb.0:187; CHECK-NEXT: local.get 0188; CHECK-NEXT: i32.const gv_v4f32189; CHECK-NEXT: i32.const 8190; CHECK-NEXT: i32.add191; CHECK-NEXT: v128.load64_zero 0192; CHECK-NEXT: f64x2.promote_low_f32x4193; CHECK-NEXT: v128.store 16194; CHECK-NEXT: local.get 0195; CHECK-NEXT: i32.const gv_v4f32196; CHECK-NEXT: v128.load64_zero 0197; CHECK-NEXT: f64x2.promote_low_f32x4198; CHECK-NEXT: v128.store 0199; CHECK-NEXT: # fallthrough-return200 %e = load <4 x float>, ptr @gv_v4f32201 %v = fpext <4 x float> %e to <4 x double>202 ret <4 x double> %v203}204