APIntify SelectionDAG's EXTRACT_ELEMENT code.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48726 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Dan Gohman 2008-03-24 16:38:05 +00:00
parent 8d84d5b62c
commit 4c931fc6e2
3 changed files with 34 additions and 2 deletions

View File

@ -2119,8 +2119,10 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
// EXTRACT_ELEMENT of a constant int is also very common.
if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(N1)) {
unsigned Shift = MVT::getSizeInBits(VT) * N2C->getValue();
return getConstant(C->getValue() >> Shift, VT);
unsigned ElementSize = MVT::getSizeInBits(VT);
unsigned Shift = ElementSize * N2C->getValue();
APInt ShiftedVal = C->getAPIntValue().lshr(Shift);
return getConstant(ShiftedVal.trunc(ElementSize), VT);
}
break;
case ISD::EXTRACT_SUBVECTOR:

View File

@ -0,0 +1,5 @@
; RUN: llvm-as < %s | llc -march=x86-64 | grep movq | count 2
define i128 @__addvti3() {
ret i128 -1
}

View File

@ -0,0 +1,25 @@
; RUN: llvm-as < %s | llc
; PR1462
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-
v64:64:64-v128:128:128-a0:0:64"
target triple = "x86_64-unknown-linux-gnu"
define hidden i128 @__addvti3(i128 %a1, i128 %b2) {
entry:
%tmp8 = add i128 %b2, %a1 ; <i128> [#uses=3]
%tmp10 = icmp sgt i128 %b2, -1 ; <i1> [#uses=1]
%tmp18 = icmp sgt i128 %tmp8, %a1 ; <i1> [#uses=1]
%tmp14 = icmp slt i128 %tmp8, %a1 ; <i1> [#uses=1]
%iftmp.0.0.in = select i1 %tmp10, i1 %tmp14, i1 %tmp18 ; <i1> [#uses=1]
br i1 %iftmp.0.0.in, label %cond_true22, label %cond_next23
cond_true22: ; preds = %entry
tail call void @abort( )
unreachable
cond_next23: ; preds = %entry
ret i128 %tmp8
}
declare void @abort()