Skip to content

Commit 4ab2ac2

Browse files
[DAGCombiner] Mark vectors as not AllAddOne/AllSubOne on type mismatch (#92195)
Fixes #92193.
1 parent 64b3cdc commit 4ab2ac2

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12142,8 +12142,11 @@ SDValue DAGCombiner::foldVSelectOfConstants(SDNode *N) {
1214212142
SDValue N2Elt = N2.getOperand(i);
1214312143
if (N1Elt.isUndef() || N2Elt.isUndef())
1214412144
continue;
12145-
if (N1Elt.getValueType() != N2Elt.getValueType())
12146-
continue;
12145+
if (N1Elt.getValueType() != N2Elt.getValueType()) {
12146+
AllAddOne = false;
12147+
AllSubOne = false;
12148+
break;
12149+
}
1214712150

1214812151
const APInt &C1 = N1Elt->getAsAPIntVal();
1214912152
const APInt &C2 = N2Elt->getAsAPIntVal();

llvm/test/CodeGen/RISCV/pr92193.ll

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc -mtriple=riscv64-unknown-linux-gnu < %s | FileCheck %s
3+
; RUN: llc -mtriple=riscv32-unknown-linux-gnu < %s | FileCheck %s
4+
5+
; Dag-combine used to improperly combine a vector vselect of 0 and 2 into
6+
; 2 + condition(0/1) because one of the two args was transformed from an i32->i64.
7+
8+
define i16 @foo() {
9+
; CHECK-LABEL: foo:
10+
; CHECK: # %bb.0: # %entry
11+
; CHECK-NEXT: li a0, 0
12+
; CHECK-NEXT: ret
13+
entry:
14+
%insert.0 = insertelement <4 x i16> zeroinitializer, i16 2, i64 0
15+
%all.two = shufflevector <4 x i16> %insert.0, <4 x i16> zeroinitializer, <4 x i32> zeroinitializer
16+
%sel.0 = select <4 x i1> <i1 true, i1 false, i1 false, i1 false>, <4 x i16> zeroinitializer, <4 x i16> %all.two
17+
%mul.0 = call i16 @llvm.vector.reduce.mul.v4i16(<4 x i16> %sel.0)
18+
ret i16 %mul.0
19+
}
20+
21+
declare i16 @llvm.vector.reduce.mul.v4i32(<4 x i16>)

0 commit comments

Comments
 (0)