Skip to content

Commit 09468a9

Browse files
committed
[RISCV] Sign extend constant arguments to V intrinsics when promoting to XLen.
The default behavior for any_extend of a constant is to zero extend. This occurs inside of getNode rather than allowing type legalization to promote the constant which would sign extend. By using sign extend with getNode the constant will be sign extended. This gives a better chance for isel to find a simm5 immediate since all xlen bits are examined there. For instructions that use a uimm5 immediate, this change only affects constants >= 128 for i8 or >= 32768 for i16. Constants that large already wouldn't have been eligible for uimm5 and would need to use a scalar register. If the instruction isn't able to use simm5 or the immediate is too large, we'll need to materialize the immediate in a register. As far as I know constants with all 1s in the upper bits should materialize as well or better than all 0s. Longer term we should probably have a SEW aware PatFrag to ignore the bits above SEW before checking simm5. I updated about half the test cases in some tests to use a negative constant to get coverage for this. Reviewed By: evandro Differential Revision: https://reviews.llvm.org/D93487
1 parent 1f11450 commit 09468a9

File tree

8 files changed

+188
-177
lines changed

8 files changed

+188
-177
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,8 +1045,13 @@ SDValue RISCVTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
10451045
EVT OpVT = ScalarOp.getValueType();
10461046
if (OpVT == MVT::i8 || OpVT == MVT::i16 ||
10471047
(OpVT == MVT::i32 && Subtarget.is64Bit())) {
1048-
ScalarOp =
1049-
DAG.getNode(ISD::ANY_EXTEND, DL, Subtarget.getXLenVT(), ScalarOp);
1048+
// If the operand is a constant, sign extend to increase our chances
1049+
// of being able to use a .vi instruction. ANY_EXTEND would become a
1050+
// a zero extend and the simm5 check in isel would fail.
1051+
// FIXME: Should we ignore the upper bits in isel instead?
1052+
unsigned ExtOpc = isa<ConstantSDNode>(ScalarOp) ? ISD::SIGN_EXTEND
1053+
: ISD::ANY_EXTEND;
1054+
ScalarOp = DAG.getNode(ExtOpc, DL, Subtarget.getXLenVT(), ScalarOp);
10501055
return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, Op.getValueType(),
10511056
Operands);
10521057
}
@@ -1087,9 +1092,15 @@ SDValue RISCVTargetLowering::LowerINTRINSIC_W_CHAIN(SDValue Op,
10871092
EVT OpVT = ScalarOp.getValueType();
10881093
if (OpVT == MVT::i8 || OpVT == MVT::i16 ||
10891094
(OpVT == MVT::i32 && Subtarget.is64Bit())) {
1090-
ScalarOp =
1091-
DAG.getNode(ISD::ANY_EXTEND, DL, Subtarget.getXLenVT(), ScalarOp);
1092-
return DAG.getNode(ISD::INTRINSIC_W_CHAIN, DL, Op->getVTList(), Operands);
1095+
// If the operand is a constant, sign extend to increase our chances
1096+
// of being able to use a .vi instruction. ANY_EXTEND would become a
1097+
// a zero extend and the simm5 check in isel would fail.
1098+
// FIXME: Should we ignore the upper bits in isel instead?
1099+
unsigned ExtOpc = isa<ConstantSDNode>(ScalarOp) ? ISD::SIGN_EXTEND
1100+
: ISD::ANY_EXTEND;
1101+
ScalarOp = DAG.getNode(ExtOpc, DL, Subtarget.getXLenVT(), ScalarOp);
1102+
return DAG.getNode(ISD::INTRINSIC_W_CHAIN, DL, Op->getVTList(),
1103+
Operands);
10931104
}
10941105
}
10951106
}

llvm/test/CodeGen/RISCV/rvv/vadc-rv32.ll

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -724,10 +724,10 @@ define <vscale x 1 x i8> @intrinsic_vadc_vim_nxv1i8_nxv1i8_i8(<vscale x 1 x i8>
724724
entry:
725725
; CHECK-LABEL: intrinsic_vadc_vim_nxv1i8_nxv1i8_i8
726726
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e8,mf8,ta,mu
727-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
727+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
728728
%a = call <vscale x 1 x i8> @llvm.riscv.vadc.nxv1i8.i8(
729729
<vscale x 1 x i8> %0,
730-
i8 9,
730+
i8 -9,
731731
<vscale x 1 x i1> %1,
732732
i32 %2)
733733

@@ -752,10 +752,10 @@ define <vscale x 4 x i8> @intrinsic_vadc_vim_nxv4i8_nxv4i8_i8(<vscale x 4 x i8>
752752
entry:
753753
; CHECK-LABEL: intrinsic_vadc_vim_nxv4i8_nxv4i8_i8
754754
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e8,mf2,ta,mu
755-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
755+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
756756
%a = call <vscale x 4 x i8> @llvm.riscv.vadc.nxv4i8.i8(
757757
<vscale x 4 x i8> %0,
758-
i8 9,
758+
i8 -9,
759759
<vscale x 4 x i1> %1,
760760
i32 %2)
761761

@@ -780,10 +780,10 @@ define <vscale x 16 x i8> @intrinsic_vadc_vim_nxv16i8_nxv16i8_i8(<vscale x 16 x
780780
entry:
781781
; CHECK-LABEL: intrinsic_vadc_vim_nxv16i8_nxv16i8_i8
782782
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e8,m2,ta,mu
783-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
783+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
784784
%a = call <vscale x 16 x i8> @llvm.riscv.vadc.nxv16i8.i8(
785785
<vscale x 16 x i8> %0,
786-
i8 9,
786+
i8 -9,
787787
<vscale x 16 x i1> %1,
788788
i32 %2)
789789

@@ -808,10 +808,10 @@ define <vscale x 64 x i8> @intrinsic_vadc_vim_nxv64i8_nxv64i8_i8(<vscale x 64 x
808808
entry:
809809
; CHECK-LABEL: intrinsic_vadc_vim_nxv64i8_nxv64i8_i8
810810
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e8,m8,ta,mu
811-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
811+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
812812
%a = call <vscale x 64 x i8> @llvm.riscv.vadc.nxv64i8.i8(
813813
<vscale x 64 x i8> %0,
814-
i8 9,
814+
i8 -9,
815815
<vscale x 64 x i1> %1,
816816
i32 %2)
817817

@@ -836,10 +836,10 @@ define <vscale x 2 x i16> @intrinsic_vadc_vim_nxv2i16_nxv2i16_i16(<vscale x 2 x
836836
entry:
837837
; CHECK-LABEL: intrinsic_vadc_vim_nxv2i16_nxv2i16_i16
838838
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e16,mf2,ta,mu
839-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
839+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
840840
%a = call <vscale x 2 x i16> @llvm.riscv.vadc.nxv2i16.i16(
841841
<vscale x 2 x i16> %0,
842-
i16 9,
842+
i16 -9,
843843
<vscale x 2 x i1> %1,
844844
i32 %2)
845845

@@ -864,10 +864,10 @@ define <vscale x 8 x i16> @intrinsic_vadc_vim_nxv8i16_nxv8i16_i16(<vscale x 8 x
864864
entry:
865865
; CHECK-LABEL: intrinsic_vadc_vim_nxv8i16_nxv8i16_i16
866866
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e16,m2,ta,mu
867-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
867+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
868868
%a = call <vscale x 8 x i16> @llvm.riscv.vadc.nxv8i16.i16(
869869
<vscale x 8 x i16> %0,
870-
i16 9,
870+
i16 -9,
871871
<vscale x 8 x i1> %1,
872872
i32 %2)
873873

@@ -892,10 +892,10 @@ define <vscale x 32 x i16> @intrinsic_vadc_vim_nxv32i16_nxv32i16_i16(<vscale x 3
892892
entry:
893893
; CHECK-LABEL: intrinsic_vadc_vim_nxv32i16_nxv32i16_i16
894894
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e16,m8,ta,mu
895-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
895+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
896896
%a = call <vscale x 32 x i16> @llvm.riscv.vadc.nxv32i16.i16(
897897
<vscale x 32 x i16> %0,
898-
i16 9,
898+
i16 -9,
899899
<vscale x 32 x i1> %1,
900900
i32 %2)
901901

@@ -920,10 +920,10 @@ define <vscale x 2 x i32> @intrinsic_vadc_vim_nxv2i32_nxv2i32_i32(<vscale x 2 x
920920
entry:
921921
; CHECK-LABEL: intrinsic_vadc_vim_nxv2i32_nxv2i32_i32
922922
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e32,m1,ta,mu
923-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
923+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
924924
%a = call <vscale x 2 x i32> @llvm.riscv.vadc.nxv2i32.i32(
925925
<vscale x 2 x i32> %0,
926-
i32 9,
926+
i32 -9,
927927
<vscale x 2 x i1> %1,
928928
i32 %2)
929929

@@ -948,10 +948,10 @@ define <vscale x 8 x i32> @intrinsic_vadc_vim_nxv8i32_nxv8i32_i32(<vscale x 8 x
948948
entry:
949949
; CHECK-LABEL: intrinsic_vadc_vim_nxv8i32_nxv8i32_i32
950950
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e32,m4,ta,mu
951-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
951+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
952952
%a = call <vscale x 8 x i32> @llvm.riscv.vadc.nxv8i32.i32(
953953
<vscale x 8 x i32> %0,
954-
i32 9,
954+
i32 -9,
955955
<vscale x 8 x i1> %1,
956956
i32 %2)
957957

llvm/test/CodeGen/RISCV/rvv/vadc-rv64.ll

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -898,10 +898,10 @@ define <vscale x 2 x i8> @intrinsic_vadc_vim_nxv2i8_nxv2i8_i8(<vscale x 2 x i8>
898898
entry:
899899
; CHECK-LABEL: intrinsic_vadc_vim_nxv2i8_nxv2i8_i8
900900
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e8,mf4,ta,mu
901-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
901+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
902902
%a = call <vscale x 2 x i8> @llvm.riscv.vadc.nxv2i8.i8(
903903
<vscale x 2 x i8> %0,
904-
i8 9,
904+
i8 -9,
905905
<vscale x 2 x i1> %1,
906906
i64 %2)
907907

@@ -926,10 +926,10 @@ define <vscale x 8 x i8> @intrinsic_vadc_vim_nxv8i8_nxv8i8_i8(<vscale x 8 x i8>
926926
entry:
927927
; CHECK-LABEL: intrinsic_vadc_vim_nxv8i8_nxv8i8_i8
928928
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e8,m1,ta,mu
929-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
929+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
930930
%a = call <vscale x 8 x i8> @llvm.riscv.vadc.nxv8i8.i8(
931931
<vscale x 8 x i8> %0,
932-
i8 9,
932+
i8 -9,
933933
<vscale x 8 x i1> %1,
934934
i64 %2)
935935

@@ -954,10 +954,10 @@ define <vscale x 32 x i8> @intrinsic_vadc_vim_nxv32i8_nxv32i8_i8(<vscale x 32 x
954954
entry:
955955
; CHECK-LABEL: intrinsic_vadc_vim_nxv32i8_nxv32i8_i8
956956
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e8,m4,ta,mu
957-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
957+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
958958
%a = call <vscale x 32 x i8> @llvm.riscv.vadc.nxv32i8.i8(
959959
<vscale x 32 x i8> %0,
960-
i8 9,
960+
i8 -9,
961961
<vscale x 32 x i1> %1,
962962
i64 %2)
963963

@@ -982,10 +982,10 @@ define <vscale x 1 x i16> @intrinsic_vadc_vim_nxv1i16_nxv1i16_i16(<vscale x 1 x
982982
entry:
983983
; CHECK-LABEL: intrinsic_vadc_vim_nxv1i16_nxv1i16_i16
984984
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e16,mf4,ta,mu
985-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
985+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
986986
%a = call <vscale x 1 x i16> @llvm.riscv.vadc.nxv1i16.i16(
987987
<vscale x 1 x i16> %0,
988-
i16 9,
988+
i16 -9,
989989
<vscale x 1 x i1> %1,
990990
i64 %2)
991991

@@ -1010,10 +1010,10 @@ define <vscale x 4 x i16> @intrinsic_vadc_vim_nxv4i16_nxv4i16_i16(<vscale x 4 x
10101010
entry:
10111011
; CHECK-LABEL: intrinsic_vadc_vim_nxv4i16_nxv4i16_i16
10121012
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e16,m1,ta,mu
1013-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
1013+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
10141014
%a = call <vscale x 4 x i16> @llvm.riscv.vadc.nxv4i16.i16(
10151015
<vscale x 4 x i16> %0,
1016-
i16 9,
1016+
i16 -9,
10171017
<vscale x 4 x i1> %1,
10181018
i64 %2)
10191019

@@ -1038,10 +1038,10 @@ define <vscale x 16 x i16> @intrinsic_vadc_vim_nxv16i16_nxv16i16_i16(<vscale x 1
10381038
entry:
10391039
; CHECK-LABEL: intrinsic_vadc_vim_nxv16i16_nxv16i16_i16
10401040
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e16,m4,ta,mu
1041-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
1041+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
10421042
%a = call <vscale x 16 x i16> @llvm.riscv.vadc.nxv16i16.i16(
10431043
<vscale x 16 x i16> %0,
1044-
i16 9,
1044+
i16 -9,
10451045
<vscale x 16 x i1> %1,
10461046
i64 %2)
10471047

@@ -1066,10 +1066,10 @@ define <vscale x 1 x i32> @intrinsic_vadc_vim_nxv1i32_nxv1i32_i32(<vscale x 1 x
10661066
entry:
10671067
; CHECK-LABEL: intrinsic_vadc_vim_nxv1i32_nxv1i32_i32
10681068
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e32,mf2,ta,mu
1069-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
1069+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
10701070
%a = call <vscale x 1 x i32> @llvm.riscv.vadc.nxv1i32.i32(
10711071
<vscale x 1 x i32> %0,
1072-
i32 9,
1072+
i32 -9,
10731073
<vscale x 1 x i1> %1,
10741074
i64 %2)
10751075

@@ -1094,10 +1094,10 @@ define <vscale x 4 x i32> @intrinsic_vadc_vim_nxv4i32_nxv4i32_i32(<vscale x 4 x
10941094
entry:
10951095
; CHECK-LABEL: intrinsic_vadc_vim_nxv4i32_nxv4i32_i32
10961096
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e32,m2,ta,mu
1097-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
1097+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
10981098
%a = call <vscale x 4 x i32> @llvm.riscv.vadc.nxv4i32.i32(
10991099
<vscale x 4 x i32> %0,
1100-
i32 9,
1100+
i32 -9,
11011101
<vscale x 4 x i1> %1,
11021102
i64 %2)
11031103

@@ -1122,10 +1122,10 @@ define <vscale x 16 x i32> @intrinsic_vadc_vim_nxv16i32_nxv16i32_i32(<vscale x 1
11221122
entry:
11231123
; CHECK-LABEL: intrinsic_vadc_vim_nxv16i32_nxv16i32_i32
11241124
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e32,m8,ta,mu
1125-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
1125+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
11261126
%a = call <vscale x 16 x i32> @llvm.riscv.vadc.nxv16i32.i32(
11271127
<vscale x 16 x i32> %0,
1128-
i32 9,
1128+
i32 -9,
11291129
<vscale x 16 x i1> %1,
11301130
i64 %2)
11311131

@@ -1150,10 +1150,10 @@ define <vscale x 2 x i64> @intrinsic_vadc_vim_nxv2i64_nxv2i64_i64(<vscale x 2 x
11501150
entry:
11511151
; CHECK-LABEL: intrinsic_vadc_vim_nxv2i64_nxv2i64_i64
11521152
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e64,m2,ta,mu
1153-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
1153+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
11541154
%a = call <vscale x 2 x i64> @llvm.riscv.vadc.nxv2i64.i64(
11551155
<vscale x 2 x i64> %0,
1156-
i64 9,
1156+
i64 -9,
11571157
<vscale x 2 x i1> %1,
11581158
i64 %2)
11591159

@@ -1178,10 +1178,10 @@ define <vscale x 8 x i64> @intrinsic_vadc_vim_nxv8i64_nxv8i64_i64(<vscale x 8 x
11781178
entry:
11791179
; CHECK-LABEL: intrinsic_vadc_vim_nxv8i64_nxv8i64_i64
11801180
; CHECK: vsetvli {{.*}}, {{a[0-9]+}}, e64,m8,ta,mu
1181-
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, 9, v0
1181+
; CHECK: vadc.vim {{v[0-9]+}}, {{v[0-9]+}}, -9, v0
11821182
%a = call <vscale x 8 x i64> @llvm.riscv.vadc.nxv8i64.i64(
11831183
<vscale x 8 x i64> %0,
1184-
i64 9,
1184+
i64 -9,
11851185
<vscale x 8 x i1> %1,
11861186
i64 %2)
11871187

0 commit comments

Comments
 (0)