From db8dc2b9faf346fbfa04c07f501981250948f5e2 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Tue, 18 Aug 2009 23:36:17 +0000 Subject: [PATCH] Legalize the shift amount operand of SRL_PARTS, SHL_PARTS, and SRA_PARTS, as is done for SRL, SHL, and SRA. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79380 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 7 +++++++ test/CodeGen/X86/shift-parts.ll | 22 ++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 test/CodeGen/X86/shift-parts.ll diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 1efeb76e365..07a6b2c5cc5 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -898,6 +898,13 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) { if (!Ops[1].getValueType().isVector()) Ops[1] = LegalizeOp(DAG.getShiftAmountOperand(Ops[1])); break; + case ISD::SRL_PARTS: + case ISD::SRA_PARTS: + case ISD::SHL_PARTS: + // Legalizing shifts/rotates requires adjusting the shift amount + // to the appropriate width. + if (!Ops[2].getValueType().isVector()) + Ops[2] = LegalizeOp(DAG.getShiftAmountOperand(Ops[2])); } Result = DAG.UpdateNodeOperands(Result.getValue(0), Ops.data(), diff --git a/test/CodeGen/X86/shift-parts.ll b/test/CodeGen/X86/shift-parts.ll new file mode 100644 index 00000000000..a09b41799ad --- /dev/null +++ b/test/CodeGen/X86/shift-parts.ll @@ -0,0 +1,22 @@ +; RUN: llvm-as < %s | llc -march=x86-64 | grep shrdq +; PR4736 + +%0 = type { i32, i8, [35 x i8] } + +@g_144 = external global %0, align 8 ; <%0*> [#uses=1] + +define i32 @int87(i32 %uint64p_8) nounwind { +entry: + %srcval4 = load i320* bitcast (%0* @g_144 to i320*), align 8 ; [#uses=1] + br label %for.cond + +for.cond: ; preds = %for.cond, %entry + %call3.in.in.in.v = select i1 undef, i320 192, i320 128 ; [#uses=1] + %call3.in.in.in = lshr i320 %srcval4, %call3.in.in.in.v ; [#uses=1] + %call3.in = trunc i320 %call3.in.in.in to i32 ; [#uses=1] + %tobool = icmp eq i32 %call3.in, 0 ; [#uses=1] + br i1 %tobool, label %for.cond, label %if.then + +if.then: ; preds = %for.cond + ret i32 1 +}