320 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+d,+v -verify-machineinstrs < %s | FileCheck --check-prefixes=CHECK,RV32 %s3; RUN: llc -mtriple=riscv64 -mattr=+d,+v -verify-machineinstrs < %s | FileCheck --check-prefixes=CHECK,RV64 %s4 5define void @combine_zero_stores_2xi8(ptr %p) {6; CHECK-LABEL: combine_zero_stores_2xi8:7; CHECK: # %bb.0:8; CHECK-NEXT: sh zero, 0(a0)9; CHECK-NEXT: ret10 store i8 zeroinitializer, ptr %p, align 211 %gep = getelementptr i8, ptr %p, i64 112 store i8 zeroinitializer, ptr %gep13 ret void14}15 16define void @combine_zero_stores_4xi8(ptr %p) {17; CHECK-LABEL: combine_zero_stores_4xi8:18; CHECK: # %bb.0:19; CHECK-NEXT: sw zero, 0(a0)20; CHECK-NEXT: ret21 store i8 zeroinitializer, ptr %p, align 422 %gep1 = getelementptr i8, ptr %p, i64 123 store i8 zeroinitializer, ptr %gep124 %gep2 = getelementptr i8, ptr %p, i64 225 store i8 zeroinitializer, ptr %gep226 %gep3 = getelementptr i8, ptr %p, i64 327 store i8 zeroinitializer, ptr %gep328 ret void29}30 31define void @combine_zero_stores_8xi8(ptr %p) {32; RV32-LABEL: combine_zero_stores_8xi8:33; RV32: # %bb.0:34; RV32-NEXT: sw zero, 0(a0)35; RV32-NEXT: sw zero, 4(a0)36; RV32-NEXT: ret37;38; RV64-LABEL: combine_zero_stores_8xi8:39; RV64: # %bb.0:40; RV64-NEXT: sd zero, 0(a0)41; RV64-NEXT: ret42 store i8 zeroinitializer, ptr %p, align 843 %gep1 = getelementptr i8, ptr %p, i64 144 store i8 zeroinitializer, ptr %gep145 %gep2 = getelementptr i8, ptr %p, i64 246 store i8 zeroinitializer, ptr %gep247 %gep3 = getelementptr i8, ptr %p, i64 348 store i8 zeroinitializer, ptr %gep349 %gep4 = getelementptr i8, ptr %p, i64 450 store i8 zeroinitializer, ptr %gep4, align 851 %gep5 = getelementptr i8, ptr %p, i64 552 store i8 zeroinitializer, ptr %gep553 %gep6 = getelementptr i8, ptr %p, i64 654 store i8 zeroinitializer, ptr %gep655 %gep7 = getelementptr i8, ptr %p, i64 756 store i8 zeroinitializer, ptr %gep757 ret void58}59 60define void @combine_zero_stores_2xi16(ptr %p) {61; CHECK-LABEL: combine_zero_stores_2xi16:62; CHECK: # %bb.0:63; CHECK-NEXT: sw zero, 0(a0)64; CHECK-NEXT: ret65 store i16 zeroinitializer, ptr %p, align 466 %gep = getelementptr i8, ptr %p, i64 267 store i16 zeroinitializer, ptr %gep68 ret void69}70 71define void @combine_zero_stores_4xi16(ptr %p) {72; RV32-LABEL: combine_zero_stores_4xi16:73; RV32: # %bb.0:74; RV32-NEXT: sw zero, 0(a0)75; RV32-NEXT: sw zero, 4(a0)76; RV32-NEXT: ret77;78; RV64-LABEL: combine_zero_stores_4xi16:79; RV64: # %bb.0:80; RV64-NEXT: sd zero, 0(a0)81; RV64-NEXT: ret82 store i16 zeroinitializer, ptr %p, align 883 %gep1 = getelementptr i16, ptr %p, i64 184 store i16 zeroinitializer, ptr %gep185 %gep2 = getelementptr i16, ptr %p, i64 286 store i16 zeroinitializer, ptr %gep2, align 487 %gep3 = getelementptr i16, ptr %p, i64 388 store i16 zeroinitializer, ptr %gep389 ret void90}91 92define void @combine_zero_stores_8xi16(ptr %p) {93; RV32-LABEL: combine_zero_stores_8xi16:94; RV32: # %bb.0:95; RV32-NEXT: sw zero, 0(a0)96; RV32-NEXT: sh zero, 4(a0)97; RV32-NEXT: sh zero, 6(a0)98; RV32-NEXT: sw zero, 8(a0)99; RV32-NEXT: sh zero, 12(a0)100; RV32-NEXT: sh zero, 14(a0)101; RV32-NEXT: ret102;103; RV64-LABEL: combine_zero_stores_8xi16:104; RV64: # %bb.0:105; RV64-NEXT: sd zero, 0(a0)106; RV64-NEXT: sd zero, 8(a0)107; RV64-NEXT: ret108 store i16 zeroinitializer, ptr %p, align 16109 %gep1 = getelementptr i16, ptr %p, i64 1110 store i16 zeroinitializer, ptr %gep1111 %gep2 = getelementptr i16, ptr %p, i64 2112 store i16 zeroinitializer, ptr %gep2113 %gep3 = getelementptr i16, ptr %p, i64 3114 store i16 zeroinitializer, ptr %gep3115 %gep4 = getelementptr i16, ptr %p, i64 4116 store i16 zeroinitializer, ptr %gep4, align 8117 %gep5 = getelementptr i16, ptr %p, i64 5118 store i16 zeroinitializer, ptr %gep5119 %gep6 = getelementptr i16, ptr %p, i64 6120 store i16 zeroinitializer, ptr %gep6121 %gep7 = getelementptr i16, ptr %p, i64 7122 store i16 zeroinitializer, ptr %gep7123 ret void124}125 126define void @combine_zero_stores_2xi32(ptr %p) {127; RV32-LABEL: combine_zero_stores_2xi32:128; RV32: # %bb.0:129; RV32-NEXT: sw zero, 0(a0)130; RV32-NEXT: sw zero, 4(a0)131; RV32-NEXT: ret132;133; RV64-LABEL: combine_zero_stores_2xi32:134; RV64: # %bb.0:135; RV64-NEXT: sd zero, 0(a0)136; RV64-NEXT: ret137 store i32 zeroinitializer, ptr %p, align 8138 %gep = getelementptr i8, ptr %p, i64 4139 store i32 zeroinitializer, ptr %gep140 ret void141}142 143define void @combine_zero_stores_4xi32(ptr %p) {144; RV32-LABEL: combine_zero_stores_4xi32:145; RV32: # %bb.0:146; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma147; RV32-NEXT: vmv.v.i v8, 0148; RV32-NEXT: vse32.v v8, (a0)149; RV32-NEXT: ret150;151; RV64-LABEL: combine_zero_stores_4xi32:152; RV64: # %bb.0:153; RV64-NEXT: sd zero, 0(a0)154; RV64-NEXT: sd zero, 8(a0)155; RV64-NEXT: ret156 store i32 zeroinitializer, ptr %p, align 16157 %gep1 = getelementptr i32, ptr %p, i64 1158 store i32 zeroinitializer, ptr %gep1159 %gep2 = getelementptr i32, ptr %p, i64 2160 store i32 zeroinitializer, ptr %gep2, align 8161 %gep3 = getelementptr i32, ptr %p, i64 3162 store i32 zeroinitializer, ptr %gep3163 ret void164}165 166define void @combine_zero_stores_8xi32(ptr %p) {167; RV32-LABEL: combine_zero_stores_8xi32:168; RV32: # %bb.0:169; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma170; RV32-NEXT: vmv.v.i v8, 0171; RV32-NEXT: vse32.v v8, (a0)172; RV32-NEXT: ret173;174; RV64-LABEL: combine_zero_stores_8xi32:175; RV64: # %bb.0:176; RV64-NEXT: vsetivli zero, 4, e64, m2, ta, ma177; RV64-NEXT: vmv.v.i v8, 0178; RV64-NEXT: vse64.v v8, (a0)179; RV64-NEXT: ret180 store i32 zeroinitializer, ptr %p, align 32181 %gep1 = getelementptr i32, ptr %p, i64 1182 store i32 zeroinitializer, ptr %gep1183 %gep2 = getelementptr i32, ptr %p, i64 2184 store i32 zeroinitializer, ptr %gep2, align 8185 %gep3 = getelementptr i32, ptr %p, i64 3186 store i32 zeroinitializer, ptr %gep3187 %gep4 = getelementptr i32, ptr %p, i64 4188 store i32 zeroinitializer, ptr %gep4, align 8189 %gep5 = getelementptr i32, ptr %p, i64 5190 store i32 zeroinitializer, ptr %gep5191 %gep6 = getelementptr i32, ptr %p, i64 6192 store i32 zeroinitializer, ptr %gep6, align 8193 %gep7 = getelementptr i32, ptr %p, i64 7194 store i32 zeroinitializer, ptr %gep7195 ret void196}197 198define void @combine_zero_stores_2xi32_unaligned(ptr %p) {199; CHECK-LABEL: combine_zero_stores_2xi32_unaligned:200; CHECK: # %bb.0:201; CHECK-NEXT: sw zero, 0(a0)202; CHECK-NEXT: sw zero, 4(a0)203; CHECK-NEXT: ret204 store i32 zeroinitializer, ptr %p205 %gep = getelementptr i8, ptr %p, i64 4206 store i32 zeroinitializer, ptr %gep207 ret void208}209 210define void @combine_zero_stores_2xi64(ptr %p) {211; RV32-LABEL: combine_zero_stores_2xi64:212; RV32: # %bb.0:213; RV32-NEXT: sw zero, 0(a0)214; RV32-NEXT: sw zero, 4(a0)215; RV32-NEXT: sw zero, 8(a0)216; RV32-NEXT: sw zero, 12(a0)217; RV32-NEXT: ret218;219; RV64-LABEL: combine_zero_stores_2xi64:220; RV64: # %bb.0:221; RV64-NEXT: sd zero, 0(a0)222; RV64-NEXT: sd zero, 8(a0)223; RV64-NEXT: ret224 store i64 zeroinitializer, ptr %p225 %gep = getelementptr i8, ptr %p, i64 8226 store i64 zeroinitializer, ptr %gep227 ret void228}229 230define void @combine_fp_zero_stores_crash(ptr %ptr) {231; CHECK-LABEL: combine_fp_zero_stores_crash:232; CHECK: # %bb.0:233; CHECK-NEXT: sw zero, 4(a0)234; CHECK-NEXT: sw zero, 8(a0)235; CHECK-NEXT: ret236 %addr1 = getelementptr float, ptr %ptr, i64 1237 %addr2 = getelementptr float, ptr %ptr, i64 2238 store float 0.000000e+00, ptr %addr1, align 4239 store float 0.000000e+00, ptr %addr2, align 4240 ret void241}242 243define void @combine_allones_stores_2xi8(ptr %p) {244; CHECK-LABEL: combine_allones_stores_2xi8:245; CHECK: # %bb.0:246; CHECK-NEXT: li a1, -1247; CHECK-NEXT: sh a1, 0(a0)248; CHECK-NEXT: ret249 store i8 -1, ptr %p, align 4250 %gep = getelementptr i8, ptr %p, i64 1251 store i8 -1, ptr %gep252 ret void253}254 255define void @combine_allones_stores_2xi16(ptr %p) {256; CHECK-LABEL: combine_allones_stores_2xi16:257; CHECK: # %bb.0:258; CHECK-NEXT: li a1, -1259; CHECK-NEXT: sw a1, 0(a0)260; CHECK-NEXT: ret261 store i16 -1, ptr %p, align 4262 %gep = getelementptr i8, ptr %p, i64 2263 store i16 -1, ptr %gep264 ret void265}266 267define void @combine_allones_stores_2xi32(ptr %p) {268; RV32-LABEL: combine_allones_stores_2xi32:269; RV32: # %bb.0:270; RV32-NEXT: li a1, -1271; RV32-NEXT: sw a1, 0(a0)272; RV32-NEXT: sw a1, 4(a0)273; RV32-NEXT: ret274;275; RV64-LABEL: combine_allones_stores_2xi32:276; RV64: # %bb.0:277; RV64-NEXT: li a1, -1278; RV64-NEXT: sd a1, 0(a0)279; RV64-NEXT: ret280 store i32 -1, ptr %p, align 8281 %gep = getelementptr i8, ptr %p, i64 4282 store i32 -1, ptr %gep283 ret void284}285 286define void @combine_allones_stores_2xi32_unaligned(ptr %p) {287; CHECK-LABEL: combine_allones_stores_2xi32_unaligned:288; CHECK: # %bb.0:289; CHECK-NEXT: li a1, -1290; CHECK-NEXT: sw a1, 0(a0)291; CHECK-NEXT: sw a1, 4(a0)292; CHECK-NEXT: ret293 store i32 -1, ptr %p294 %gep = getelementptr i8, ptr %p, i64 4295 store i32 -1, ptr %gep296 ret void297}298 299define void @combine_allones_stores_2xi64(ptr %p) {300; RV32-LABEL: combine_allones_stores_2xi64:301; RV32: # %bb.0:302; RV32-NEXT: li a1, -1303; RV32-NEXT: sw a1, 0(a0)304; RV32-NEXT: sw a1, 4(a0)305; RV32-NEXT: sw a1, 8(a0)306; RV32-NEXT: sw a1, 12(a0)307; RV32-NEXT: ret308;309; RV64-LABEL: combine_allones_stores_2xi64:310; RV64: # %bb.0:311; RV64-NEXT: li a1, -1312; RV64-NEXT: sd a1, 0(a0)313; RV64-NEXT: sd a1, 8(a0)314; RV64-NEXT: ret315 store i64 -1, ptr %p316 %gep = getelementptr i8, ptr %p, i64 8317 store i64 -1, ptr %gep318 ret void319}320