@@ -3719,3 +3719,54 @@ entry:
3719
3719
%cond = select i1 %tobool.not , i64 0 , i64 %x
3720
3720
ret i64 %cond
3721
3721
}
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