mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-27 21:50:29 +00:00
[DAGCombine] SimplifySelectCC - call FoldSetCC with the setcc result type
We were calling FoldSetCC with the compare operand type instead of the result type. Found by OSS-Fuzz #13838 (https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=13838) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@356667 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c4a68ddfbf
commit
001665e9a8
@ -18948,13 +18948,14 @@ SDValue DAGCombiner::SimplifySelectCC(const SDLoc &DL, SDValue N0, SDValue N1,
|
||||
if (N2 == N3) return N2;
|
||||
|
||||
EVT CmpOpVT = N0.getValueType();
|
||||
EVT CmpResVT = getSetCCResultType(CmpOpVT);
|
||||
EVT VT = N2.getValueType();
|
||||
auto *N1C = dyn_cast<ConstantSDNode>(N1.getNode());
|
||||
auto *N2C = dyn_cast<ConstantSDNode>(N2.getNode());
|
||||
auto *N3C = dyn_cast<ConstantSDNode>(N3.getNode());
|
||||
|
||||
// Determine if the condition we're dealing with is constant.
|
||||
if (SDValue SCC = DAG.FoldSetCC(VT, N0, N1, CC, DL)) {
|
||||
if (SDValue SCC = DAG.FoldSetCC(CmpResVT, N0, N1, CC, DL)) {
|
||||
AddToWorklist(SCC.getNode());
|
||||
if (auto *SCCC = dyn_cast<ConstantSDNode>(SCC)) {
|
||||
// fold select_cc true, x, y -> x
|
||||
@ -19021,7 +19022,7 @@ SDValue DAGCombiner::SimplifySelectCC(const SDLoc &DL, SDValue N0, SDValue N1,
|
||||
SDValue Temp, SCC;
|
||||
// zext (setcc n0, n1)
|
||||
if (LegalTypes) {
|
||||
SCC = DAG.getSetCC(DL, getSetCCResultType(CmpOpVT), N0, N1, CC);
|
||||
SCC = DAG.getSetCC(DL, CmpResVT, N0, N1, CC);
|
||||
if (VT.bitsLT(SCC.getValueType()))
|
||||
Temp = DAG.getZeroExtendInReg(SCC, SDLoc(N2), VT);
|
||||
else
|
||||
|
@ -1345,3 +1345,19 @@ define <3 x float> @test_minps_illegal_v3f32(<3 x float> %x, <3 x float> %y) {
|
||||
ret <3 x float> %min
|
||||
}
|
||||
|
||||
; OSS-Fuzz #13838
|
||||
; https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=13838
|
||||
define float @ossfuzz13838(float %x) {
|
||||
; ALL-LABEL: ossfuzz13838:
|
||||
; ALL: # %bb.0: # %bb
|
||||
; ALL-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
|
||||
; ALL-NEXT: retq
|
||||
bb:
|
||||
%cmp2 = fcmp fast olt float %x, 2.550000e+02
|
||||
%B1 = urem i1 %cmp2, %cmp2
|
||||
%min = select i1 %B1, float %x, float 2.550000e+02
|
||||
%B = frem float %min, 0x47EFFFFFE0000000
|
||||
%cmp1 = fcmp fast olt float %B, 1.000000e+00
|
||||
%r = select i1 %cmp1, float 1.000000e+00, float %min
|
||||
ret float %r
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user