[RISCV] Add signext attribute to i32 arguments in some tests. NFC

This commit is contained in:
Craig Topper 2022-10-08 10:49:52 -07:00
parent 2bb34cc462
commit 39532ea073
3 changed files with 64 additions and 143 deletions

View File

@ -51,10 +51,9 @@ declare void @hoge()
; Because custom type legalization for i32 is enabled, this resulted in
; LowerOperation being called for the amount. This was not expected and
; triggered an assert.
define i32 @crash(i32 %x, i32 %y, i32 %z) {
define i32 @crash(i32 signext %x, i32 signext %y, i32 signext %z) {
; RV64I-LABEL: crash:
; RV64I: # %bb.0:
; RV64I-NEXT: sext.w a0, a0
; RV64I-NEXT: seqz a3, a0
; RV64I-NEXT: addw a0, a1, a2
; RV64I-NEXT: slli a1, a3, 3

View File

@ -4,7 +4,7 @@
; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
; RUN: | FileCheck %s -check-prefix=RV64I
define i1 @and_icmp_eq(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
define i1 @and_icmp_eq(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d) nounwind {
; RV32I-LABEL: and_icmp_eq:
; RV32I: # %bb.0:
; RV32I-NEXT: xor a0, a0, a1
@ -18,7 +18,6 @@ define i1 @and_icmp_eq(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
; RV64I-NEXT: xor a0, a0, a1
; RV64I-NEXT: xor a1, a2, a3
; RV64I-NEXT: or a0, a0, a1
; RV64I-NEXT: sext.w a0, a0
; RV64I-NEXT: seqz a0, a0
; RV64I-NEXT: ret
%cmp1 = icmp eq i32 %a, %b
@ -27,7 +26,7 @@ define i1 @and_icmp_eq(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
ret i1 %and
}
define i1 @or_icmp_ne(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
define i1 @or_icmp_ne(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d) nounwind {
; RV32I-LABEL: or_icmp_ne:
; RV32I: # %bb.0:
; RV32I-NEXT: xor a0, a0, a1
@ -41,7 +40,6 @@ define i1 @or_icmp_ne(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
; RV64I-NEXT: xor a0, a0, a1
; RV64I-NEXT: xor a1, a2, a3
; RV64I-NEXT: or a0, a0, a1
; RV64I-NEXT: sext.w a0, a0
; RV64I-NEXT: snez a0, a0
; RV64I-NEXT: ret
%cmp1 = icmp ne i32 %a, %b

View File

@ -7,7 +7,7 @@
;
; Get the actual value of the overflow bit.
;
define zeroext i1 @saddo1.i32(i32 %v1, i32 %v2, i32* %res) {
define zeroext i1 @saddo1.i32(i32 signext %v1, i32 signext %v2, i32* %res) {
; RV32-LABEL: saddo1.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: add a3, a0, a1
@ -19,8 +19,6 @@ define zeroext i1 @saddo1.i32(i32 %v1, i32 %v2, i32* %res) {
;
; RV64-LABEL: saddo1.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sext.w a1, a1
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: add a3, a0, a1
; RV64-NEXT: addw a0, a0, a1
; RV64-NEXT: xor a0, a0, a3
@ -39,8 +37,6 @@ define zeroext i1 @saddo1.i32(i32 %v1, i32 %v2, i32* %res) {
;
; RV64ZBA-LABEL: saddo1.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: sext.w a1, a1
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: add a3, a0, a1
; RV64ZBA-NEXT: addw a0, a0, a1
; RV64ZBA-NEXT: xor a0, a0, a3
@ -56,7 +52,7 @@ entry:
}
; Test the immediate version.
define zeroext i1 @saddo2.i32(i32 %v1, i32* %res) {
define zeroext i1 @saddo2.i32(i32 signext %v1, i32* %res) {
; RV32-LABEL: saddo2.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: addi a2, a0, 4
@ -66,7 +62,6 @@ define zeroext i1 @saddo2.i32(i32 %v1, i32* %res) {
;
; RV64-LABEL: saddo2.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: addi a2, a0, 4
; RV64-NEXT: addiw a0, a0, 4
; RV64-NEXT: xor a0, a0, a2
@ -83,7 +78,6 @@ define zeroext i1 @saddo2.i32(i32 %v1, i32* %res) {
;
; RV64ZBA-LABEL: saddo2.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: addi a2, a0, 4
; RV64ZBA-NEXT: addiw a0, a0, 4
; RV64ZBA-NEXT: xor a0, a0, a2
@ -99,7 +93,7 @@ entry:
}
; Test negative immediates.
define zeroext i1 @saddo3.i32(i32 %v1, i32* %res) {
define zeroext i1 @saddo3.i32(i32 signext %v1, i32* %res) {
; RV32-LABEL: saddo3.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: addi a2, a0, -4
@ -110,7 +104,6 @@ define zeroext i1 @saddo3.i32(i32 %v1, i32* %res) {
;
; RV64-LABEL: saddo3.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: addi a2, a0, -4
; RV64-NEXT: addiw a0, a0, -4
; RV64-NEXT: xor a0, a0, a2
@ -128,7 +121,6 @@ define zeroext i1 @saddo3.i32(i32 %v1, i32* %res) {
;
; RV64ZBA-LABEL: saddo3.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: addi a2, a0, -4
; RV64ZBA-NEXT: addiw a0, a0, -4
; RV64ZBA-NEXT: xor a0, a0, a2
@ -144,7 +136,7 @@ entry:
}
; Test immediates that are too large to be encoded.
define zeroext i1 @saddo4.i32(i32 %v1, i32* %res) {
define zeroext i1 @saddo4.i32(i32 signext %v1, i32* %res) {
; RV32-LABEL: saddo4.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: lui a2, 4096
@ -156,7 +148,6 @@ define zeroext i1 @saddo4.i32(i32 %v1, i32* %res) {
;
; RV64-LABEL: saddo4.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: lui a2, 4096
; RV64-NEXT: addiw a2, a2, -1
; RV64-NEXT: add a3, a0, a2
@ -177,7 +168,6 @@ define zeroext i1 @saddo4.i32(i32 %v1, i32* %res) {
;
; RV64ZBA-LABEL: saddo4.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: lui a2, 4096
; RV64ZBA-NEXT: addiw a2, a2, -1
; RV64ZBA-NEXT: add a3, a0, a2
@ -348,7 +338,7 @@ entry:
ret i1 %obit
}
define zeroext i1 @uaddo.i32(i32 %v1, i32 %v2, i32* %res) {
define zeroext i1 @uaddo.i32(i32 signext %v1, i32 signext %v2, i32* %res) {
; RV32-LABEL: uaddo.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: add a1, a0, a1
@ -359,7 +349,6 @@ define zeroext i1 @uaddo.i32(i32 %v1, i32 %v2, i32* %res) {
; RV64-LABEL: uaddo.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: addw a1, a0, a1
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: sltu a0, a1, a0
; RV64-NEXT: sw a1, 0(a2)
; RV64-NEXT: ret
@ -374,7 +363,6 @@ define zeroext i1 @uaddo.i32(i32 %v1, i32 %v2, i32* %res) {
; RV64ZBA-LABEL: uaddo.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: addw a1, a0, a1
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: sltu a0, a1, a0
; RV64ZBA-NEXT: sw a1, 0(a2)
; RV64ZBA-NEXT: ret
@ -386,7 +374,7 @@ entry:
ret i1 %obit
}
define zeroext i1 @uaddo.i32.constant(i32 %v1, i32* %res) {
define zeroext i1 @uaddo.i32.constant(i32 signext %v1, i32* %res) {
; RV32-LABEL: uaddo.i32.constant:
; RV32: # %bb.0: # %entry
; RV32-NEXT: addi a2, a0, -2
@ -396,10 +384,9 @@ define zeroext i1 @uaddo.i32.constant(i32 %v1, i32* %res) {
;
; RV64-LABEL: uaddo.i32.constant:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sext.w a2, a0
; RV64-NEXT: addiw a3, a0, -2
; RV64-NEXT: sltu a0, a3, a2
; RV64-NEXT: sw a3, 0(a1)
; RV64-NEXT: addiw a2, a0, -2
; RV64-NEXT: sltu a0, a2, a0
; RV64-NEXT: sw a2, 0(a1)
; RV64-NEXT: ret
;
; RV32ZBA-LABEL: uaddo.i32.constant:
@ -411,10 +398,9 @@ define zeroext i1 @uaddo.i32.constant(i32 %v1, i32* %res) {
;
; RV64ZBA-LABEL: uaddo.i32.constant:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: sext.w a2, a0
; RV64ZBA-NEXT: addiw a3, a0, -2
; RV64ZBA-NEXT: sltu a0, a3, a2
; RV64ZBA-NEXT: sw a3, 0(a1)
; RV64ZBA-NEXT: addiw a2, a0, -2
; RV64ZBA-NEXT: sltu a0, a2, a0
; RV64ZBA-NEXT: sw a2, 0(a1)
; RV64ZBA-NEXT: ret
entry:
%t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 -2)
@ -424,7 +410,7 @@ entry:
ret i1 %obit
}
define zeroext i1 @uaddo.i32.constant_one(i32 %v1, i32* %res) {
define zeroext i1 @uaddo.i32.constant_one(i32 signext %v1, i32* %res) {
; RV32-LABEL: uaddo.i32.constant_one:
; RV32: # %bb.0: # %entry
; RV32-NEXT: addi a2, a0, 1
@ -560,7 +546,7 @@ entry:
ret i1 %obit
}
define zeroext i1 @ssubo1.i32(i32 %v1, i32 %v2, i32* %res) {
define zeroext i1 @ssubo1.i32(i32 signext %v1, i32 signext %v2, i32* %res) {
; RV32-LABEL: ssubo1.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: sgtz a3, a1
@ -572,8 +558,6 @@ define zeroext i1 @ssubo1.i32(i32 %v1, i32 %v2, i32* %res) {
;
; RV64-LABEL: ssubo1.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sext.w a1, a1
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: sub a3, a0, a1
; RV64-NEXT: subw a0, a0, a1
; RV64-NEXT: xor a0, a0, a3
@ -592,8 +576,6 @@ define zeroext i1 @ssubo1.i32(i32 %v1, i32 %v2, i32* %res) {
;
; RV64ZBA-LABEL: ssubo1.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: sext.w a1, a1
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: sub a3, a0, a1
; RV64ZBA-NEXT: subw a0, a0, a1
; RV64ZBA-NEXT: xor a0, a0, a3
@ -608,7 +590,7 @@ entry:
ret i1 %obit
}
define zeroext i1 @ssubo2.i32(i32 %v1, i32* %res) {
define zeroext i1 @ssubo2.i32(i32 signext %v1, i32* %res) {
; RV32-LABEL: ssubo2.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: addi a2, a0, 4
@ -618,7 +600,6 @@ define zeroext i1 @ssubo2.i32(i32 %v1, i32* %res) {
;
; RV64-LABEL: ssubo2.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: addi a2, a0, 4
; RV64-NEXT: addiw a0, a0, 4
; RV64-NEXT: xor a0, a0, a2
@ -635,7 +616,6 @@ define zeroext i1 @ssubo2.i32(i32 %v1, i32* %res) {
;
; RV64ZBA-LABEL: ssubo2.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: addi a2, a0, 4
; RV64ZBA-NEXT: addiw a0, a0, 4
; RV64ZBA-NEXT: xor a0, a0, a2
@ -706,7 +686,7 @@ entry:
ret i1 %obit
}
define zeroext i1 @usubo.i32(i32 %v1, i32 %v2, i32* %res) {
define zeroext i1 @usubo.i32(i32 signext %v1, i32 signext %v2, i32* %res) {
; RV32-LABEL: usubo.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: sub a1, a0, a1
@ -717,7 +697,6 @@ define zeroext i1 @usubo.i32(i32 %v1, i32 %v2, i32* %res) {
; RV64-LABEL: usubo.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: subw a1, a0, a1
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: sltu a0, a0, a1
; RV64-NEXT: sw a1, 0(a2)
; RV64-NEXT: ret
@ -732,7 +711,6 @@ define zeroext i1 @usubo.i32(i32 %v1, i32 %v2, i32* %res) {
; RV64ZBA-LABEL: usubo.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: subw a1, a0, a1
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: sltu a0, a0, a1
; RV64ZBA-NEXT: sw a1, 0(a2)
; RV64ZBA-NEXT: ret
@ -744,7 +722,7 @@ entry:
ret i1 %obit
}
define zeroext i1 @usubo.i32.constant.rhs(i32 %v1, i32* %res) {
define zeroext i1 @usubo.i32.constant.rhs(i32 signext %v1, i32* %res) {
; RV32-LABEL: usubo.i32.constant.rhs:
; RV32: # %bb.0: # %entry
; RV32-NEXT: addi a2, a0, 2
@ -755,7 +733,6 @@ define zeroext i1 @usubo.i32.constant.rhs(i32 %v1, i32* %res) {
; RV64-LABEL: usubo.i32.constant.rhs:
; RV64: # %bb.0: # %entry
; RV64-NEXT: addiw a2, a0, 2
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: sltu a0, a0, a2
; RV64-NEXT: sw a2, 0(a1)
; RV64-NEXT: ret
@ -770,7 +747,6 @@ define zeroext i1 @usubo.i32.constant.rhs(i32 %v1, i32* %res) {
; RV64ZBA-LABEL: usubo.i32.constant.rhs:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: addiw a2, a0, 2
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: sltu a0, a0, a2
; RV64ZBA-NEXT: sw a2, 0(a1)
; RV64ZBA-NEXT: ret
@ -782,7 +758,7 @@ entry:
ret i1 %obit
}
define zeroext i1 @usubo.i32.constant.lhs(i32 %v1, i32* %res) {
define zeroext i1 @usubo.i32.constant.lhs(i32 signext %v1, i32* %res) {
; RV32-LABEL: usubo.i32.constant.lhs:
; RV32: # %bb.0: # %entry
; RV32-NEXT: li a2, -2
@ -882,7 +858,7 @@ entry:
ret i1 %obit
}
define zeroext i1 @smulo.i32(i32 %v1, i32 %v2, i32* %res) {
define zeroext i1 @smulo.i32(i32 signext %v1, i32 signext %v2, i32* %res) {
; RV32-LABEL: smulo.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: mulh a3, a0, a1
@ -895,8 +871,6 @@ define zeroext i1 @smulo.i32(i32 %v1, i32 %v2, i32* %res) {
;
; RV64-LABEL: smulo.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sext.w a1, a1
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: mul a3, a0, a1
; RV64-NEXT: mulw a0, a0, a1
; RV64-NEXT: xor a0, a0, a3
@ -916,8 +890,6 @@ define zeroext i1 @smulo.i32(i32 %v1, i32 %v2, i32* %res) {
;
; RV64ZBA-LABEL: smulo.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: sext.w a1, a1
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: mul a3, a0, a1
; RV64ZBA-NEXT: mulw a0, a0, a1
; RV64ZBA-NEXT: xor a0, a0, a3
@ -932,7 +904,7 @@ entry:
ret i1 %obit
}
define zeroext i1 @smulo2.i32(i32 %v1, i32* %res) {
define zeroext i1 @smulo2.i32(i32 signext %v1, i32* %res) {
; RV32-LABEL: smulo2.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: li a2, 13
@ -946,7 +918,6 @@ define zeroext i1 @smulo2.i32(i32 %v1, i32* %res) {
;
; RV64-LABEL: smulo2.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: li a2, 13
; RV64-NEXT: mul a3, a0, a2
; RV64-NEXT: mulw a0, a0, a2
@ -968,7 +939,6 @@ define zeroext i1 @smulo2.i32(i32 %v1, i32* %res) {
;
; RV64ZBA-LABEL: smulo2.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: sh1add a2, a0, a0
; RV64ZBA-NEXT: sh2add a2, a2, a0
; RV64ZBA-NEXT: sext.w a0, a2
@ -1216,7 +1186,7 @@ entry:
ret i1 %obit
}
define zeroext i1 @umulo.i32(i32 %v1, i32 %v2, i32* %res) {
define zeroext i1 @umulo.i32(i32 signext %v1, i32 signext %v2, i32* %res) {
; RV32-LABEL: umulo.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: mulhu a3, a0, a1
@ -1262,7 +1232,7 @@ entry:
ret i1 %obit
}
define zeroext i1 @umulo2.i32(i32 %v1, i32* %res) {
define zeroext i1 @umulo2.i32(i32 signext %v1, i32* %res) {
; RV32-LABEL: umulo2.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: li a3, 13
@ -1498,7 +1468,7 @@ entry:
;
; Check the use of the overflow bit in combination with a select instruction.
;
define i32 @saddo.select.i32(i32 %v1, i32 %v2) {
define i32 @saddo.select.i32(i32 signext %v1, i32 signext %v2) {
; RV32-LABEL: saddo.select.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: add a2, a0, a1
@ -1512,11 +1482,9 @@ define i32 @saddo.select.i32(i32 %v1, i32 %v2) {
;
; RV64-LABEL: saddo.select.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sext.w a2, a1
; RV64-NEXT: sext.w a3, a0
; RV64-NEXT: add a4, a3, a2
; RV64-NEXT: addw a2, a3, a2
; RV64-NEXT: bne a2, a4, .LBB28_2
; RV64-NEXT: add a2, a0, a1
; RV64-NEXT: addw a3, a0, a1
; RV64-NEXT: bne a3, a2, .LBB28_2
; RV64-NEXT: # %bb.1: # %entry
; RV64-NEXT: mv a0, a1
; RV64-NEXT: .LBB28_2: # %entry
@ -1535,11 +1503,9 @@ define i32 @saddo.select.i32(i32 %v1, i32 %v2) {
;
; RV64ZBA-LABEL: saddo.select.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: sext.w a2, a1
; RV64ZBA-NEXT: sext.w a3, a0
; RV64ZBA-NEXT: add a4, a3, a2
; RV64ZBA-NEXT: addw a2, a3, a2
; RV64ZBA-NEXT: bne a2, a4, .LBB28_2
; RV64ZBA-NEXT: add a2, a0, a1
; RV64ZBA-NEXT: addw a3, a0, a1
; RV64ZBA-NEXT: bne a3, a2, .LBB28_2
; RV64ZBA-NEXT: # %bb.1: # %entry
; RV64ZBA-NEXT: mv a0, a1
; RV64ZBA-NEXT: .LBB28_2: # %entry
@ -1551,7 +1517,7 @@ entry:
ret i32 %ret
}
define i1 @saddo.not.i32(i32 %v1, i32 %v2) {
define i1 @saddo.not.i32(i32 signext %v1, i32 signext %v2) {
; RV32-LABEL: saddo.not.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: add a2, a0, a1
@ -1563,8 +1529,6 @@ define i1 @saddo.not.i32(i32 %v1, i32 %v2) {
;
; RV64-LABEL: saddo.not.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sext.w a1, a1
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: add a2, a0, a1
; RV64-NEXT: addw a0, a0, a1
; RV64-NEXT: xor a0, a0, a2
@ -1582,8 +1546,6 @@ define i1 @saddo.not.i32(i32 %v1, i32 %v2) {
;
; RV64ZBA-LABEL: saddo.not.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: sext.w a1, a1
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: add a2, a0, a1
; RV64ZBA-NEXT: addw a0, a0, a1
; RV64ZBA-NEXT: xor a0, a0, a2
@ -1712,7 +1674,7 @@ entry:
ret i1 %ret
}
define i32 @uaddo.select.i32(i32 %v1, i32 %v2) {
define i32 @uaddo.select.i32(i32 signext %v1, i32 signext %v2) {
; RV32-LABEL: uaddo.select.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: add a2, a0, a1
@ -1725,8 +1687,7 @@ define i32 @uaddo.select.i32(i32 %v1, i32 %v2) {
; RV64-LABEL: uaddo.select.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: addw a2, a0, a1
; RV64-NEXT: sext.w a3, a0
; RV64-NEXT: bltu a2, a3, .LBB32_2
; RV64-NEXT: bltu a2, a0, .LBB32_2
; RV64-NEXT: # %bb.1: # %entry
; RV64-NEXT: mv a0, a1
; RV64-NEXT: .LBB32_2: # %entry
@ -1744,8 +1705,7 @@ define i32 @uaddo.select.i32(i32 %v1, i32 %v2) {
; RV64ZBA-LABEL: uaddo.select.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: addw a2, a0, a1
; RV64ZBA-NEXT: sext.w a3, a0
; RV64ZBA-NEXT: bltu a2, a3, .LBB32_2
; RV64ZBA-NEXT: bltu a2, a0, .LBB32_2
; RV64ZBA-NEXT: # %bb.1: # %entry
; RV64ZBA-NEXT: mv a0, a1
; RV64ZBA-NEXT: .LBB32_2: # %entry
@ -1757,7 +1717,7 @@ entry:
ret i32 %ret
}
define i1 @uaddo.not.i32(i32 %v1, i32 %v2) {
define i1 @uaddo.not.i32(i32 signext %v1, i32 signext %v2) {
; RV32-LABEL: uaddo.not.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: add a1, a0, a1
@ -1768,7 +1728,6 @@ define i1 @uaddo.not.i32(i32 %v1, i32 %v2) {
; RV64-LABEL: uaddo.not.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: addw a1, a0, a1
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: sltu a0, a1, a0
; RV64-NEXT: xori a0, a0, 1
; RV64-NEXT: ret
@ -1783,7 +1742,6 @@ define i1 @uaddo.not.i32(i32 %v1, i32 %v2) {
; RV64ZBA-LABEL: uaddo.not.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: addw a1, a0, a1
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: sltu a0, a1, a0
; RV64ZBA-NEXT: xori a0, a0, 1
; RV64ZBA-NEXT: ret
@ -1904,7 +1862,7 @@ entry:
ret i1 %ret
}
define i32 @ssubo.select.i32(i32 %v1, i32 %v2) {
define i32 @ssubo.select.i32(i32 signext %v1, i32 signext %v2) {
; RV32-LABEL: ssubo.select.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: sgtz a2, a1
@ -1918,11 +1876,9 @@ define i32 @ssubo.select.i32(i32 %v1, i32 %v2) {
;
; RV64-LABEL: ssubo.select.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sext.w a2, a1
; RV64-NEXT: sext.w a3, a0
; RV64-NEXT: sub a4, a3, a2
; RV64-NEXT: subw a2, a3, a2
; RV64-NEXT: bne a2, a4, .LBB36_2
; RV64-NEXT: sub a2, a0, a1
; RV64-NEXT: subw a3, a0, a1
; RV64-NEXT: bne a3, a2, .LBB36_2
; RV64-NEXT: # %bb.1: # %entry
; RV64-NEXT: mv a0, a1
; RV64-NEXT: .LBB36_2: # %entry
@ -1941,11 +1897,9 @@ define i32 @ssubo.select.i32(i32 %v1, i32 %v2) {
;
; RV64ZBA-LABEL: ssubo.select.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: sext.w a2, a1
; RV64ZBA-NEXT: sext.w a3, a0
; RV64ZBA-NEXT: sub a4, a3, a2
; RV64ZBA-NEXT: subw a2, a3, a2
; RV64ZBA-NEXT: bne a2, a4, .LBB36_2
; RV64ZBA-NEXT: sub a2, a0, a1
; RV64ZBA-NEXT: subw a3, a0, a1
; RV64ZBA-NEXT: bne a3, a2, .LBB36_2
; RV64ZBA-NEXT: # %bb.1: # %entry
; RV64ZBA-NEXT: mv a0, a1
; RV64ZBA-NEXT: .LBB36_2: # %entry
@ -1957,7 +1911,7 @@ entry:
ret i32 %ret
}
define i1 @ssubo.not.i32(i32 %v1, i32 %v2) {
define i1 @ssubo.not.i32(i32 signext %v1, i32 signext %v2) {
; RV32-LABEL: ssubo.not.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: sgtz a2, a1
@ -1969,8 +1923,6 @@ define i1 @ssubo.not.i32(i32 %v1, i32 %v2) {
;
; RV64-LABEL: ssubo.not.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sext.w a1, a1
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: sub a2, a0, a1
; RV64-NEXT: subw a0, a0, a1
; RV64-NEXT: xor a0, a0, a2
@ -1988,8 +1940,6 @@ define i1 @ssubo.not.i32(i32 %v1, i32 %v2) {
;
; RV64ZBA-LABEL: ssubo.not.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: sext.w a1, a1
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: sub a2, a0, a1
; RV64ZBA-NEXT: subw a0, a0, a1
; RV64ZBA-NEXT: xor a0, a0, a2
@ -2110,7 +2060,7 @@ entry:
ret i1 %ret
}
define i32 @usubo.select.i32(i32 %v1, i32 %v2) {
define i32 @usubo.select.i32(i32 signext %v1, i32 signext %v2) {
; RV32-LABEL: usubo.select.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: sub a2, a0, a1
@ -2123,8 +2073,7 @@ define i32 @usubo.select.i32(i32 %v1, i32 %v2) {
; RV64-LABEL: usubo.select.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: subw a2, a0, a1
; RV64-NEXT: sext.w a3, a0
; RV64-NEXT: bltu a3, a2, .LBB40_2
; RV64-NEXT: bltu a0, a2, .LBB40_2
; RV64-NEXT: # %bb.1: # %entry
; RV64-NEXT: mv a0, a1
; RV64-NEXT: .LBB40_2: # %entry
@ -2142,8 +2091,7 @@ define i32 @usubo.select.i32(i32 %v1, i32 %v2) {
; RV64ZBA-LABEL: usubo.select.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: subw a2, a0, a1
; RV64ZBA-NEXT: sext.w a3, a0
; RV64ZBA-NEXT: bltu a3, a2, .LBB40_2
; RV64ZBA-NEXT: bltu a0, a2, .LBB40_2
; RV64ZBA-NEXT: # %bb.1: # %entry
; RV64ZBA-NEXT: mv a0, a1
; RV64ZBA-NEXT: .LBB40_2: # %entry
@ -2155,7 +2103,7 @@ entry:
ret i32 %ret
}
define i1 @usubo.not.i32(i32 %v1, i32 %v2) {
define i1 @usubo.not.i32(i32 signext %v1, i32 signext %v2) {
; RV32-LABEL: usubo.not.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: sub a1, a0, a1
@ -2166,7 +2114,6 @@ define i1 @usubo.not.i32(i32 %v1, i32 %v2) {
; RV64-LABEL: usubo.not.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: subw a1, a0, a1
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: sltu a0, a0, a1
; RV64-NEXT: xori a0, a0, 1
; RV64-NEXT: ret
@ -2181,7 +2128,6 @@ define i1 @usubo.not.i32(i32 %v1, i32 %v2) {
; RV64ZBA-LABEL: usubo.not.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: subw a1, a0, a1
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: sltu a0, a0, a1
; RV64ZBA-NEXT: xori a0, a0, 1
; RV64ZBA-NEXT: ret
@ -2310,7 +2256,7 @@ entry:
ret i1 %ret
}
define i32 @smulo.select.i32(i32 %v1, i32 %v2) {
define i32 @smulo.select.i32(i32 signext %v1, i32 signext %v2) {
; RV32-LABEL: smulo.select.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: mulh a2, a0, a1
@ -2324,11 +2270,9 @@ define i32 @smulo.select.i32(i32 %v1, i32 %v2) {
;
; RV64-LABEL: smulo.select.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sext.w a2, a1
; RV64-NEXT: sext.w a3, a0
; RV64-NEXT: mul a4, a3, a2
; RV64-NEXT: mulw a2, a3, a2
; RV64-NEXT: bne a2, a4, .LBB44_2
; RV64-NEXT: mul a2, a0, a1
; RV64-NEXT: mulw a3, a0, a1
; RV64-NEXT: bne a3, a2, .LBB44_2
; RV64-NEXT: # %bb.1: # %entry
; RV64-NEXT: mv a0, a1
; RV64-NEXT: .LBB44_2: # %entry
@ -2347,11 +2291,9 @@ define i32 @smulo.select.i32(i32 %v1, i32 %v2) {
;
; RV64ZBA-LABEL: smulo.select.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: sext.w a2, a1
; RV64ZBA-NEXT: sext.w a3, a0
; RV64ZBA-NEXT: mul a4, a3, a2
; RV64ZBA-NEXT: mulw a2, a3, a2
; RV64ZBA-NEXT: bne a2, a4, .LBB44_2
; RV64ZBA-NEXT: mul a2, a0, a1
; RV64ZBA-NEXT: mulw a3, a0, a1
; RV64ZBA-NEXT: bne a3, a2, .LBB44_2
; RV64ZBA-NEXT: # %bb.1: # %entry
; RV64ZBA-NEXT: mv a0, a1
; RV64ZBA-NEXT: .LBB44_2: # %entry
@ -2363,7 +2305,7 @@ entry:
ret i32 %ret
}
define i1 @smulo.not.i32(i32 %v1, i32 %v2) {
define i1 @smulo.not.i32(i32 signext %v1, i32 signext %v2) {
; RV32-LABEL: smulo.not.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: mulh a2, a0, a1
@ -2375,8 +2317,6 @@ define i1 @smulo.not.i32(i32 %v1, i32 %v2) {
;
; RV64-LABEL: smulo.not.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sext.w a1, a1
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: mul a2, a0, a1
; RV64-NEXT: mulw a0, a0, a1
; RV64-NEXT: xor a0, a0, a2
@ -2394,8 +2334,6 @@ define i1 @smulo.not.i32(i32 %v1, i32 %v2) {
;
; RV64ZBA-LABEL: smulo.not.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: sext.w a1, a1
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: mul a2, a0, a1
; RV64ZBA-NEXT: mulw a0, a0, a1
; RV64ZBA-NEXT: xor a0, a0, a2
@ -2686,7 +2624,7 @@ entry:
ret i1 %ret
}
define i32 @umulo.select.i32(i32 %v1, i32 %v2) {
define i32 @umulo.select.i32(i32 signext %v1, i32 signext %v2) {
; RV32-LABEL: umulo.select.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: mulhu a2, a0, a1
@ -2735,7 +2673,7 @@ entry:
ret i32 %ret
}
define i1 @umulo.not.i32(i32 %v1, i32 %v2) {
define i1 @umulo.not.i32(i32 signext %v1, i32 signext %v2) {
; RV32-LABEL: umulo.not.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: mulhu a0, a0, a1
@ -2912,7 +2850,7 @@ entry:
;
; Check the use of the overflow bit in combination with a branch instruction.
;
define zeroext i1 @saddo.br.i32(i32 %v1, i32 %v2) {
define zeroext i1 @saddo.br.i32(i32 signext %v1, i32 signext %v2) {
; RV32-LABEL: saddo.br.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: add a2, a0, a1
@ -2928,8 +2866,6 @@ define zeroext i1 @saddo.br.i32(i32 %v1, i32 %v2) {
;
; RV64-LABEL: saddo.br.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sext.w a1, a1
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: add a2, a0, a1
; RV64-NEXT: addw a0, a0, a1
; RV64-NEXT: beq a0, a2, .LBB52_2
@ -2955,8 +2891,6 @@ define zeroext i1 @saddo.br.i32(i32 %v1, i32 %v2) {
;
; RV64ZBA-LABEL: saddo.br.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: sext.w a1, a1
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: add a2, a0, a1
; RV64ZBA-NEXT: addw a0, a0, a1
; RV64ZBA-NEXT: beq a0, a2, .LBB52_2
@ -3184,7 +3118,7 @@ continue:
ret i1 true
}
define zeroext i1 @ssubo.br.i32(i32 %v1, i32 %v2) {
define zeroext i1 @ssubo.br.i32(i32 signext %v1, i32 signext %v2) {
; RV32-LABEL: ssubo.br.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: sgtz a2, a1
@ -3200,8 +3134,6 @@ define zeroext i1 @ssubo.br.i32(i32 %v1, i32 %v2) {
;
; RV64-LABEL: ssubo.br.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sext.w a1, a1
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: sub a2, a0, a1
; RV64-NEXT: subw a0, a0, a1
; RV64-NEXT: beq a0, a2, .LBB56_2
@ -3227,8 +3159,6 @@ define zeroext i1 @ssubo.br.i32(i32 %v1, i32 %v2) {
;
; RV64ZBA-LABEL: ssubo.br.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: sext.w a1, a1
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: sub a2, a0, a1
; RV64ZBA-NEXT: subw a0, a0, a1
; RV64ZBA-NEXT: beq a0, a2, .LBB56_2
@ -3322,7 +3252,7 @@ continue:
ret i1 true
}
define zeroext i1 @usubo.br.i32(i32 %v1, i32 %v2) {
define zeroext i1 @usubo.br.i32(i32 signext %v1, i32 signext %v2) {
; RV32-LABEL: usubo.br.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: sub a1, a0, a1
@ -3337,7 +3267,6 @@ define zeroext i1 @usubo.br.i32(i32 %v1, i32 %v2) {
; RV64-LABEL: usubo.br.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: subw a1, a0, a1
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: bgeu a0, a1, .LBB58_2
; RV64-NEXT: # %bb.1: # %overflow
; RV64-NEXT: li a0, 0
@ -3360,7 +3289,6 @@ define zeroext i1 @usubo.br.i32(i32 %v1, i32 %v2) {
; RV64ZBA-LABEL: usubo.br.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: subw a1, a0, a1
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: bgeu a0, a1, .LBB58_2
; RV64ZBA-NEXT: # %bb.1: # %overflow
; RV64ZBA-NEXT: li a0, 0
@ -3456,7 +3384,7 @@ continue:
ret i1 true
}
define zeroext i1 @smulo.br.i32(i32 %v1, i32 %v2) {
define zeroext i1 @smulo.br.i32(i32 signext %v1, i32 signext %v2) {
; RV32-LABEL: smulo.br.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: mulh a2, a0, a1
@ -3472,8 +3400,6 @@ define zeroext i1 @smulo.br.i32(i32 %v1, i32 %v2) {
;
; RV64-LABEL: smulo.br.i32:
; RV64: # %bb.0: # %entry
; RV64-NEXT: sext.w a1, a1
; RV64-NEXT: sext.w a0, a0
; RV64-NEXT: mul a2, a0, a1
; RV64-NEXT: mulw a0, a0, a1
; RV64-NEXT: beq a0, a2, .LBB60_2
@ -3499,8 +3425,6 @@ define zeroext i1 @smulo.br.i32(i32 %v1, i32 %v2) {
;
; RV64ZBA-LABEL: smulo.br.i32:
; RV64ZBA: # %bb.0: # %entry
; RV64ZBA-NEXT: sext.w a1, a1
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: mul a2, a0, a1
; RV64ZBA-NEXT: mulw a0, a0, a1
; RV64ZBA-NEXT: beq a0, a2, .LBB60_2
@ -3819,7 +3743,7 @@ continue:
ret i1 true
}
define zeroext i1 @umulo.br.i32(i32 %v1, i32 %v2) {
define zeroext i1 @umulo.br.i32(i32 signext %v1, i32 signext %v2) {
; RV32-LABEL: umulo.br.i32:
; RV32: # %bb.0: # %entry
; RV32-NEXT: mulhu a0, a0, a1