Index: llvm/lib/Target/X86/X86ISelLowering.cpp =================================================================== --- llvm/lib/Target/X86/X86ISelLowering.cpp +++ llvm/lib/Target/X86/X86ISelLowering.cpp @@ -50129,10 +50129,14 @@ if (!UndefElts[I] && !EltBits[I].isSignMask()) return SDValue(); - return peekThroughBitcasts(Op0); + // Only allow bitcast from correctly-sized constant. + Op0 = peekThroughBitcasts(Op0); + if (Op0.getScalarValueSizeInBits() == ScalarSize) + return Op0; } - } - } + break; + } // case + } // switch return SDValue(); } Index: llvm/test/CodeGen/X86/neg_fp.ll =================================================================== --- llvm/test/CodeGen/X86/neg_fp.ll +++ llvm/test/CodeGen/X86/neg_fp.ll @@ -82,11 +82,13 @@ ret float %div5 } -; FIXME: PR55758 - this is not -(-X) +; PR55758 - this is not -(-X) define <2 x i64> @fneg_mismatched_sizes(<4 x float> %x) { ; CHECK-LABEL: fneg_mismatched_sizes: ; CHECK: # %bb.0: +; CHECK-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; CHECK-NEXT: xorps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 ; CHECK-NEXT: retl %n = fneg <4 x float> %x %b = bitcast <4 x float> %n to <2 x i64>