Index: llvm/trunk/lib/Transforms/Scalar/SCCP.cpp =================================================================== --- llvm/trunk/lib/Transforms/Scalar/SCCP.cpp +++ llvm/trunk/lib/Transforms/Scalar/SCCP.cpp @@ -760,8 +760,10 @@ if (OpSt.isOverdefined()) // Inherit overdefinedness of operand markOverdefined(&I); else if (OpSt.isConstant()) { - Constant *C = - ConstantExpr::getCast(I.getOpcode(), OpSt.getConstant(), I.getType()); + // Fold the constant as we build. + Constant *C = ConstantFoldCastOperand( + I.getOpcode(), getValueState(I.getOperand(0)).getConstant(), + I.getType(), DL); if (isa(C)) return; // Propagate constant value Index: llvm/trunk/test/Transforms/SCCP/bitcast.ll =================================================================== --- llvm/trunk/test/Transforms/SCCP/bitcast.ll +++ llvm/trunk/test/Transforms/SCCP/bitcast.ll @@ -0,0 +1,9 @@ +; RUN: opt < %s -ipsccp -S | FileCheck %s + +define i128 @vector_to_int_cast() { + %A = bitcast <4 x i32> to i128 + ret i128 %A +} + +; CHECK: define i128 @vector_to_int_cast( +; CHECK-NEXT: ret i128 85070591750041656499021422275829170176