diff --git a/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp index f5e583b3283..e622ca2b609 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp @@ -1272,6 +1272,7 @@ std::pair DAGTypeLegalizer::ExpandAtomic(SDNode *Node) { /// and the shift amount is a constant 'Amt'. Expand the operation. void DAGTypeLegalizer::ExpandShiftByConstant(SDNode *N, unsigned Amt, SDValue &Lo, SDValue &Hi) { + assert(Amt && "Expected zero shifts to be already optimized away."); SDLoc DL(N); // Expand the incoming operand to be shifted, so that we have its parts SDValue InL, InH; @@ -1714,9 +1715,13 @@ void DAGTypeLegalizer::ExpandIntRes_Constant(SDNode *N, SDValue &Lo, SDValue &Hi) { EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); unsigned NBitWidth = NVT.getSizeInBits(); - const APInt &Cst = cast(N)->getAPIntValue(); - Lo = DAG.getConstant(Cst.trunc(NBitWidth), NVT); - Hi = DAG.getConstant(Cst.lshr(NBitWidth).trunc(NBitWidth), NVT); + auto Constant = cast(N); + const APInt &Cst = Constant->getAPIntValue(); + bool IsTarget = Constant->isTargetOpcode(); + bool IsOpaque = Constant->isOpaque(); + Lo = DAG.getConstant(Cst.trunc(NBitWidth), NVT, IsTarget, IsOpaque); + Hi = DAG.getConstant(Cst.lshr(NBitWidth).trunc(NBitWidth), NVT, IsTarget, + IsOpaque); } void DAGTypeLegalizer::ExpandIntRes_CTLZ(SDNode *N, diff --git a/test/CodeGen/X86/expand-opaque-const.ll b/test/CodeGen/X86/expand-opaque-const.ll new file mode 100644 index 00000000000..6e461cf8c30 --- /dev/null +++ b/test/CodeGen/X86/expand-opaque-const.ll @@ -0,0 +1,21 @@ +; RUN: llc -mcpu=generic -O1 -relocation-model=pic < %s | FileCheck %s +target datalayout = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128" +target triple = "i686-apple-darwin" + +define i64 @test_lshr() { +entry: +; CHECK-NOT: movl $-1, 16(%esp) +; CHECK-NOT: movl $-1, %eax + %retval = alloca i64 + %op1 = alloca i64 + %op2 = alloca i64 + store i64 -6687208052682386272, i64* %op1 + store i64 7106745059734980448, i64* %op2 + %tmp1 = load i64* %op1 + %tmp2 = load i64* %op2 + %tmp = xor i64 %tmp2, 7106745059734980448 + %tmp3 = lshr i64 %tmp1, %tmp + store i64 %tmp3, i64* %retval + %tmp4 = load i64* %retval + ret i64 %tmp4 +}