Philip Reames 8624075105
[RISCV] Strip W suffix from ADDIW (#68425)
The motivation of this change is simply to reduce test duplication. As
can be seen in the (massive) test delta, we have many tests whose output
differ only due to the use of addi on rv32 vs addiw on rv64 when the
high bits are don't care.

As an aside, we don't need to worry about the non-zero immediate
restriction on the compressed variants because we're not directly
forming the compressed variants. If we happen to get a zero immediate
for the ADDI, then either a later optimization will strip the useless
instruction or the encoder is responsible for not compressing the
instruction.
2023-10-06 10:28:01 -07:00

449 lines
14 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=riscv32 \
; RUN: | FileCheck %s --check-prefixes=RV32-BOTH,RV32
; RUN: llc < %s -mtriple=riscv64 \
; RUN: | FileCheck %s --check-prefixes=RV64-BOTH,RV64
; RUN: llc < %s -mtriple=riscv32 -mattr=+unaligned-scalar-mem \
; RUN: | FileCheck %s --check-prefixes=RV32-BOTH,RV32-FAST
; RUN: llc < %s -mtriple=riscv64 -mattr=+unaligned-scalar-mem \
; RUN: | FileCheck %s --check-prefixes=RV64-BOTH,RV64-FAST
%struct.x = type { i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8 }
@src = external dso_local global %struct.x
@dst = external dso_local global %struct.x
@.str1 = private unnamed_addr constant [31 x i8] c"DHRYSTONE PROGRAM, SOME STRING\00", align 1
@.str2 = private unnamed_addr constant [36 x i8] c"DHRYSTONE PROGRAM, SOME STRING BLAH\00", align 1
@.str3 = private unnamed_addr constant [24 x i8] c"DHRYSTONE PROGRAM, SOME\00", align 1
@.str4 = private unnamed_addr constant [18 x i8] c"DHRYSTONE PROGR \00", align 1
@.str5 = private unnamed_addr constant [7 x i8] c"DHRYST\00", align 1
@.str6 = private unnamed_addr constant [14 x i8] c"/tmp/rmXXXXXX\00", align 1
@spool.splbuf = internal global [512 x i8] zeroinitializer, align 16
define i32 @t0() {
; RV32-LABEL: t0:
; RV32: # %bb.0: # %entry
; RV32-NEXT: lui a0, %hi(src)
; RV32-NEXT: lw a1, %lo(src)(a0)
; RV32-NEXT: lui a2, %hi(dst)
; RV32-NEXT: sw a1, %lo(dst)(a2)
; RV32-NEXT: addi a0, a0, %lo(src)
; RV32-NEXT: lbu a1, 10(a0)
; RV32-NEXT: lh a3, 8(a0)
; RV32-NEXT: lw a0, 4(a0)
; RV32-NEXT: addi a2, a2, %lo(dst)
; RV32-NEXT: sb a1, 10(a2)
; RV32-NEXT: sh a3, 8(a2)
; RV32-NEXT: sw a0, 4(a2)
; RV32-NEXT: li a0, 0
; RV32-NEXT: ret
;
; RV64-LABEL: t0:
; RV64: # %bb.0: # %entry
; RV64-NEXT: lui a0, %hi(src)
; RV64-NEXT: ld a1, %lo(src)(a0)
; RV64-NEXT: lui a2, %hi(dst)
; RV64-NEXT: addi a0, a0, %lo(src)
; RV64-NEXT: lbu a3, 10(a0)
; RV64-NEXT: lh a0, 8(a0)
; RV64-NEXT: sd a1, %lo(dst)(a2)
; RV64-NEXT: addi a1, a2, %lo(dst)
; RV64-NEXT: sb a3, 10(a1)
; RV64-NEXT: sh a0, 8(a1)
; RV64-NEXT: li a0, 0
; RV64-NEXT: ret
;
; RV32-FAST-LABEL: t0:
; RV32-FAST: # %bb.0: # %entry
; RV32-FAST-NEXT: lui a0, %hi(src)
; RV32-FAST-NEXT: lw a1, %lo(src)(a0)
; RV32-FAST-NEXT: lui a2, %hi(dst)
; RV32-FAST-NEXT: addi a0, a0, %lo(src)
; RV32-FAST-NEXT: lw a3, 7(a0)
; RV32-FAST-NEXT: lw a0, 4(a0)
; RV32-FAST-NEXT: sw a1, %lo(dst)(a2)
; RV32-FAST-NEXT: addi a1, a2, %lo(dst)
; RV32-FAST-NEXT: sw a3, 7(a1)
; RV32-FAST-NEXT: sw a0, 4(a1)
; RV32-FAST-NEXT: li a0, 0
; RV32-FAST-NEXT: ret
;
; RV64-FAST-LABEL: t0:
; RV64-FAST: # %bb.0: # %entry
; RV64-FAST-NEXT: lui a0, %hi(src)
; RV64-FAST-NEXT: ld a1, %lo(src)(a0)
; RV64-FAST-NEXT: addi a0, a0, %lo(src)
; RV64-FAST-NEXT: lw a0, 7(a0)
; RV64-FAST-NEXT: lui a2, %hi(dst)
; RV64-FAST-NEXT: sd a1, %lo(dst)(a2)
; RV64-FAST-NEXT: addi a1, a2, %lo(dst)
; RV64-FAST-NEXT: sw a0, 7(a1)
; RV64-FAST-NEXT: li a0, 0
; RV64-FAST-NEXT: ret
entry:
call void @llvm.memcpy.p0.p0.i32(ptr align 8 @dst, ptr align 8 @src, i32 11, i1 false)
ret i32 0
}
define void @t1(ptr nocapture %C) nounwind {
; RV32-LABEL: t1:
; RV32: # %bb.0: # %entry
; RV32-NEXT: lui a1, %hi(.L.str1)
; RV32-NEXT: addi a1, a1, %lo(.L.str1)
; RV32-NEXT: li a2, 31
; RV32-NEXT: tail memcpy@plt
;
; RV64-LABEL: t1:
; RV64: # %bb.0: # %entry
; RV64-NEXT: lui a1, %hi(.L.str1)
; RV64-NEXT: addi a1, a1, %lo(.L.str1)
; RV64-NEXT: li a2, 31
; RV64-NEXT: tail memcpy@plt
;
; RV32-FAST-LABEL: t1:
; RV32-FAST: # %bb.0: # %entry
; RV32-FAST-NEXT: lui a1, 1141
; RV32-FAST-NEXT: addi a1, a1, -439
; RV32-FAST-NEXT: sw a1, 27(a0)
; RV32-FAST-NEXT: lui a1, 300325
; RV32-FAST-NEXT: addi a1, a1, 1107
; RV32-FAST-NEXT: sw a1, 24(a0)
; RV32-FAST-NEXT: lui a1, 132181
; RV32-FAST-NEXT: addi a1, a1, -689
; RV32-FAST-NEXT: sw a1, 20(a0)
; RV32-FAST-NEXT: lui a1, 340483
; RV32-FAST-NEXT: addi a1, a1, -947
; RV32-FAST-NEXT: sw a1, 16(a0)
; RV32-FAST-NEXT: lui a1, 267556
; RV32-FAST-NEXT: addi a1, a1, 1871
; RV32-FAST-NEXT: sw a1, 12(a0)
; RV32-FAST-NEXT: lui a1, 337154
; RV32-FAST-NEXT: addi a1, a1, 69
; RV32-FAST-NEXT: sw a1, 8(a0)
; RV32-FAST-NEXT: lui a1, 320757
; RV32-FAST-NEXT: addi a1, a1, 1107
; RV32-FAST-NEXT: sw a1, 4(a0)
; RV32-FAST-NEXT: lui a1, 365861
; RV32-FAST-NEXT: addi a1, a1, -1980
; RV32-FAST-NEXT: sw a1, 0(a0)
; RV32-FAST-NEXT: ret
;
; RV64-FAST-LABEL: t1:
; RV64-FAST: # %bb.0: # %entry
; RV64-FAST-NEXT: lui a1, %hi(.L.str1)
; RV64-FAST-NEXT: ld a2, %lo(.L.str1)(a1)
; RV64-FAST-NEXT: addi a1, a1, %lo(.L.str1)
; RV64-FAST-NEXT: ld a3, 23(a1)
; RV64-FAST-NEXT: ld a4, 16(a1)
; RV64-FAST-NEXT: ld a1, 8(a1)
; RV64-FAST-NEXT: sd a2, 0(a0)
; RV64-FAST-NEXT: sd a3, 23(a0)
; RV64-FAST-NEXT: sd a4, 16(a0)
; RV64-FAST-NEXT: sd a1, 8(a0)
; RV64-FAST-NEXT: ret
entry:
tail call void @llvm.memcpy.p0.p0.i64(ptr %C, ptr @.str1, i64 31, i1 false)
ret void
}
define void @t2(ptr nocapture %C) nounwind {
; RV32-BOTH-LABEL: t2:
; RV32-BOTH: # %bb.0: # %entry
; RV32-BOTH-NEXT: lui a1, %hi(.L.str2)
; RV32-BOTH-NEXT: addi a1, a1, %lo(.L.str2)
; RV32-BOTH-NEXT: li a2, 36
; RV32-BOTH-NEXT: tail memcpy@plt
;
; RV64-LABEL: t2:
; RV64: # %bb.0: # %entry
; RV64-NEXT: lui a1, %hi(.L.str2)
; RV64-NEXT: addi a1, a1, %lo(.L.str2)
; RV64-NEXT: li a2, 36
; RV64-NEXT: tail memcpy@plt
;
; RV64-FAST-LABEL: t2:
; RV64-FAST: # %bb.0: # %entry
; RV64-FAST-NEXT: lui a1, %hi(.L.str2)
; RV64-FAST-NEXT: ld a2, %lo(.L.str2)(a1)
; RV64-FAST-NEXT: sd a2, 0(a0)
; RV64-FAST-NEXT: lui a2, 1156
; RV64-FAST-NEXT: addi a2, a2, 332
; RV64-FAST-NEXT: addi a1, a1, %lo(.L.str2)
; RV64-FAST-NEXT: ld a3, 24(a1)
; RV64-FAST-NEXT: ld a4, 16(a1)
; RV64-FAST-NEXT: ld a1, 8(a1)
; RV64-FAST-NEXT: sw a2, 32(a0)
; RV64-FAST-NEXT: sd a3, 24(a0)
; RV64-FAST-NEXT: sd a4, 16(a0)
; RV64-FAST-NEXT: sd a1, 8(a0)
; RV64-FAST-NEXT: ret
entry:
tail call void @llvm.memcpy.p0.p0.i64(ptr %C, ptr @.str2, i64 36, i1 false)
ret void
}
define void @t3(ptr nocapture %C) nounwind {
; RV32-LABEL: t3:
; RV32: # %bb.0: # %entry
; RV32-NEXT: lui a1, %hi(.L.str3)
; RV32-NEXT: addi a1, a1, %lo(.L.str3)
; RV32-NEXT: li a2, 24
; RV32-NEXT: tail memcpy@plt
;
; RV64-LABEL: t3:
; RV64: # %bb.0: # %entry
; RV64-NEXT: lui a1, %hi(.L.str3)
; RV64-NEXT: addi a1, a1, %lo(.L.str3)
; RV64-NEXT: li a2, 24
; RV64-NEXT: tail memcpy@plt
;
; RV32-FAST-LABEL: t3:
; RV32-FAST: # %bb.0: # %entry
; RV32-FAST-NEXT: lui a1, 1109
; RV32-FAST-NEXT: addi a1, a1, -689
; RV32-FAST-NEXT: sw a1, 20(a0)
; RV32-FAST-NEXT: lui a1, 340483
; RV32-FAST-NEXT: addi a1, a1, -947
; RV32-FAST-NEXT: sw a1, 16(a0)
; RV32-FAST-NEXT: lui a1, 267556
; RV32-FAST-NEXT: addi a1, a1, 1871
; RV32-FAST-NEXT: sw a1, 12(a0)
; RV32-FAST-NEXT: lui a1, 337154
; RV32-FAST-NEXT: addi a1, a1, 69
; RV32-FAST-NEXT: sw a1, 8(a0)
; RV32-FAST-NEXT: lui a1, 320757
; RV32-FAST-NEXT: addi a1, a1, 1107
; RV32-FAST-NEXT: sw a1, 4(a0)
; RV32-FAST-NEXT: lui a1, 365861
; RV32-FAST-NEXT: addi a1, a1, -1980
; RV32-FAST-NEXT: sw a1, 0(a0)
; RV32-FAST-NEXT: ret
;
; RV64-FAST-LABEL: t3:
; RV64-FAST: # %bb.0: # %entry
; RV64-FAST-NEXT: lui a1, %hi(.L.str3)
; RV64-FAST-NEXT: ld a2, %lo(.L.str3)(a1)
; RV64-FAST-NEXT: addi a1, a1, %lo(.L.str3)
; RV64-FAST-NEXT: ld a3, 16(a1)
; RV64-FAST-NEXT: ld a1, 8(a1)
; RV64-FAST-NEXT: sd a2, 0(a0)
; RV64-FAST-NEXT: sd a3, 16(a0)
; RV64-FAST-NEXT: sd a1, 8(a0)
; RV64-FAST-NEXT: ret
entry:
tail call void @llvm.memcpy.p0.p0.i64(ptr %C, ptr @.str3, i64 24, i1 false)
ret void
}
define void @t4(ptr nocapture %C) nounwind {
; RV32-LABEL: t4:
; RV32: # %bb.0: # %entry
; RV32-NEXT: lui a1, %hi(.L.str4)
; RV32-NEXT: addi a1, a1, %lo(.L.str4)
; RV32-NEXT: li a2, 18
; RV32-NEXT: tail memcpy@plt
;
; RV64-LABEL: t4:
; RV64: # %bb.0: # %entry
; RV64-NEXT: lui a1, %hi(.L.str4)
; RV64-NEXT: addi a1, a1, %lo(.L.str4)
; RV64-NEXT: li a2, 18
; RV64-NEXT: tail memcpy@plt
;
; RV32-FAST-LABEL: t4:
; RV32-FAST: # %bb.0: # %entry
; RV32-FAST-NEXT: li a1, 32
; RV32-FAST-NEXT: sh a1, 16(a0)
; RV32-FAST-NEXT: lui a1, 132388
; RV32-FAST-NEXT: addi a1, a1, 1871
; RV32-FAST-NEXT: sw a1, 12(a0)
; RV32-FAST-NEXT: lui a1, 337154
; RV32-FAST-NEXT: addi a1, a1, 69
; RV32-FAST-NEXT: sw a1, 8(a0)
; RV32-FAST-NEXT: lui a1, 320757
; RV32-FAST-NEXT: addi a1, a1, 1107
; RV32-FAST-NEXT: sw a1, 4(a0)
; RV32-FAST-NEXT: lui a1, 365861
; RV32-FAST-NEXT: addi a1, a1, -1980
; RV32-FAST-NEXT: sw a1, 0(a0)
; RV32-FAST-NEXT: ret
;
; RV64-FAST-LABEL: t4:
; RV64-FAST: # %bb.0: # %entry
; RV64-FAST-NEXT: lui a1, %hi(.L.str4)
; RV64-FAST-NEXT: ld a2, %lo(.L.str4)(a1)
; RV64-FAST-NEXT: addi a1, a1, %lo(.L.str4)
; RV64-FAST-NEXT: ld a1, 8(a1)
; RV64-FAST-NEXT: li a3, 32
; RV64-FAST-NEXT: sh a3, 16(a0)
; RV64-FAST-NEXT: sd a2, 0(a0)
; RV64-FAST-NEXT: sd a1, 8(a0)
; RV64-FAST-NEXT: ret
entry:
tail call void @llvm.memcpy.p0.p0.i64(ptr %C, ptr @.str4, i64 18, i1 false)
ret void
}
define void @t5(ptr nocapture %C) nounwind {
; RV32-LABEL: t5:
; RV32: # %bb.0: # %entry
; RV32-NEXT: sb zero, 6(a0)
; RV32-NEXT: li a1, 84
; RV32-NEXT: sb a1, 5(a0)
; RV32-NEXT: li a1, 83
; RV32-NEXT: sb a1, 4(a0)
; RV32-NEXT: li a1, 89
; RV32-NEXT: sb a1, 3(a0)
; RV32-NEXT: li a1, 82
; RV32-NEXT: sb a1, 2(a0)
; RV32-NEXT: li a1, 72
; RV32-NEXT: sb a1, 1(a0)
; RV32-NEXT: li a1, 68
; RV32-NEXT: sb a1, 0(a0)
; RV32-NEXT: ret
;
; RV64-LABEL: t5:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sb zero, 6(a0)
; RV64-NEXT: li a1, 84
; RV64-NEXT: sb a1, 5(a0)
; RV64-NEXT: li a1, 83
; RV64-NEXT: sb a1, 4(a0)
; RV64-NEXT: li a1, 89
; RV64-NEXT: sb a1, 3(a0)
; RV64-NEXT: li a1, 82
; RV64-NEXT: sb a1, 2(a0)
; RV64-NEXT: li a1, 72
; RV64-NEXT: sb a1, 1(a0)
; RV64-NEXT: li a1, 68
; RV64-NEXT: sb a1, 0(a0)
; RV64-NEXT: ret
;
; RV32-FAST-LABEL: t5:
; RV32-FAST: # %bb.0: # %entry
; RV32-FAST-NEXT: lui a1, 1349
; RV32-FAST-NEXT: addi a1, a1, 857
; RV32-FAST-NEXT: sw a1, 3(a0)
; RV32-FAST-NEXT: lui a1, 365861
; RV32-FAST-NEXT: addi a1, a1, -1980
; RV32-FAST-NEXT: sw a1, 0(a0)
; RV32-FAST-NEXT: ret
;
; RV64-FAST-LABEL: t5:
; RV64-FAST: # %bb.0: # %entry
; RV64-FAST-NEXT: lui a1, 1349
; RV64-FAST-NEXT: addi a1, a1, 857
; RV64-FAST-NEXT: sw a1, 3(a0)
; RV64-FAST-NEXT: lui a1, 365861
; RV64-FAST-NEXT: addi a1, a1, -1980
; RV64-FAST-NEXT: sw a1, 0(a0)
; RV64-FAST-NEXT: ret
entry:
tail call void @llvm.memcpy.p0.p0.i64(ptr %C, ptr @.str5, i64 7, i1 false)
ret void
}
define void @t6() nounwind {
; RV32-LABEL: t6:
; RV32: # %bb.0: # %entry
; RV32-NEXT: addi sp, sp, -16
; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32-NEXT: lui a0, %hi(spool.splbuf)
; RV32-NEXT: addi a0, a0, %lo(spool.splbuf)
; RV32-NEXT: lui a1, %hi(.L.str6)
; RV32-NEXT: addi a1, a1, %lo(.L.str6)
; RV32-NEXT: li a2, 14
; RV32-NEXT: call memcpy@plt
; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32-NEXT: addi sp, sp, 16
; RV32-NEXT: ret
;
; RV64-LABEL: t6:
; RV64: # %bb.0: # %entry
; RV64-NEXT: addi sp, sp, -16
; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64-NEXT: lui a0, %hi(spool.splbuf)
; RV64-NEXT: addi a0, a0, %lo(spool.splbuf)
; RV64-NEXT: lui a1, %hi(.L.str6)
; RV64-NEXT: addi a1, a1, %lo(.L.str6)
; RV64-NEXT: li a2, 14
; RV64-NEXT: call memcpy@plt
; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64-NEXT: addi sp, sp, 16
; RV64-NEXT: ret
;
; RV32-FAST-LABEL: t6:
; RV32-FAST: # %bb.0: # %entry
; RV32-FAST-NEXT: lui a0, %hi(spool.splbuf)
; RV32-FAST-NEXT: li a1, 88
; RV32-FAST-NEXT: sh a1, %lo(spool.splbuf+12)(a0)
; RV32-FAST-NEXT: lui a1, 361862
; RV32-FAST-NEXT: addi a1, a1, -1960
; RV32-FAST-NEXT: sw a1, %lo(spool.splbuf+8)(a0)
; RV32-FAST-NEXT: lui a1, 362199
; RV32-FAST-NEXT: addi a1, a1, 559
; RV32-FAST-NEXT: sw a1, %lo(spool.splbuf+4)(a0)
; RV32-FAST-NEXT: lui a1, 460503
; RV32-FAST-NEXT: addi a1, a1, 1071
; RV32-FAST-NEXT: sw a1, %lo(spool.splbuf)(a0)
; RV32-FAST-NEXT: ret
;
; RV64-FAST-LABEL: t6:
; RV64-FAST: # %bb.0: # %entry
; RV64-FAST-NEXT: lui a0, %hi(.L.str6)
; RV64-FAST-NEXT: ld a1, %lo(.L.str6)(a0)
; RV64-FAST-NEXT: addi a0, a0, %lo(.L.str6)
; RV64-FAST-NEXT: ld a0, 6(a0)
; RV64-FAST-NEXT: lui a2, %hi(spool.splbuf)
; RV64-FAST-NEXT: sd a1, %lo(spool.splbuf)(a2)
; RV64-FAST-NEXT: sd a0, %lo(spool.splbuf+6)(a2)
; RV64-FAST-NEXT: ret
entry:
call void @llvm.memcpy.p0.p0.i64(ptr @spool.splbuf, ptr @.str6, i64 14, i1 false)
ret void
}
%struct.Foo = type { i32, i32, i32, i32 }
define void @t7(ptr nocapture %a, ptr nocapture %b) nounwind {
; RV32-BOTH-LABEL: t7:
; RV32-BOTH: # %bb.0: # %entry
; RV32-BOTH-NEXT: lw a2, 12(a1)
; RV32-BOTH-NEXT: sw a2, 12(a0)
; RV32-BOTH-NEXT: lw a2, 8(a1)
; RV32-BOTH-NEXT: sw a2, 8(a0)
; RV32-BOTH-NEXT: lw a2, 4(a1)
; RV32-BOTH-NEXT: sw a2, 4(a0)
; RV32-BOTH-NEXT: lw a1, 0(a1)
; RV32-BOTH-NEXT: sw a1, 0(a0)
; RV32-BOTH-NEXT: ret
;
; RV64-LABEL: t7:
; RV64: # %bb.0: # %entry
; RV64-NEXT: lw a2, 12(a1)
; RV64-NEXT: sw a2, 12(a0)
; RV64-NEXT: lw a2, 8(a1)
; RV64-NEXT: sw a2, 8(a0)
; RV64-NEXT: lw a2, 4(a1)
; RV64-NEXT: sw a2, 4(a0)
; RV64-NEXT: lw a1, 0(a1)
; RV64-NEXT: sw a1, 0(a0)
; RV64-NEXT: ret
;
; RV64-FAST-LABEL: t7:
; RV64-FAST: # %bb.0: # %entry
; RV64-FAST-NEXT: ld a2, 8(a1)
; RV64-FAST-NEXT: sd a2, 8(a0)
; RV64-FAST-NEXT: ld a1, 0(a1)
; RV64-FAST-NEXT: sd a1, 0(a0)
; RV64-FAST-NEXT: ret
entry:
tail call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a, ptr align 4 %b, i32 16, i1 false)
ret void
}
declare void @llvm.memcpy.p0.p0.i32(ptr nocapture, ptr nocapture, i32, i1) nounwind
declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
; RV64-BOTH: {{.*}}