1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+d,+v -verify-machineinstrs < %s | FileCheck --check-prefixes=CHECK,RV32 %s 3; RUN: llc -mtriple=riscv64 -mattr=+d,+v -verify-machineinstrs < %s | FileCheck --check-prefixes=CHECK,RV64 %s 4 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: ret 10 store i8 zeroinitializer, ptr %p, align 2 11 %gep = getelementptr i8, ptr %p, i64 1 12 store i8 zeroinitializer, ptr %gep 13 ret void 14} 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: ret 21 store i8 zeroinitializer, ptr %p, align 4 22 %gep1 = getelementptr i8, ptr %p, i64 1 23 store i8 zeroinitializer, ptr %gep1 24 %gep2 = getelementptr i8, ptr %p, i64 2 25 store i8 zeroinitializer, ptr %gep2 26 %gep3 = getelementptr i8, ptr %p, i64 3 27 store i8 zeroinitializer, ptr %gep3 28 ret void 29} 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: ret 37; 38; RV64-LABEL: combine_zero_stores_8xi8: 39; RV64: # %bb.0: 40; RV64-NEXT: sd zero, 0(a0) 41; RV64-NEXT: ret 42 store i8 zeroinitializer, ptr %p, align 8 43 %gep1 = getelementptr i8, ptr %p, i64 1 44 store i8 zeroinitializer, ptr %gep1 45 %gep2 = getelementptr i8, ptr %p, i64 2 46 store i8 zeroinitializer, ptr %gep2 47 %gep3 = getelementptr i8, ptr %p, i64 3 48 store i8 zeroinitializer, ptr %gep3 49 %gep4 = getelementptr i8, ptr %p, i64 4 50 store i8 zeroinitializer, ptr %gep4, align 8 51 %gep5 = getelementptr i8, ptr %p, i64 5 52 store i8 zeroinitializer, ptr %gep5 53 %gep6 = getelementptr i8, ptr %p, i64 6 54 store i8 zeroinitializer, ptr %gep6 55 %gep7 = getelementptr i8, ptr %p, i64 7 56 store i8 zeroinitializer, ptr %gep7 57 ret void 58} 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: ret 65 store i16 zeroinitializer, ptr %p, align 4 66 %gep = getelementptr i8, ptr %p, i64 2 67 store i16 zeroinitializer, ptr %gep 68 ret void 69} 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: ret 77; 78; RV64-LABEL: combine_zero_stores_4xi16: 79; RV64: # %bb.0: 80; RV64-NEXT: sd zero, 0(a0) 81; RV64-NEXT: ret 82 store i16 zeroinitializer, ptr %p, align 8 83 %gep1 = getelementptr i16, ptr %p, i64 1 84 store i16 zeroinitializer, ptr %gep1 85 %gep2 = getelementptr i16, ptr %p, i64 2 86 store i16 zeroinitializer, ptr %gep2, align 4 87 %gep3 = getelementptr i16, ptr %p, i64 3 88 store i16 zeroinitializer, ptr %gep3 89 ret void 90} 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: ret 102; 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: ret 108 store i16 zeroinitializer, ptr %p, align 16 109 %gep1 = getelementptr i16, ptr %p, i64 1 110 store i16 zeroinitializer, ptr %gep1 111 %gep2 = getelementptr i16, ptr %p, i64 2 112 store i16 zeroinitializer, ptr %gep2 113 %gep3 = getelementptr i16, ptr %p, i64 3 114 store i16 zeroinitializer, ptr %gep3 115 %gep4 = getelementptr i16, ptr %p, i64 4 116 store i16 zeroinitializer, ptr %gep4, align 8 117 %gep5 = getelementptr i16, ptr %p, i64 5 118 store i16 zeroinitializer, ptr %gep5 119 %gep6 = getelementptr i16, ptr %p, i64 6 120 store i16 zeroinitializer, ptr %gep6 121 %gep7 = getelementptr i16, ptr %p, i64 7 122 store i16 zeroinitializer, ptr %gep7 123 ret void 124} 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: ret 132; 133; RV64-LABEL: combine_zero_stores_2xi32: 134; RV64: # %bb.0: 135; RV64-NEXT: sd zero, 0(a0) 136; RV64-NEXT: ret 137 store i32 zeroinitializer, ptr %p, align 8 138 %gep = getelementptr i8, ptr %p, i64 4 139 store i32 zeroinitializer, ptr %gep 140 ret void 141} 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, ma 147; RV32-NEXT: vmv.v.i v8, 0 148; RV32-NEXT: vse32.v v8, (a0) 149; RV32-NEXT: ret 150; 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: ret 156 store i32 zeroinitializer, ptr %p, align 16 157 %gep1 = getelementptr i32, ptr %p, i64 1 158 store i32 zeroinitializer, ptr %gep1 159 %gep2 = getelementptr i32, ptr %p, i64 2 160 store i32 zeroinitializer, ptr %gep2, align 8 161 %gep3 = getelementptr i32, ptr %p, i64 3 162 store i32 zeroinitializer, ptr %gep3 163 ret void 164} 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, ma 170; RV32-NEXT: vmv.v.i v8, 0 171; RV32-NEXT: vse32.v v8, (a0) 172; RV32-NEXT: ret 173; 174; RV64-LABEL: combine_zero_stores_8xi32: 175; RV64: # %bb.0: 176; RV64-NEXT: vsetivli zero, 4, e64, m2, ta, ma 177; RV64-NEXT: vmv.v.i v8, 0 178; RV64-NEXT: vse64.v v8, (a0) 179; RV64-NEXT: ret 180 store i32 zeroinitializer, ptr %p, align 32 181 %gep1 = getelementptr i32, ptr %p, i64 1 182 store i32 zeroinitializer, ptr %gep1 183 %gep2 = getelementptr i32, ptr %p, i64 2 184 store i32 zeroinitializer, ptr %gep2, align 8 185 %gep3 = getelementptr i32, ptr %p, i64 3 186 store i32 zeroinitializer, ptr %gep3 187 %gep4 = getelementptr i32, ptr %p, i64 4 188 store i32 zeroinitializer, ptr %gep4, align 8 189 %gep5 = getelementptr i32, ptr %p, i64 5 190 store i32 zeroinitializer, ptr %gep5 191 %gep6 = getelementptr i32, ptr %p, i64 6 192 store i32 zeroinitializer, ptr %gep6, align 8 193 %gep7 = getelementptr i32, ptr %p, i64 7 194 store i32 zeroinitializer, ptr %gep7 195 ret void 196} 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: ret 204 store i32 zeroinitializer, ptr %p 205 %gep = getelementptr i8, ptr %p, i64 4 206 store i32 zeroinitializer, ptr %gep 207 ret void 208} 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: ret 218; 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: ret 224 store i64 zeroinitializer, ptr %p 225 %gep = getelementptr i8, ptr %p, i64 8 226 store i64 zeroinitializer, ptr %gep 227 ret void 228} 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: ret 236 %addr1 = getelementptr float, ptr %ptr, i64 1 237 %addr2 = getelementptr float, ptr %ptr, i64 2 238 store float 0.000000e+00, ptr %addr1, align 4 239 store float 0.000000e+00, ptr %addr2, align 4 240 ret void 241} 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, -1 247; CHECK-NEXT: sh a1, 0(a0) 248; CHECK-NEXT: ret 249 store i8 -1, ptr %p, align 4 250 %gep = getelementptr i8, ptr %p, i64 1 251 store i8 -1, ptr %gep 252 ret void 253} 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, -1 259; CHECK-NEXT: sw a1, 0(a0) 260; CHECK-NEXT: ret 261 store i16 -1, ptr %p, align 4 262 %gep = getelementptr i8, ptr %p, i64 2 263 store i16 -1, ptr %gep 264 ret void 265} 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, -1 271; RV32-NEXT: sw a1, 0(a0) 272; RV32-NEXT: sw a1, 4(a0) 273; RV32-NEXT: ret 274; 275; RV64-LABEL: combine_allones_stores_2xi32: 276; RV64: # %bb.0: 277; RV64-NEXT: li a1, -1 278; RV64-NEXT: sd a1, 0(a0) 279; RV64-NEXT: ret 280 store i32 -1, ptr %p, align 8 281 %gep = getelementptr i8, ptr %p, i64 4 282 store i32 -1, ptr %gep 283 ret void 284} 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, -1 290; CHECK-NEXT: sw a1, 0(a0) 291; CHECK-NEXT: sw a1, 4(a0) 292; CHECK-NEXT: ret 293 store i32 -1, ptr %p 294 %gep = getelementptr i8, ptr %p, i64 4 295 store i32 -1, ptr %gep 296 ret void 297} 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, -1 303; 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: ret 308; 309; RV64-LABEL: combine_allones_stores_2xi64: 310; RV64: # %bb.0: 311; RV64-NEXT: li a1, -1 312; RV64-NEXT: sd a1, 0(a0) 313; RV64-NEXT: sd a1, 8(a0) 314; RV64-NEXT: ret 315 store i64 -1, ptr %p 316 %gep = getelementptr i8, ptr %p, i64 8 317 store i64 -1, ptr %gep 318 ret void 319} 320