@@ -3719,3 +3719,54 @@ entry:
37193719 %cond = select i1 %tobool.not , i64 0 , i64 %x
37203720 ret i64 %cond
37213721}
3722+
3723+ ; Test that we don't crash on types larger than 64 bits.
3724+ define i64 @single_bit3 (i80 %x , i64 %y ) {
3725+ ; RV32I-LABEL: single_bit3:
3726+ ; RV32I: # %bb.0: # %entry
3727+ ; RV32I-NEXT: lw a0, 8(a0)
3728+ ; RV32I-NEXT: slli a0, a0, 31
3729+ ; RV32I-NEXT: srai a3, a0, 31
3730+ ; RV32I-NEXT: and a0, a3, a1
3731+ ; RV32I-NEXT: and a1, a3, a2
3732+ ; RV32I-NEXT: ret
3733+ ;
3734+ ; RV64I-LABEL: single_bit3:
3735+ ; RV64I: # %bb.0: # %entry
3736+ ; RV64I-NEXT: slli a1, a1, 63
3737+ ; RV64I-NEXT: srai a0, a1, 63
3738+ ; RV64I-NEXT: and a0, a0, a2
3739+ ; RV64I-NEXT: ret
3740+ ;
3741+ ; RV64XVENTANACONDOPS-LABEL: single_bit3:
3742+ ; RV64XVENTANACONDOPS: # %bb.0: # %entry
3743+ ; RV64XVENTANACONDOPS-NEXT: andi a1, a1, 1
3744+ ; RV64XVENTANACONDOPS-NEXT: vt.maskc a0, a2, a1
3745+ ; RV64XVENTANACONDOPS-NEXT: ret
3746+ ;
3747+ ; RV64XTHEADCONDMOV-LABEL: single_bit3:
3748+ ; RV64XTHEADCONDMOV: # %bb.0: # %entry
3749+ ; RV64XTHEADCONDMOV-NEXT: slli a1, a1, 63
3750+ ; RV64XTHEADCONDMOV-NEXT: srai a0, a1, 63
3751+ ; RV64XTHEADCONDMOV-NEXT: and a0, a0, a2
3752+ ; RV64XTHEADCONDMOV-NEXT: ret
3753+ ;
3754+ ; RV32ZICOND-LABEL: single_bit3:
3755+ ; RV32ZICOND: # %bb.0: # %entry
3756+ ; RV32ZICOND-NEXT: lw a0, 8(a0)
3757+ ; RV32ZICOND-NEXT: andi a3, a0, 1
3758+ ; RV32ZICOND-NEXT: czero.eqz a0, a1, a3
3759+ ; RV32ZICOND-NEXT: czero.eqz a1, a2, a3
3760+ ; RV32ZICOND-NEXT: ret
3761+ ;
3762+ ; RV64ZICOND-LABEL: single_bit3:
3763+ ; RV64ZICOND: # %bb.0: # %entry
3764+ ; RV64ZICOND-NEXT: andi a1, a1, 1
3765+ ; RV64ZICOND-NEXT: czero.eqz a0, a2, a1
3766+ ; RV64ZICOND-NEXT: ret
3767+ entry:
3768+ %and = and i80 %x , 18446744073709551616 ; 1 << 64
3769+ %tobool.not = icmp eq i80 %and , 0
3770+ %cond = select i1 %tobool.not , i64 0 , i64 %y
3771+ ret i64 %cond
3772+ }
0 commit comments