-
Notifications
You must be signed in to change notification settings - Fork 15.3k
[DAGCombiner] Don't optimize insert_vector_elt into shuffle if implicit truncation exists #169022
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
@llvm/pr-subscribers-backend-risc-v Author: Hongyu Chen (XChy) ChangesFixes #169017 Full diff: https://github.com/llvm/llvm-project/pull/169022.diff 2 Files Affected:
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index f144f17d5a8f2..d41e0508b6907 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -23391,6 +23391,10 @@ SDValue DAGCombiner::combineInsertEltToShuffle(SDNode *N, unsigned InsIndex) {
EVT SubVecVT = SubVec.getValueType();
EVT VT = DestVec.getValueType();
unsigned NumSrcElts = SubVecVT.getVectorNumElements();
+ // Bail out if the inserted value is larger than the vector element, as
+ // insert_vector_elt performs an implicit truncation in this case.
+ if (InsertVal.getValueType() != VT.getVectorElementType())
+ return SDValue();
// If the source only has a single vector element, the cost of creating adding
// it to a vector is likely to exceed the cost of a insert_vector_elt.
if (NumSrcElts == 1)
diff --git a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-insert.ll b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-insert.ll
index 3a5b3719931a9..79286c0304e0c 100644
--- a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-insert.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-insert.ll
@@ -1143,6 +1143,32 @@ define <4 x half> @insertelt_v4f16_idx(<4 x half> %a, half %y, i32 zeroext %idx)
%b = insertelement <4 x half> %a, half %y, i32 %idx
ret <4 x half> %b
}
+
+define <2 x i8> @pr169017(<4 x i16> %vecinit, <2 x i8> %dst_vec) {
+; CHECK-LABEL: pr169017:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: vsetivli zero, 1, e64, m1, ta, ma
+; CHECK-NEXT: vmv.x.s a0, v8
+; CHECK-NEXT: vsetvli zero, zero, e8, mf8, tu, ma
+; CHECK-NEXT: vmv.s.x v9, a0
+; CHECK-NEXT: vmv1r.v v8, v9
+; CHECK-NEXT: ret
+;
+; VISNI-LABEL: pr169017:
+; VISNI: # %bb.0: # %entry
+; VISNI-NEXT: vsetivli zero, 1, e64, m1, ta, ma
+; VISNI-NEXT: vmv.x.s a0, v8
+; VISNI-NEXT: vsetvli zero, zero, e8, mf8, tu, ma
+; VISNI-NEXT: vmv.s.x v9, a0
+; VISNI-NEXT: vmv1r.v v8, v9
+; VISNI-NEXT: ret
+entry:
+ %cast = bitcast <4 x i16> %vecinit to i64
+ %trunc = trunc i64 %cast to i8
+ %2 = insertelement <2 x i8> %dst_vec, i8 %trunc, i64 0
+ ret <2 x i8> %2
+}
+
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
; ZVFHMINRV32: {{.*}}
; ZVFHMINRV64: {{.*}}
|
|
@llvm/pr-subscribers-llvm-selectiondag Author: Hongyu Chen (XChy) ChangesFixes #169017 Full diff: https://github.com/llvm/llvm-project/pull/169022.diff 2 Files Affected:
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index f144f17d5a8f2..d41e0508b6907 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -23391,6 +23391,10 @@ SDValue DAGCombiner::combineInsertEltToShuffle(SDNode *N, unsigned InsIndex) {
EVT SubVecVT = SubVec.getValueType();
EVT VT = DestVec.getValueType();
unsigned NumSrcElts = SubVecVT.getVectorNumElements();
+ // Bail out if the inserted value is larger than the vector element, as
+ // insert_vector_elt performs an implicit truncation in this case.
+ if (InsertVal.getValueType() != VT.getVectorElementType())
+ return SDValue();
// If the source only has a single vector element, the cost of creating adding
// it to a vector is likely to exceed the cost of a insert_vector_elt.
if (NumSrcElts == 1)
diff --git a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-insert.ll b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-insert.ll
index 3a5b3719931a9..79286c0304e0c 100644
--- a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-insert.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-insert.ll
@@ -1143,6 +1143,32 @@ define <4 x half> @insertelt_v4f16_idx(<4 x half> %a, half %y, i32 zeroext %idx)
%b = insertelement <4 x half> %a, half %y, i32 %idx
ret <4 x half> %b
}
+
+define <2 x i8> @pr169017(<4 x i16> %vecinit, <2 x i8> %dst_vec) {
+; CHECK-LABEL: pr169017:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: vsetivli zero, 1, e64, m1, ta, ma
+; CHECK-NEXT: vmv.x.s a0, v8
+; CHECK-NEXT: vsetvli zero, zero, e8, mf8, tu, ma
+; CHECK-NEXT: vmv.s.x v9, a0
+; CHECK-NEXT: vmv1r.v v8, v9
+; CHECK-NEXT: ret
+;
+; VISNI-LABEL: pr169017:
+; VISNI: # %bb.0: # %entry
+; VISNI-NEXT: vsetivli zero, 1, e64, m1, ta, ma
+; VISNI-NEXT: vmv.x.s a0, v8
+; VISNI-NEXT: vsetvli zero, zero, e8, mf8, tu, ma
+; VISNI-NEXT: vmv.s.x v9, a0
+; VISNI-NEXT: vmv1r.v v8, v9
+; VISNI-NEXT: ret
+entry:
+ %cast = bitcast <4 x i16> %vecinit to i64
+ %trunc = trunc i64 %cast to i8
+ %2 = insertelement <2 x i8> %dst_vec, i8 %trunc, i64 0
+ ret <2 x i8> %2
+}
+
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
; ZVFHMINRV32: {{.*}}
; ZVFHMINRV64: {{.*}}
|
🐧 Linux x64 Test Results
|
topperc
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
…it truncation exists (llvm#169022) Fixes llvm#169017
…it truncation exists (llvm#169022) Fixes llvm#169017
Fixes #169017