| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 |
| ; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ |
| ; RUN: | FileCheck %s -check-prefixes=RV32I |
| ; RUN: llc -mtriple=riscv32 -verify-machineinstrs -mattr=+experimental-xqcilsm < %s \ |
| ; RUN: | FileCheck %s -check-prefixes=RV32IXQCILSM |
| |
| %struct.anon = type { [16 x i32] } |
| %struct.anon.0 = type { [47 x i32] } |
| %struct.anon.1 = type { [48 x i32] } |
| %struct.anon.2 = type { [64 x i8] } |
| %struct.struct1_t = type { [16 x i32] } |
| |
| @struct1 = common dso_local local_unnamed_addr global %struct.anon zeroinitializer, align 4 |
| @struct4b = common dso_local local_unnamed_addr global %struct.anon.0 zeroinitializer, align 4 |
| @struct4b1 = common dso_local local_unnamed_addr global %struct.anon.1 zeroinitializer, align 4 |
| @struct2 = common dso_local local_unnamed_addr global %struct.anon.2 zeroinitializer, align 1 |
| @arr1 = common dso_local local_unnamed_addr global [100 x i32] zeroinitializer, align 4 |
| @struct1_ = common dso_local local_unnamed_addr global %struct.struct1_t zeroinitializer, align 4 |
| |
| define void @test1(ptr nocapture %p, i32 %n) nounwind { |
| ; RV32I-LABEL: test1: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: mv a2, a1 |
| ; RV32I-NEXT: li a1, 0 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test1: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: mv a2, a1 |
| ; RV32IXQCILSM-NEXT: li a1, 0 |
| ; RV32IXQCILSM-NEXT: tail memset |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 1 %p, i8 0, i32 %n, i1 false) |
| ret void |
| } |
| |
| declare void @llvm.memset.p0.i32(ptr nocapture writeonly, i8, i32, i1) |
| |
| define void @test2(ptr nocapture %p) nounwind { |
| ; RV32I-LABEL: test2: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: li a1, 165 |
| ; RV32I-NEXT: li a2, 128 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test2: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a1, 678490 |
| ; RV32IXQCILSM-NEXT: addi a1, a1, 1445 |
| ; RV32IXQCILSM-NEXT: qc.setwmi a1, 16, 0(a0) |
| ; RV32IXQCILSM-NEXT: qc.setwmi a1, 16, 64(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 %p, i8 -91, i32 128, i1 false) |
| ret void |
| } |
| |
| define void @test2a(ptr nocapture %p) nounwind { |
| ; RV32I-LABEL: test2a: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: li a1, 165 |
| ; RV32I-NEXT: li a2, 188 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test2a: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a1, 678490 |
| ; RV32IXQCILSM-NEXT: addi a1, a1, 1445 |
| ; RV32IXQCILSM-NEXT: qc.setwmi a1, 16, 0(a0) |
| ; RV32IXQCILSM-NEXT: qc.setwmi a1, 15, 64(a0) |
| ; RV32IXQCILSM-NEXT: qc.setwmi a1, 16, 124(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 %p, i8 -91, i32 188, i1 false) |
| ret void |
| } |
| |
| define void @test2b(ptr nocapture %p) nounwind { |
| ; RV32I-LABEL: test2b: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: li a1, 165 |
| ; RV32I-NEXT: li a2, 192 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test2b: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: li a1, 165 |
| ; RV32IXQCILSM-NEXT: li a2, 192 |
| ; RV32IXQCILSM-NEXT: tail memset |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 %p, i8 -91, i32 192, i1 false) |
| ret void |
| } |
| |
| define void @test2c(ptr nocapture %p) nounwind { |
| ; RV32I-LABEL: test2c: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: li a1, 165 |
| ; RV32I-NEXT: li a2, 128 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test2c: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a1, 678490 |
| ; RV32IXQCILSM-NEXT: addi a1, a1, 1445 |
| ; RV32IXQCILSM-NEXT: qc.setwmi a1, 16, 0(a0) |
| ; RV32IXQCILSM-NEXT: qc.setwmi a1, 16, 64(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 %p, i8 -91, i32 128, i1 false) |
| ret void |
| } |
| |
| define void @test2d(ptr nocapture %p) nounwind { |
| ; RV32I-LABEL: test2d: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: li a1, -91 |
| ; RV32I-NEXT: lui a2, 1048570 |
| ; RV32I-NEXT: lui a3, 678490 |
| ; RV32I-NEXT: addi a2, a2, 1445 |
| ; RV32I-NEXT: addi a3, a3, 1445 |
| ; RV32I-NEXT: sw a3, 0(a0) |
| ; RV32I-NEXT: sw a3, 4(a0) |
| ; RV32I-NEXT: sh a2, 8(a0) |
| ; RV32I-NEXT: sb a1, 10(a0) |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32IXQCILSM-LABEL: test2d: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: li a1, -91 |
| ; RV32IXQCILSM-NEXT: lui a2, 1048570 |
| ; RV32IXQCILSM-NEXT: lui a3, 678490 |
| ; RV32IXQCILSM-NEXT: addi a2, a2, 1445 |
| ; RV32IXQCILSM-NEXT: addi a3, a3, 1445 |
| ; RV32IXQCILSM-NEXT: sw a3, 0(a0) |
| ; RV32IXQCILSM-NEXT: sw a3, 4(a0) |
| ; RV32IXQCILSM-NEXT: sh a2, 8(a0) |
| ; RV32IXQCILSM-NEXT: sb a1, 10(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 %p, i8 -91, i32 11, i1 false) |
| ret void |
| } |
| |
| |
| define ptr @test3(ptr %p) nounwind { |
| ; RV32I-LABEL: test3: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: li a2, 256 |
| ; RV32I-NEXT: li a1, 0 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test3: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: li a2, 256 |
| ; RV32IXQCILSM-NEXT: li a1, 0 |
| ; RV32IXQCILSM-NEXT: tail memset |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 %p, i8 0, i32 256, i1 false) |
| ret ptr %p |
| } |
| |
| define ptr @test3a(ptr %p) nounwind { |
| ; RV32I-LABEL: test3a: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: li a2, 128 |
| ; RV32I-NEXT: li a1, 0 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test3a: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 16, 0(a0) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 16, 64(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 %p, i8 0, i32 128, i1 false) |
| ret ptr %p |
| } |
| |
| define void @test4() nounwind { |
| ; RV32I-LABEL: test4: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a0, %hi(struct1) |
| ; RV32I-NEXT: addi a0, a0, %lo(struct1) |
| ; RV32I-NEXT: li a2, 64 |
| ; RV32I-NEXT: li a1, 0 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test4: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(struct1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(struct1) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 16, 0(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 @struct1, i8 0, i32 64, i1 false) |
| ret void |
| } |
| |
| define void @test4a(ptr nocapture %s) nounwind { |
| ; RV32I-LABEL: test4a: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: li a1, 166 |
| ; RV32I-NEXT: li a2, 64 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test4a: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a1, 682602 |
| ; RV32IXQCILSM-NEXT: addi a1, a1, 1702 |
| ; RV32IXQCILSM-NEXT: qc.setwmi a1, 16, 0(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 %s, i8 -90, i32 64, i1 false) |
| ret void |
| } |
| |
| declare void @llvm.lifetime.start.p0(i64, ptr nocapture) |
| |
| declare void @llvm.lifetime.end.p0(i64, ptr nocapture) |
| |
| define void @test4b() nounwind { |
| ; RV32I-LABEL: test4b: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: addi sp, sp, -16 |
| ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill |
| ; RV32I-NEXT: lui a0, %hi(struct4b) |
| ; RV32I-NEXT: addi a0, a0, %lo(struct4b) |
| ; RV32I-NEXT: li a2, 188 |
| ; RV32I-NEXT: li a1, 0 |
| ; RV32I-NEXT: call memset |
| ; RV32I-NEXT: lui a0, %hi(struct4b1) |
| ; RV32I-NEXT: addi a0, a0, %lo(struct4b1) |
| ; RV32I-NEXT: li a2, 192 |
| ; RV32I-NEXT: li a1, 0 |
| ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload |
| ; RV32I-NEXT: addi sp, sp, 16 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test4b: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a1, %hi(struct4b) |
| ; RV32IXQCILSM-NEXT: addi a1, a1, %lo(struct4b) |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(struct4b1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(struct4b1) |
| ; RV32IXQCILSM-NEXT: li a2, 192 |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 16, 0(a1) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 15, 64(a1) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 16, 124(a1) |
| ; RV32IXQCILSM-NEXT: li a1, 0 |
| ; RV32IXQCILSM-NEXT: tail memset |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 @struct4b, i8 0, i32 188, i1 false) |
| tail call void @llvm.memset.p0.i32(ptr align 4 @struct4b1, i8 0, i32 192, i1 false) |
| ret void |
| } |
| |
| define void @test5() nounwind { |
| ; RV32I-LABEL: test5: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a0, %hi(struct2) |
| ; RV32I-NEXT: addi a0, a0, %lo(struct2) |
| ; RV32I-NEXT: li a2, 64 |
| ; RV32I-NEXT: li a1, 0 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test5: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(struct2) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(struct2) |
| ; RV32IXQCILSM-NEXT: li a2, 64 |
| ; RV32IXQCILSM-NEXT: li a1, 0 |
| ; RV32IXQCILSM-NEXT: tail memset |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 1 @struct2, i8 0, i32 64, i1 false) |
| ret void |
| } |
| |
| define i32 @test6() nounwind { |
| ; RV32I-LABEL: test6: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: addi sp, sp, -16 |
| ; RV32I-NEXT: sw zero, 12(sp) |
| ; RV32I-NEXT: li a0, 0 |
| ; RV32I-NEXT: addi sp, sp, 16 |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32IXQCILSM-LABEL: test6: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: addi sp, sp, -16 |
| ; RV32IXQCILSM-NEXT: sw zero, 12(sp) |
| ; RV32IXQCILSM-NEXT: li a0, 0 |
| ; RV32IXQCILSM-NEXT: addi sp, sp, 16 |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| %x = alloca i32, align 4 |
| call void @llvm.memset.p0.i32(ptr align 4 %x, i8 0, i32 4, i1 false) |
| %0 = load i32, ptr %x, align 4 |
| ret i32 %0 |
| } |
| |
| define zeroext i8 @test6b_c() nounwind { |
| ; RV32I-LABEL: test6b_c: |
| ; RV32I: # %bb.0: |
| ; RV32I-NEXT: addi sp, sp, -16 |
| ; RV32I-NEXT: sb zero, 12(sp) |
| ; RV32I-NEXT: lbu a0, 12(sp) |
| ; RV32I-NEXT: addi sp, sp, 16 |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32IXQCILSM-LABEL: test6b_c: |
| ; RV32IXQCILSM: # %bb.0: |
| ; RV32IXQCILSM-NEXT: addi sp, sp, -16 |
| ; RV32IXQCILSM-NEXT: sb zero, 12(sp) |
| ; RV32IXQCILSM-NEXT: lbu a0, 12(sp) |
| ; RV32IXQCILSM-NEXT: addi sp, sp, 16 |
| ; RV32IXQCILSM-NEXT: ret |
| %x = alloca i8, align 4 |
| call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %x) |
| call void @llvm.memset.p0.i32(ptr nonnull align 4 %x, i8 0, i32 1, i1 false) |
| %x.0.x.0. = load volatile i8, ptr %x, align 4 |
| call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %x) |
| ret i8 %x.0.x.0. |
| } |
| |
| define signext i16 @test6b_s() nounwind { |
| ; RV32I-LABEL: test6b_s: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: addi sp, sp, -16 |
| ; RV32I-NEXT: sh zero, 12(sp) |
| ; RV32I-NEXT: lh a0, 12(sp) |
| ; RV32I-NEXT: addi sp, sp, 16 |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32IXQCILSM-LABEL: test6b_s: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: addi sp, sp, -16 |
| ; RV32IXQCILSM-NEXT: sh zero, 12(sp) |
| ; RV32IXQCILSM-NEXT: lh a0, 12(sp) |
| ; RV32IXQCILSM-NEXT: addi sp, sp, 16 |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| %x = alloca i16, align 4 |
| call void @llvm.lifetime.start.p0(i64 2, ptr nonnull %x) |
| store i16 0, ptr %x, align 4 |
| %x.0.x.0. = load volatile i16, ptr %x, align 4 |
| call void @llvm.lifetime.end.p0(i64 2, ptr nonnull %x) |
| ret i16 %x.0.x.0. |
| } |
| |
| define i32 @test6b_l() nounwind { |
| ; RV32I-LABEL: test6b_l: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: addi sp, sp, -16 |
| ; RV32I-NEXT: sw zero, 12(sp) |
| ; RV32I-NEXT: lw a0, 12(sp) |
| ; RV32I-NEXT: addi sp, sp, 16 |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32IXQCILSM-LABEL: test6b_l: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: addi sp, sp, -16 |
| ; RV32IXQCILSM-NEXT: sw zero, 12(sp) |
| ; RV32IXQCILSM-NEXT: lw a0, 12(sp) |
| ; RV32IXQCILSM-NEXT: addi sp, sp, 16 |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| %x = alloca i32, align 4 |
| call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %x) |
| store i32 0, ptr %x, align 4 |
| %x.0.x.0. = load volatile i32, ptr %x, align 4 |
| call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %x) |
| ret i32 %x.0.x.0. |
| } |
| |
| define i64 @test6b_ll() nounwind { |
| ; RV32I-LABEL: test6b_ll: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: addi sp, sp, -16 |
| ; RV32I-NEXT: sw zero, 8(sp) |
| ; RV32I-NEXT: sw zero, 12(sp) |
| ; RV32I-NEXT: lw a0, 8(sp) |
| ; RV32I-NEXT: lw a1, 12(sp) |
| ; RV32I-NEXT: addi sp, sp, 16 |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32IXQCILSM-LABEL: test6b_ll: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: addi sp, sp, -16 |
| ; RV32IXQCILSM-NEXT: sw zero, 8(sp) |
| ; RV32IXQCILSM-NEXT: sw zero, 12(sp) |
| ; RV32IXQCILSM-NEXT: lw a0, 8(sp) |
| ; RV32IXQCILSM-NEXT: lw a1, 12(sp) |
| ; RV32IXQCILSM-NEXT: addi sp, sp, 16 |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| %x = alloca i64, align 8 |
| call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %x) |
| call void @llvm.memset.p0.i32(ptr nonnull align 8 %x, i8 0, i32 8, i1 false) |
| %x.0.x.0. = load volatile i64, ptr %x, align 8 |
| call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %x) |
| ret i64 %x.0.x.0. |
| } |
| |
| define zeroext i8 @test6c_c() nounwind { |
| ; RV32I-LABEL: test6c_c: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: addi sp, sp, -16 |
| ; RV32I-NEXT: sb zero, 15(sp) |
| ; RV32I-NEXT: li a0, 0 |
| ; RV32I-NEXT: addi sp, sp, 16 |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32IXQCILSM-LABEL: test6c_c: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: addi sp, sp, -16 |
| ; RV32IXQCILSM-NEXT: sb zero, 15(sp) |
| ; RV32IXQCILSM-NEXT: li a0, 0 |
| ; RV32IXQCILSM-NEXT: addi sp, sp, 16 |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| %x = alloca i8 |
| call void @llvm.memset.p0.i32(ptr align 1 %x, i8 0, i32 1, i1 false) |
| %0 = load i8, ptr %x, align 1 |
| ret i8 %0 |
| } |
| |
| define signext i16 @test6c_s() nounwind { |
| ; RV32I-LABEL: test6c_s: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: addi sp, sp, -16 |
| ; RV32I-NEXT: sh zero, 14(sp) |
| ; RV32I-NEXT: li a0, 0 |
| ; RV32I-NEXT: addi sp, sp, 16 |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32IXQCILSM-LABEL: test6c_s: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: addi sp, sp, -16 |
| ; RV32IXQCILSM-NEXT: sh zero, 14(sp) |
| ; RV32IXQCILSM-NEXT: li a0, 0 |
| ; RV32IXQCILSM-NEXT: addi sp, sp, 16 |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| %x = alloca i16 |
| call void @llvm.memset.p0.i32(ptr align 2 %x, i8 0, i32 2, i1 false) |
| %0 = load i16, ptr %x, align 2 |
| ret i16 %0 |
| } |
| |
| define i32 @test6c_l() nounwind { |
| ; RV32I-LABEL: test6c_l: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: addi sp, sp, -16 |
| ; RV32I-NEXT: sw zero, 12(sp) |
| ; RV32I-NEXT: li a0, 0 |
| ; RV32I-NEXT: addi sp, sp, 16 |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32IXQCILSM-LABEL: test6c_l: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: addi sp, sp, -16 |
| ; RV32IXQCILSM-NEXT: sw zero, 12(sp) |
| ; RV32IXQCILSM-NEXT: li a0, 0 |
| ; RV32IXQCILSM-NEXT: addi sp, sp, 16 |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| %x = alloca i32, align 4 |
| call void @llvm.memset.p0.i32(ptr align 4 %x, i8 0, i32 4, i1 false) |
| %0 = load i32, ptr %x, align 4 |
| ret i32 %0 |
| } |
| |
| define i64 @test6c_ll() nounwind { |
| ; RV32I-LABEL: test6c_ll: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: addi sp, sp, -16 |
| ; RV32I-NEXT: sw zero, 8(sp) |
| ; RV32I-NEXT: sw zero, 12(sp) |
| ; RV32I-NEXT: li a0, 0 |
| ; RV32I-NEXT: li a1, 0 |
| ; RV32I-NEXT: addi sp, sp, 16 |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32IXQCILSM-LABEL: test6c_ll: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: addi sp, sp, -16 |
| ; RV32IXQCILSM-NEXT: sw zero, 8(sp) |
| ; RV32IXQCILSM-NEXT: sw zero, 12(sp) |
| ; RV32IXQCILSM-NEXT: li a0, 0 |
| ; RV32IXQCILSM-NEXT: li a1, 0 |
| ; RV32IXQCILSM-NEXT: addi sp, sp, 16 |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| %x = alloca i64, align 8 |
| call void @llvm.memset.p0.i32(ptr align 8 %x, i8 0, i32 8, i1 false) |
| %0 = load i64, ptr %x, align 8 |
| ret i64 %0 |
| } |
| |
| define void @test7() nounwind { |
| ; RV32I-LABEL: test7: |
| ; RV32I: # %bb.0: |
| ; RV32I-NEXT: lui a0, %hi(arr1) |
| ; RV32I-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32I-NEXT: sw zero, 0(a0) |
| ; RV32I-NEXT: sw zero, 4(a0) |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32IXQCILSM-LABEL: test7: |
| ; RV32IXQCILSM: # %bb.0: |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(arr1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32IXQCILSM-NEXT: sw zero, 0(a0) |
| ; RV32IXQCILSM-NEXT: sw zero, 4(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| tail call void @llvm.memset.p0.i32(ptr align 4 @arr1, i8 0, i32 8, i1 false) |
| ret void |
| } |
| |
| define void @test7a() nounwind { |
| ; RV32I-LABEL: test7a: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32IXQCILSM-LABEL: test7a: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| call void @llvm.memset.p0.i32(ptr align 4 @arr1, i8 0, i32 0, i1 false) |
| ret void |
| } |
| |
| define void @test7a_unalign() nounwind { |
| ; RV32I-LABEL: test7a_unalign: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a0, %hi(arr1) |
| ; RV32I-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32I-NEXT: li a1, -1 |
| ; RV32I-NEXT: sb a1, 16(a0) |
| ; RV32I-NEXT: sw a1, 0(a0) |
| ; RV32I-NEXT: sw a1, 4(a0) |
| ; RV32I-NEXT: sw a1, 8(a0) |
| ; RV32I-NEXT: sw a1, 12(a0) |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32IXQCILSM-LABEL: test7a_unalign: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(arr1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32IXQCILSM-NEXT: li a1, -1 |
| ; RV32IXQCILSM-NEXT: sb a1, 16(a0) |
| ; RV32IXQCILSM-NEXT: sw a1, 0(a0) |
| ; RV32IXQCILSM-NEXT: sw a1, 4(a0) |
| ; RV32IXQCILSM-NEXT: sw a1, 8(a0) |
| ; RV32IXQCILSM-NEXT: sw a1, 12(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 @arr1, i8 -1, i32 17, i1 false) |
| ret void |
| } |
| |
| define void @test7b() nounwind { |
| ; RV32I-LABEL: test7b: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a0, %hi(arr1) |
| ; RV32I-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32I-NEXT: li a1, 255 |
| ; RV32I-NEXT: li a2, 68 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test7b: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(arr1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32IXQCILSM-NEXT: li a1, -1 |
| ; RV32IXQCILSM-NEXT: qc.setwmi a1, 16, 0(a0) |
| ; RV32IXQCILSM-NEXT: qc.setwmi a1, 1, 64(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 @arr1, i8 -1, i32 68, i1 false) |
| ret void |
| } |
| |
| define void @test7c() nounwind { |
| ; RV32I-LABEL: test7c: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a0, %hi(arr1) |
| ; RV32I-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32I-NEXT: li a1, 128 |
| ; RV32I-NEXT: li a2, 128 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test7c: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(arr1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32IXQCILSM-NEXT: lui a1, 526344 |
| ; RV32IXQCILSM-NEXT: addi a1, a1, 128 |
| ; RV32IXQCILSM-NEXT: qc.setwmi a1, 16, 0(a0) |
| ; RV32IXQCILSM-NEXT: qc.setwmi a1, 16, 64(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 @arr1, i8 -128, i32 128, i1 false) |
| ret void |
| } |
| |
| define void @test7d() nounwind { |
| ; RV32I-LABEL: test7d: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a0, %hi(arr1) |
| ; RV32I-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32I-NEXT: li a1, 13 |
| ; RV32I-NEXT: li a2, 148 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test7d: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(arr1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32IXQCILSM-NEXT: lui a1, 53457 |
| ; RV32IXQCILSM-NEXT: addi a1, a1, -755 |
| ; RV32IXQCILSM-NEXT: qc.setwmi a1, 16, 0(a0) |
| ; RV32IXQCILSM-NEXT: qc.setwmi a1, 15, 64(a0) |
| ; RV32IXQCILSM-NEXT: qc.setwmi a1, 6, 124(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 @arr1, i8 13, i32 148, i1 false) |
| ret void |
| } |
| |
| define void @test7e() nounwind { |
| ; RV32I-LABEL: test7e: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a0, %hi(arr1) |
| ; RV32I-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32I-NEXT: li a1, 239 |
| ; RV32I-NEXT: li a2, 100 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test7e: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(arr1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32IXQCILSM-NEXT: lui a1, 982783 |
| ; RV32IXQCILSM-NEXT: addi a1, a1, -17 |
| ; RV32IXQCILSM-NEXT: qc.setwmi a1, 16, 0(a0) |
| ; RV32IXQCILSM-NEXT: qc.setwmi a1, 9, 64(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 @arr1, i8 -17, i32 100, i1 false) |
| ret void |
| } |
| |
| define void @test8() nounwind { |
| ; RV32I-LABEL: test8: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a0, %hi(arr1) |
| ; RV32I-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32I-NEXT: sw zero, 0(a0) |
| ; RV32I-NEXT: sw zero, 4(a0) |
| ; RV32I-NEXT: sw zero, 8(a0) |
| ; RV32I-NEXT: sw zero, 12(a0) |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32IXQCILSM-LABEL: test8: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(arr1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32IXQCILSM-NEXT: sw zero, 0(a0) |
| ; RV32IXQCILSM-NEXT: sw zero, 4(a0) |
| ; RV32IXQCILSM-NEXT: sw zero, 8(a0) |
| ; RV32IXQCILSM-NEXT: sw zero, 12(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 @arr1, i8 0, i32 16, i1 false) |
| ret void |
| } |
| |
| define void @test9() nounwind { |
| ; RV32I-LABEL: test9: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a0, %hi(arr1) |
| ; RV32I-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32I-NEXT: sw zero, 16(a0) |
| ; RV32I-NEXT: sw zero, 20(a0) |
| ; RV32I-NEXT: sw zero, 24(a0) |
| ; RV32I-NEXT: sw zero, 28(a0) |
| ; RV32I-NEXT: sw zero, 0(a0) |
| ; RV32I-NEXT: sw zero, 4(a0) |
| ; RV32I-NEXT: sw zero, 8(a0) |
| ; RV32I-NEXT: sw zero, 12(a0) |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32IXQCILSM-LABEL: test9: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(arr1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32IXQCILSM-NEXT: sw zero, 16(a0) |
| ; RV32IXQCILSM-NEXT: sw zero, 20(a0) |
| ; RV32IXQCILSM-NEXT: sw zero, 24(a0) |
| ; RV32IXQCILSM-NEXT: sw zero, 28(a0) |
| ; RV32IXQCILSM-NEXT: sw zero, 0(a0) |
| ; RV32IXQCILSM-NEXT: sw zero, 4(a0) |
| ; RV32IXQCILSM-NEXT: sw zero, 8(a0) |
| ; RV32IXQCILSM-NEXT: sw zero, 12(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 @arr1, i8 0, i32 32, i1 false) |
| ret void |
| } |
| |
| define void @test10() nounwind { |
| ; RV32I-LABEL: test10: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a0, %hi(arr1) |
| ; RV32I-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32I-NEXT: li a2, 60 |
| ; RV32I-NEXT: li a1, 0 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test10: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(arr1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 15, 0(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 @arr1, i8 0, i32 60, i1 false) |
| ret void |
| } |
| |
| define void @test11() nounwind { |
| ; RV32I-LABEL: test11: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a0, %hi(arr1) |
| ; RV32I-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32I-NEXT: li a2, 64 |
| ; RV32I-NEXT: li a1, 0 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test11: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(arr1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 16, 0(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 @arr1, i8 0, i32 64, i1 false) |
| ret void |
| } |
| |
| define void @test12() nounwind { |
| ; RV32I-LABEL: test12: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a0, %hi(arr1) |
| ; RV32I-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32I-NEXT: li a2, 120 |
| ; RV32I-NEXT: li a1, 0 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test12: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(arr1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 16, 0(a0) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 14, 64(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 @arr1, i8 0, i32 120, i1 false) |
| ret void |
| } |
| |
| define void @test13() nounwind { |
| ; RV32I-LABEL: test13: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a0, %hi(arr1) |
| ; RV32I-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32I-NEXT: li a2, 124 |
| ; RV32I-NEXT: li a1, 0 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test13: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(arr1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 16, 0(a0) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 15, 64(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 @arr1, i8 0, i32 124, i1 false) |
| ret void |
| } |
| |
| define void @test14() nounwind { |
| ; RV32I-LABEL: test14: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a0, %hi(arr1) |
| ; RV32I-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32I-NEXT: li a2, 180 |
| ; RV32I-NEXT: li a1, 0 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test14: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(arr1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 16, 0(a0) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 15, 64(a0) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 14, 124(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 @arr1, i8 0, i32 180, i1 false) |
| ret void |
| } |
| |
| define void @test15() nounwind { |
| ; RV32I-LABEL: test15: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a0, %hi(arr1) |
| ; RV32I-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32I-NEXT: li a2, 184 |
| ; RV32I-NEXT: li a1, 0 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test15: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(arr1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 16, 0(a0) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 15, 64(a0) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 15, 124(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 @arr1, i8 0, i32 184, i1 false) |
| ret void |
| } |
| |
| define void @test15a() nounwind { |
| ; RV32I-LABEL: test15a: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a0, %hi(arr1) |
| ; RV32I-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32I-NEXT: li a1, 165 |
| ; RV32I-NEXT: li a2, 192 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test15a: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(arr1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32IXQCILSM-NEXT: li a1, 165 |
| ; RV32IXQCILSM-NEXT: li a2, 192 |
| ; RV32IXQCILSM-NEXT: tail memset |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 @arr1, i8 -91, i32 192, i1 false) |
| ret void |
| } |
| |
| define void @test15b() nounwind { |
| ; RV32I-LABEL: test15b: |
| ; RV32I: # %bb.0: |
| ; RV32I-NEXT: lui a0, %hi(arr1) |
| ; RV32I-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32I-NEXT: li a2, 188 |
| ; RV32I-NEXT: li a1, 0 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test15b: |
| ; RV32IXQCILSM: # %bb.0: |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(arr1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 16, 0(a0) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 15, 64(a0) |
| ; RV32IXQCILSM-NEXT: qc.setwmi zero, 16, 124(a0) |
| ; RV32IXQCILSM-NEXT: ret |
| tail call void @llvm.memset.p0.i32(ptr align 4 @arr1, i8 0, i32 188, i1 false) |
| ret void |
| } |
| |
| define void @test15c() nounwind { |
| ; RV32I-LABEL: test15c: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a0, %hi(arr1) |
| ; RV32I-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32I-NEXT: li a2, 192 |
| ; RV32I-NEXT: li a1, 0 |
| ; RV32I-NEXT: tail memset |
| ; |
| ; RV32IXQCILSM-LABEL: test15c: |
| ; RV32IXQCILSM: # %bb.0: # %entry |
| ; RV32IXQCILSM-NEXT: lui a0, %hi(arr1) |
| ; RV32IXQCILSM-NEXT: addi a0, a0, %lo(arr1) |
| ; RV32IXQCILSM-NEXT: li a2, 192 |
| ; RV32IXQCILSM-NEXT: li a1, 0 |
| ; RV32IXQCILSM-NEXT: tail memset |
| entry: |
| tail call void @llvm.memset.p0.i32(ptr align 4 @arr1, i8 0, i32 192, i1 false) |
| ret void |
| } |