From craig.topper at gmail.com Mon Jan 23 00:16:53 2012
From: craig.topper at gmail.com (Craig Topper)
Date: Mon, 23 Jan 2012 06:16:53 -0000
Subject: [llvm-commits] [llvm] r148684 - in /llvm/trunk/lib/Target/X86:
X86ISelLowering.cpp X86InstrSSE.td
Message-ID: <20120123061653.5F1922A6C12C@llvm.org>
Author: ctopper
Date: Mon Jan 23 00:16:53 2012
New Revision: 148684
URL: http://llvm.org/viewvc/llvm-project?rev=148684&view=rev
Log:
Custom lower vector shift intrinsics to target specific nodes and remove the patterns that are no longer needed.
Modified:
llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
llvm/trunk/lib/Target/X86/X86InstrSSE.td
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=148684&r1=148683&r2=148684&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Mon Jan 23 00:16:53 2012
@@ -64,17 +64,6 @@
static SDValue getMOVL(SelectionDAG &DAG, DebugLoc dl, EVT VT, SDValue V1,
SDValue V2);
-static SDValue Insert128BitVector(SDValue Result,
- SDValue Vec,
- SDValue Idx,
- SelectionDAG &DAG,
- DebugLoc dl);
-
-static SDValue Extract128BitVector(SDValue Vec,
- SDValue Idx,
- SelectionDAG &DAG,
- DebugLoc dl);
-
/// Generate a DAG to grab 128-bits from a vector > 128 bits. This
/// sets things up to match to an AVX VEXTRACTF128 instruction or a
/// simple subregister reference. Idx is an index in the 128 bits we
@@ -9157,6 +9146,43 @@
MachinePointerInfo(DstSV), MachinePointerInfo(SrcSV));
}
+// getTargetVShiftNOde - Handle vector element shifts where the shift amount
+// may or may not be a constant. Takes immediate version of shift as input.
+static SDValue getTargetVShiftNode(unsigned Opc, DebugLoc dl, EVT VT,
+ SDValue SrcOp, SDValue ShAmt,
+ SelectionDAG &DAG) {
+ assert(ShAmt.getValueType() == MVT::i32 && "ShAmt is not i32");
+
+ if (isa(ShAmt)) {
+ switch (Opc) {
+ default: llvm_unreachable("Unknown target vector shift node");
+ case X86ISD::VSHLI:
+ case X86ISD::VSRLI:
+ case X86ISD::VSRAI:
+ return DAG.getNode(Opc, dl, VT, SrcOp, ShAmt);
+ }
+ }
+
+ // Change opcode to non-immediate version
+ switch (Opc) {
+ default: llvm_unreachable("Unknown target vector shift node");
+ case X86ISD::VSHLI: Opc = X86ISD::VSHL; break;
+ case X86ISD::VSRLI: Opc = X86ISD::VSRL; break;
+ case X86ISD::VSRAI: Opc = X86ISD::VSRA; break;
+ }
+
+ // Need to build a vector containing shift amount
+ // Shift amount is 32-bits, but SSE instructions read 64-bit, so fill with 0
+ SDValue ShOps[4];
+ ShOps[0] = ShAmt;
+ ShOps[1] = DAG.getConstant(0, MVT::i32);
+ ShOps[2] = DAG.getUNDEF(MVT::i32);
+ ShOps[3] = DAG.getUNDEF(MVT::i32);
+ ShAmt = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32, &ShOps[0], 4);
+ ShAmt = DAG.getNode(ISD::BITCAST, dl, VT, ShAmt);
+ return DAG.getNode(Opc, dl, VT, SrcOp, ShAmt);
+}
+
SDValue
X86TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const {
DebugLoc dl = Op.getDebugLoc();
@@ -9359,24 +9385,53 @@
return DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i32, SetCC);
}
- // Fix vector shift instructions where the last operand is a non-immediate
- // i32 value.
- case Intrinsic::x86_avx2_pslli_w:
- case Intrinsic::x86_avx2_pslli_d:
- case Intrinsic::x86_avx2_pslli_q:
- case Intrinsic::x86_avx2_psrli_w:
- case Intrinsic::x86_avx2_psrli_d:
- case Intrinsic::x86_avx2_psrli_q:
- case Intrinsic::x86_avx2_psrai_w:
- case Intrinsic::x86_avx2_psrai_d:
+ // SSE/AVX shift intrinsics
+ case Intrinsic::x86_sse2_psll_w:
+ case Intrinsic::x86_sse2_psll_d:
+ case Intrinsic::x86_sse2_psll_q:
+ case Intrinsic::x86_avx2_psll_w:
+ case Intrinsic::x86_avx2_psll_d:
+ case Intrinsic::x86_avx2_psll_q:
+ return DAG.getNode(X86ISD::VSHL, dl, Op.getValueType(),
+ Op.getOperand(1), Op.getOperand(2));
+ case Intrinsic::x86_sse2_psrl_w:
+ case Intrinsic::x86_sse2_psrl_d:
+ case Intrinsic::x86_sse2_psrl_q:
+ case Intrinsic::x86_avx2_psrl_w:
+ case Intrinsic::x86_avx2_psrl_d:
+ case Intrinsic::x86_avx2_psrl_q:
+ return DAG.getNode(X86ISD::VSRL, dl, Op.getValueType(),
+ Op.getOperand(1), Op.getOperand(2));
+ case Intrinsic::x86_sse2_psra_w:
+ case Intrinsic::x86_sse2_psra_d:
+ case Intrinsic::x86_avx2_psra_w:
+ case Intrinsic::x86_avx2_psra_d:
+ return DAG.getNode(X86ISD::VSRA, dl, Op.getValueType(),
+ Op.getOperand(1), Op.getOperand(2));
case Intrinsic::x86_sse2_pslli_w:
case Intrinsic::x86_sse2_pslli_d:
case Intrinsic::x86_sse2_pslli_q:
+ case Intrinsic::x86_avx2_pslli_w:
+ case Intrinsic::x86_avx2_pslli_d:
+ case Intrinsic::x86_avx2_pslli_q:
+ return getTargetVShiftNode(X86ISD::VSHLI, dl, Op.getValueType(),
+ Op.getOperand(1), Op.getOperand(2), DAG);
case Intrinsic::x86_sse2_psrli_w:
case Intrinsic::x86_sse2_psrli_d:
case Intrinsic::x86_sse2_psrli_q:
+ case Intrinsic::x86_avx2_psrli_w:
+ case Intrinsic::x86_avx2_psrli_d:
+ case Intrinsic::x86_avx2_psrli_q:
+ return getTargetVShiftNode(X86ISD::VSRLI, dl, Op.getValueType(),
+ Op.getOperand(1), Op.getOperand(2), DAG);
case Intrinsic::x86_sse2_psrai_w:
case Intrinsic::x86_sse2_psrai_d:
+ case Intrinsic::x86_avx2_psrai_w:
+ case Intrinsic::x86_avx2_psrai_d:
+ return getTargetVShiftNode(X86ISD::VSRAI, dl, Op.getValueType(),
+ Op.getOperand(1), Op.getOperand(2), DAG);
+ // Fix vector shift instructions where the last operand is a non-immediate
+ // i32 value.
case Intrinsic::x86_mmx_pslli_w:
case Intrinsic::x86_mmx_pslli_d:
case Intrinsic::x86_mmx_pslli_q:
@@ -9390,103 +9445,40 @@
return SDValue();
unsigned NewIntNo = 0;
- EVT ShAmtVT = MVT::v4i32;
switch (IntNo) {
- case Intrinsic::x86_sse2_pslli_w:
- NewIntNo = Intrinsic::x86_sse2_psll_w;
- break;
- case Intrinsic::x86_sse2_pslli_d:
- NewIntNo = Intrinsic::x86_sse2_psll_d;
- break;
- case Intrinsic::x86_sse2_pslli_q:
- NewIntNo = Intrinsic::x86_sse2_psll_q;
- break;
- case Intrinsic::x86_sse2_psrli_w:
- NewIntNo = Intrinsic::x86_sse2_psrl_w;
+ case Intrinsic::x86_mmx_pslli_w:
+ NewIntNo = Intrinsic::x86_mmx_psll_w;
break;
- case Intrinsic::x86_sse2_psrli_d:
- NewIntNo = Intrinsic::x86_sse2_psrl_d;
+ case Intrinsic::x86_mmx_pslli_d:
+ NewIntNo = Intrinsic::x86_mmx_psll_d;
break;
- case Intrinsic::x86_sse2_psrli_q:
- NewIntNo = Intrinsic::x86_sse2_psrl_q;
+ case Intrinsic::x86_mmx_pslli_q:
+ NewIntNo = Intrinsic::x86_mmx_psll_q;
break;
- case Intrinsic::x86_sse2_psrai_w:
- NewIntNo = Intrinsic::x86_sse2_psra_w;
+ case Intrinsic::x86_mmx_psrli_w:
+ NewIntNo = Intrinsic::x86_mmx_psrl_w;
break;
- case Intrinsic::x86_sse2_psrai_d:
- NewIntNo = Intrinsic::x86_sse2_psra_d;
+ case Intrinsic::x86_mmx_psrli_d:
+ NewIntNo = Intrinsic::x86_mmx_psrl_d;
break;
- case Intrinsic::x86_avx2_pslli_w:
- NewIntNo = Intrinsic::x86_avx2_psll_w;
+ case Intrinsic::x86_mmx_psrli_q:
+ NewIntNo = Intrinsic::x86_mmx_psrl_q;
break;
- case Intrinsic::x86_avx2_pslli_d:
- NewIntNo = Intrinsic::x86_avx2_psll_d;
+ case Intrinsic::x86_mmx_psrai_w:
+ NewIntNo = Intrinsic::x86_mmx_psra_w;
break;
- case Intrinsic::x86_avx2_pslli_q:
- NewIntNo = Intrinsic::x86_avx2_psll_q;
- break;
- case Intrinsic::x86_avx2_psrli_w:
- NewIntNo = Intrinsic::x86_avx2_psrl_w;
- break;
- case Intrinsic::x86_avx2_psrli_d:
- NewIntNo = Intrinsic::x86_avx2_psrl_d;
- break;
- case Intrinsic::x86_avx2_psrli_q:
- NewIntNo = Intrinsic::x86_avx2_psrl_q;
- break;
- case Intrinsic::x86_avx2_psrai_w:
- NewIntNo = Intrinsic::x86_avx2_psra_w;
- break;
- case Intrinsic::x86_avx2_psrai_d:
- NewIntNo = Intrinsic::x86_avx2_psra_d;
- break;
- default: {
- ShAmtVT = MVT::v2i32;
- switch (IntNo) {
- case Intrinsic::x86_mmx_pslli_w:
- NewIntNo = Intrinsic::x86_mmx_psll_w;
- break;
- case Intrinsic::x86_mmx_pslli_d:
- NewIntNo = Intrinsic::x86_mmx_psll_d;
- break;
- case Intrinsic::x86_mmx_pslli_q:
- NewIntNo = Intrinsic::x86_mmx_psll_q;
- break;
- case Intrinsic::x86_mmx_psrli_w:
- NewIntNo = Intrinsic::x86_mmx_psrl_w;
- break;
- case Intrinsic::x86_mmx_psrli_d:
- NewIntNo = Intrinsic::x86_mmx_psrl_d;
- break;
- case Intrinsic::x86_mmx_psrli_q:
- NewIntNo = Intrinsic::x86_mmx_psrl_q;
- break;
- case Intrinsic::x86_mmx_psrai_w:
- NewIntNo = Intrinsic::x86_mmx_psra_w;
- break;
- case Intrinsic::x86_mmx_psrai_d:
- NewIntNo = Intrinsic::x86_mmx_psra_d;
- break;
- default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
- }
+ case Intrinsic::x86_mmx_psrai_d:
+ NewIntNo = Intrinsic::x86_mmx_psra_d;
break;
- }
+ default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
}
// The vector shift intrinsics with scalars uses 32b shift amounts but
// the sse2/mmx shift instructions reads 64 bits. Set the upper 32 bits
// to be zero.
- SDValue ShOps[4];
- ShOps[0] = ShAmt;
- ShOps[1] = DAG.getConstant(0, MVT::i32);
- if (ShAmtVT == MVT::v4i32) {
- ShOps[2] = DAG.getUNDEF(MVT::i32);
- ShOps[3] = DAG.getUNDEF(MVT::i32);
- ShAmt = DAG.getNode(ISD::BUILD_VECTOR, dl, ShAmtVT, &ShOps[0], 4);
- } else {
- ShAmt = DAG.getNode(ISD::BUILD_VECTOR, dl, ShAmtVT, &ShOps[0], 2);
+ ShAmt = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v2i32, ShAmt,
+ DAG.getConstant(0, MVT::i32));
// FIXME this must be lowered to get rid of the invalid type.
- }
EVT VT = Op.getValueType();
ShAmt = DAG.getNode(ISD::BITCAST, dl, VT, ShAmt);
@@ -10006,43 +9998,6 @@
return Res;
}
-// getTargetVShiftNOde - Handle vector element shifts where the shift amount
-// may or may not be a constant. Takes immediate version of shift as input.
-static SDValue getTargetVShiftNode(unsigned Opc, DebugLoc dl, EVT VT,
- SDValue SrcOp, SDValue ShAmt,
- SelectionDAG &DAG) {
- assert(ShAmt.getValueType() == MVT::i32 && "ShAmt is not i32");
-
- if (isa(ShAmt)) {
- switch (Opc) {
- default: llvm_unreachable("Unknown target vector shift node");
- case X86ISD::VSHLI:
- case X86ISD::VSRLI:
- case X86ISD::VSRAI:
- return DAG.getNode(Opc, dl, VT, SrcOp, ShAmt);
- }
- }
-
- // Change opcode to non-immediate version
- switch (Opc) {
- default: llvm_unreachable("Unknown target vector shift node");
- case X86ISD::VSHLI: Opc = X86ISD::VSHL; break;
- case X86ISD::VSRLI: Opc = X86ISD::VSRL; break;
- case X86ISD::VSRAI: Opc = X86ISD::VSRA; break;
- }
-
- // Need to build a vector containing shift amount
- // Shift amount is 32-bits, but SSE instructions read 64-bit, so fill with 0
- SDValue ShOps[4];
- ShOps[0] = ShAmt;
- ShOps[1] = DAG.getConstant(0, MVT::i32);
- ShOps[2] = DAG.getUNDEF(MVT::i32);
- ShOps[3] = DAG.getUNDEF(MVT::i32);
- ShAmt = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32, &ShOps[0], 4);
- ShAmt = DAG.getNode(ISD::BITCAST, dl, VT, ShAmt);
- return DAG.getNode(Opc, dl, VT, SrcOp, ShAmt);
-}
-
SDValue X86TargetLowering::LowerShift(SDValue Op, SelectionDAG &DAG) const {
EVT VT = Op.getValueType();
Modified: llvm/trunk/lib/Target/X86/X86InstrSSE.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrSSE.td?rev=148684&r1=148683&r2=148684&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86InstrSSE.td (original)
+++ llvm/trunk/lib/Target/X86/X86InstrSSE.td Mon Jan 23 00:16:53 2012
@@ -3511,8 +3511,9 @@
}
multiclass PDI_binop_rmi_int opc, bits<8> opc2, Format ImmForm,
- string OpcodeStr, Intrinsic IntId,
- Intrinsic IntId2, RegisterClass RC,
+ string OpcodeStr, SDNode OpNode,
+ SDNode OpNode2, RegisterClass RC,
+ ValueType DstVT, ValueType SrcVT, PatFrag bc_frag,
bit Is2Addr = 1> {
// src2 is always 128-bit
def rr : PDI;
+ [(set RC:$dst, (OpNode (DstVT RC:$src1), (SrcVT VR128:$src2)))]>;
def rm : PDI;
+ [(set RC:$dst, (OpNode (DstVT RC:$src1),
+ (bc_frag (memopv2i64 addr:$src2))))]>;
def ri : PDIi8;
+ [(set RC:$dst, (OpNode2 (DstVT RC:$src1), (i32 imm:$src2)))]>;
}
} // ExeDomain = SSEPackedInt
@@ -3728,32 +3730,24 @@
//===---------------------------------------------------------------------===//
let Predicates = [HasAVX] in {
-defm VPSLLW : PDI_binop_rmi_int<0xF1, 0x71, MRM6r, "vpsllw",
- int_x86_sse2_psll_w, int_x86_sse2_pslli_w,
- VR128, 0>, VEX_4V;
-defm VPSLLD : PDI_binop_rmi_int<0xF2, 0x72, MRM6r, "vpslld",
- int_x86_sse2_psll_d, int_x86_sse2_pslli_d,
- VR128, 0>, VEX_4V;
-defm VPSLLQ : PDI_binop_rmi_int<0xF3, 0x73, MRM6r, "vpsllq",
- int_x86_sse2_psll_q, int_x86_sse2_pslli_q,
- VR128, 0>, VEX_4V;
-
-defm VPSRLW : PDI_binop_rmi_int<0xD1, 0x71, MRM2r, "vpsrlw",
- int_x86_sse2_psrl_w, int_x86_sse2_psrli_w,
- VR128, 0>, VEX_4V;
-defm VPSRLD : PDI_binop_rmi_int<0xD2, 0x72, MRM2r, "vpsrld",
- int_x86_sse2_psrl_d, int_x86_sse2_psrli_d,
- VR128, 0>, VEX_4V;
-defm VPSRLQ : PDI_binop_rmi_int<0xD3, 0x73, MRM2r, "vpsrlq",
- int_x86_sse2_psrl_q, int_x86_sse2_psrli_q,
- VR128, 0>, VEX_4V;
-
-defm VPSRAW : PDI_binop_rmi_int<0xE1, 0x71, MRM4r, "vpsraw",
- int_x86_sse2_psra_w, int_x86_sse2_psrai_w,
- VR128, 0>, VEX_4V;
-defm VPSRAD : PDI_binop_rmi_int<0xE2, 0x72, MRM4r, "vpsrad",
- int_x86_sse2_psra_d, int_x86_sse2_psrai_d,
- VR128, 0>, VEX_4V;
+defm VPSLLW : PDI_binop_rmi_int<0xF1, 0x71, MRM6r, "vpsllw", X86vshl, X86vshli,
+ VR128, v8i16, v8i16, bc_v8i16, 0>, VEX_4V;
+defm VPSLLD : PDI_binop_rmi_int<0xF2, 0x72, MRM6r, "vpslld", X86vshl, X86vshli,
+ VR128, v4i32, v4i32, bc_v4i32, 0>, VEX_4V;
+defm VPSLLQ : PDI_binop_rmi_int<0xF3, 0x73, MRM6r, "vpsllq", X86vshl, X86vshli,
+ VR128, v2i64, v2i64, bc_v2i64, 0>, VEX_4V;
+
+defm VPSRLW : PDI_binop_rmi_int<0xD1, 0x71, MRM2r, "vpsrlw", X86vsrl, X86vsrli,
+ VR128, v8i16, v8i16, bc_v8i16, 0>, VEX_4V;
+defm VPSRLD : PDI_binop_rmi_int<0xD2, 0x72, MRM2r, "vpsrld", X86vsrl, X86vsrli,
+ VR128, v4i32, v4i32, bc_v4i32, 0>, VEX_4V;
+defm VPSRLQ : PDI_binop_rmi_int<0xD3, 0x73, MRM2r, "vpsrlq", X86vsrl, X86vsrli,
+ VR128, v2i64, v2i64, bc_v2i64, 0>, VEX_4V;
+
+defm VPSRAW : PDI_binop_rmi_int<0xE1, 0x71, MRM4r, "vpsraw", X86vsra, X86vsrai,
+ VR128, v8i16, v8i16, bc_v8i16, 0>, VEX_4V;
+defm VPSRAD : PDI_binop_rmi_int<0xE2, 0x72, MRM4r, "vpsrad", X86vsra, X86vsrai,
+ VR128, v4i32, v4i32, bc_v4i32, 0>, VEX_4V;
let ExeDomain = SSEPackedInt in {
// 128-bit logical shifts.
@@ -3774,32 +3768,24 @@
} // Predicates = [HasAVX]
let Predicates = [HasAVX2] in {
-defm VPSLLWY : PDI_binop_rmi_int<0xF1, 0x71, MRM6r, "vpsllw",
- int_x86_avx2_psll_w, int_x86_avx2_pslli_w,
- VR256, 0>, VEX_4V;
-defm VPSLLDY : PDI_binop_rmi_int<0xF2, 0x72, MRM6r, "vpslld",
- int_x86_avx2_psll_d, int_x86_avx2_pslli_d,
- VR256, 0>, VEX_4V;
-defm VPSLLQY : PDI_binop_rmi_int<0xF3, 0x73, MRM6r, "vpsllq",
- int_x86_avx2_psll_q, int_x86_avx2_pslli_q,
- VR256, 0>, VEX_4V;
-
-defm VPSRLWY : PDI_binop_rmi_int<0xD1, 0x71, MRM2r, "vpsrlw",
- int_x86_avx2_psrl_w, int_x86_avx2_psrli_w,
- VR256, 0>, VEX_4V;
-defm VPSRLDY : PDI_binop_rmi_int<0xD2, 0x72, MRM2r, "vpsrld",
- int_x86_avx2_psrl_d, int_x86_avx2_psrli_d,
- VR256, 0>, VEX_4V;
-defm VPSRLQY : PDI_binop_rmi_int<0xD3, 0x73, MRM2r, "vpsrlq",
- int_x86_avx2_psrl_q, int_x86_avx2_psrli_q,
- VR256, 0>, VEX_4V;
-
-defm VPSRAWY : PDI_binop_rmi_int<0xE1, 0x71, MRM4r, "vpsraw",
- int_x86_avx2_psra_w, int_x86_avx2_psrai_w,
- VR256, 0>, VEX_4V;
-defm VPSRADY : PDI_binop_rmi_int<0xE2, 0x72, MRM4r, "vpsrad",
- int_x86_avx2_psra_d, int_x86_avx2_psrai_d,
- VR256, 0>, VEX_4V;
+defm VPSLLWY : PDI_binop_rmi_int<0xF1, 0x71, MRM6r, "vpsllw", X86vshl, X86vshli,
+ VR256, v16i16, v8i16, bc_v8i16, 0>, VEX_4V;
+defm VPSLLDY : PDI_binop_rmi_int<0xF2, 0x72, MRM6r, "vpslld", X86vshl, X86vshli,
+ VR256, v8i32, v4i32, bc_v4i32, 0>, VEX_4V;
+defm VPSLLQY : PDI_binop_rmi_int<0xF3, 0x73, MRM6r, "vpsllq", X86vshl, X86vshli,
+ VR256, v4i64, v2i64, bc_v2i64, 0>, VEX_4V;
+
+defm VPSRLWY : PDI_binop_rmi_int<0xD1, 0x71, MRM2r, "vpsrlw", X86vsrl, X86vsrli,
+ VR256, v16i16, v8i16, bc_v8i16, 0>, VEX_4V;
+defm VPSRLDY : PDI_binop_rmi_int<0xD2, 0x72, MRM2r, "vpsrld", X86vsrl, X86vsrli,
+ VR256, v8i32, v4i32, bc_v4i32, 0>, VEX_4V;
+defm VPSRLQY : PDI_binop_rmi_int<0xD3, 0x73, MRM2r, "vpsrlq", X86vsrl, X86vsrli,
+ VR256, v4i64, v2i64, bc_v2i64, 0>, VEX_4V;
+
+defm VPSRAWY : PDI_binop_rmi_int<0xE1, 0x71, MRM4r, "vpsraw", X86vsra, X86vsrai,
+ VR256, v16i16, v8i16, bc_v8i16, 0>, VEX_4V;
+defm VPSRADY : PDI_binop_rmi_int<0xE2, 0x72, MRM4r, "vpsrad", X86vsra, X86vsrai,
+ VR256, v8i32, v4i32, bc_v4i32, 0>, VEX_4V;
let ExeDomain = SSEPackedInt in {
// 256-bit logical shifts.
@@ -3820,32 +3806,24 @@
} // Predicates = [HasAVX2]
let Constraints = "$src1 = $dst" in {
-defm PSLLW : PDI_binop_rmi_int<0xF1, 0x71, MRM6r, "psllw",
- int_x86_sse2_psll_w, int_x86_sse2_pslli_w,
- VR128>;
-defm PSLLD : PDI_binop_rmi_int<0xF2, 0x72, MRM6r, "pslld",
- int_x86_sse2_psll_d, int_x86_sse2_pslli_d,
- VR128>;
-defm PSLLQ : PDI_binop_rmi_int<0xF3, 0x73, MRM6r, "psllq",
- int_x86_sse2_psll_q, int_x86_sse2_pslli_q,
- VR128>;
-
-defm PSRLW : PDI_binop_rmi_int<0xD1, 0x71, MRM2r, "psrlw",
- int_x86_sse2_psrl_w, int_x86_sse2_psrli_w,
- VR128>;
-defm PSRLD : PDI_binop_rmi_int<0xD2, 0x72, MRM2r, "psrld",
- int_x86_sse2_psrl_d, int_x86_sse2_psrli_d,
- VR128>;
-defm PSRLQ : PDI_binop_rmi_int<0xD3, 0x73, MRM2r, "psrlq",
- int_x86_sse2_psrl_q, int_x86_sse2_psrli_q,
- VR128>;
-
-defm PSRAW : PDI_binop_rmi_int<0xE1, 0x71, MRM4r, "psraw",
- int_x86_sse2_psra_w, int_x86_sse2_psrai_w,
- VR128>;
-defm PSRAD : PDI_binop_rmi_int<0xE2, 0x72, MRM4r, "psrad",
- int_x86_sse2_psra_d, int_x86_sse2_psrai_d,
- VR128>;
+defm PSLLW : PDI_binop_rmi_int<0xF1, 0x71, MRM6r, "psllw", X86vshl, X86vshli,
+ VR128, v8i16, v8i16, bc_v8i16>;
+defm PSLLD : PDI_binop_rmi_int<0xF2, 0x72, MRM6r, "pslld", X86vshl, X86vshli,
+ VR128, v4i32, v4i32, bc_v4i32>;
+defm PSLLQ : PDI_binop_rmi_int<0xF3, 0x73, MRM6r, "psllq", X86vshl, X86vshli,
+ VR128, v2i64, v2i64, bc_v2i64>;
+
+defm PSRLW : PDI_binop_rmi_int<0xD1, 0x71, MRM2r, "psrlw", X86vsrl, X86vsrli,
+ VR128, v8i16, v8i16, bc_v8i16>;
+defm PSRLD : PDI_binop_rmi_int<0xD2, 0x72, MRM2r, "psrld", X86vsrl, X86vsrli,
+ VR128, v4i32, v4i32, bc_v4i32>;
+defm PSRLQ : PDI_binop_rmi_int<0xD3, 0x73, MRM2r, "psrlq", X86vsrl, X86vsrli,
+ VR128, v2i64, v2i64, bc_v2i64>;
+
+defm PSRAW : PDI_binop_rmi_int<0xE1, 0x71, MRM4r, "psraw", X86vsra, X86vsrai,
+ VR128, v8i16, v8i16, bc_v8i16>;
+defm PSRAD : PDI_binop_rmi_int<0xE2, 0x72, MRM4r, "psrad", X86vsra, X86vsrai,
+ VR128, v4i32, v4i32, bc_v4i32>;
let ExeDomain = SSEPackedInt in {
// 128-bit logical shifts.
@@ -3876,60 +3854,6 @@
(VPSLLDQri VR128:$src, (BYTE_imm imm:$amt))>;
def : Pat<(v2i64 (X86vshrdq VR128:$src, (i8 imm:$amt))),
(VPSRLDQri VR128:$src, (BYTE_imm imm:$amt))>;
-
- def : Pat<(v8i16 (X86vshli VR128:$src1, (i32 imm:$src2))),
- (VPSLLWri VR128:$src1, imm:$src2)>;
- def : Pat<(v4i32 (X86vshli VR128:$src1, (i32 imm:$src2))),
- (VPSLLDri VR128:$src1, imm:$src2)>;
- def : Pat<(v2i64 (X86vshli VR128:$src1, (i32 imm:$src2))),
- (VPSLLQri VR128:$src1, imm:$src2)>;
-
- def : Pat<(v8i16 (X86vsrli VR128:$src1, (i32 imm:$src2))),
- (VPSRLWri VR128:$src1, imm:$src2)>;
- def : Pat<(v4i32 (X86vsrli VR128:$src1, (i32 imm:$src2))),
- (VPSRLDri VR128:$src1, imm:$src2)>;
- def : Pat<(v2i64 (X86vsrli VR128:$src1, (i32 imm:$src2))),
- (VPSRLQri VR128:$src1, imm:$src2)>;
-
- def : Pat<(v8i16 (X86vsrai VR128:$src1, (i32 imm:$src2))),
- (VPSRAWri VR128:$src1, imm:$src2)>;
- def : Pat<(v4i32 (X86vsrai VR128:$src1, (i32 imm:$src2))),
- (VPSRADri VR128:$src1, imm:$src2)>;
-
- def : Pat<(v8i16 (X86vshl VR128:$src1, (v8i16 VR128:$src2))),
- (VPSLLWrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v8i16 (X86vshl VR128:$src1, (bc_v8i16 (memopv2i64 addr:$src2)))),
- (VPSLLWrm VR128:$src1, addr:$src2)>;
- def : Pat<(v4i32 (X86vshl VR128:$src1, (v4i32 VR128:$src2))),
- (VPSLLDrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v4i32 (X86vshl VR128:$src1, (bc_v4i32 (memopv2i64 addr:$src2)))),
- (VPSLLDrm VR128:$src1, addr:$src2)>;
- def : Pat<(v2i64 (X86vshl VR128:$src1, (v2i64 VR128:$src2))),
- (VPSLLQrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v2i64 (X86vshl VR128:$src1, (memopv2i64 addr:$src2))),
- (VPSLLQrm VR128:$src1, addr:$src2)>;
-
- def : Pat<(v8i16 (X86vsrl VR128:$src1, (v8i16 VR128:$src2))),
- (VPSRLWrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v8i16 (X86vsrl VR128:$src1, (bc_v8i16 (memopv2i64 addr:$src2)))),
- (VPSRLWrm VR128:$src1, addr:$src2)>;
- def : Pat<(v4i32 (X86vsrl VR128:$src1, (v4i32 VR128:$src2))),
- (VPSRLDrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v4i32 (X86vsrl VR128:$src1, (bc_v4i32 (memopv2i64 addr:$src2)))),
- (VPSRLDrm VR128:$src1, addr:$src2)>;
- def : Pat<(v2i64 (X86vsrl VR128:$src1, (v2i64 VR128:$src2))),
- (VPSRLQrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v2i64 (X86vsrl VR128:$src1, (memopv2i64 addr:$src2))),
- (VPSRLQrm VR128:$src1, addr:$src2)>;
-
- def : Pat<(v8i16 (X86vsra VR128:$src1, (v8i16 VR128:$src2))),
- (VPSRAWrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v8i16 (X86vsra VR128:$src1, (bc_v8i16 (memopv2i64 addr:$src2)))),
- (VPSRAWrm VR128:$src1, addr:$src2)>;
- def : Pat<(v4i32 (X86vsra VR128:$src1, (v4i32 VR128:$src2))),
- (VPSRADrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v4i32 (X86vsra VR128:$src1, (bc_v4i32 (memopv2i64 addr:$src2)))),
- (VPSRADrm VR128:$src1, addr:$src2)>;
}
let Predicates = [HasAVX2] in {
@@ -3937,60 +3861,6 @@
(VPSLLDQYri VR256:$src1, (BYTE_imm imm:$src2))>;
def : Pat<(int_x86_avx2_psrl_dq VR256:$src1, imm:$src2),
(VPSRLDQYri VR256:$src1, (BYTE_imm imm:$src2))>;
-
- def : Pat<(v16i16 (X86vshli VR256:$src1, (i32 imm:$src2))),
- (VPSLLWYri VR256:$src1, imm:$src2)>;
- def : Pat<(v8i32 (X86vshli VR256:$src1, (i32 imm:$src2))),
- (VPSLLDYri VR256:$src1, imm:$src2)>;
- def : Pat<(v4i64 (X86vshli VR256:$src1, (i32 imm:$src2))),
- (VPSLLQYri VR256:$src1, imm:$src2)>;
-
- def : Pat<(v16i16 (X86vsrli VR256:$src1, (i32 imm:$src2))),
- (VPSRLWYri VR256:$src1, imm:$src2)>;
- def : Pat<(v8i32 (X86vsrli VR256:$src1, (i32 imm:$src2))),
- (VPSRLDYri VR256:$src1, imm:$src2)>;
- def : Pat<(v4i64 (X86vsrli VR256:$src1, (i32 imm:$src2))),
- (VPSRLQYri VR256:$src1, imm:$src2)>;
-
- def : Pat<(v16i16 (X86vsrai VR256:$src1, (i32 imm:$src2))),
- (VPSRAWYri VR256:$src1, imm:$src2)>;
- def : Pat<(v8i32 (X86vsrai VR256:$src1, (i32 imm:$src2))),
- (VPSRADYri VR256:$src1, imm:$src2)>;
-
- def : Pat<(v16i16 (X86vshl VR256:$src1, (v8i16 VR128:$src2))),
- (VPSLLWYrr VR256:$src1, VR128:$src2)>;
- def : Pat<(v16i16 (X86vshl VR256:$src1, (bc_v8i16 (memopv2i64 addr:$src2)))),
- (VPSLLWYrm VR256:$src1, addr:$src2)>;
- def : Pat<(v8i32 (X86vshl VR256:$src1, (v4i32 VR128:$src2))),
- (VPSLLDYrr VR256:$src1, VR128:$src2)>;
- def : Pat<(v8i32 (X86vshl VR256:$src1, (bc_v4i32 (memopv2i64 addr:$src2)))),
- (VPSLLDYrm VR256:$src1, addr:$src2)>;
- def : Pat<(v4i64 (X86vshl VR256:$src1, (v2i64 VR128:$src2))),
- (VPSLLQYrr VR256:$src1, VR128:$src2)>;
- def : Pat<(v4i64 (X86vshl VR256:$src1, (memopv2i64 addr:$src2))),
- (VPSLLQYrm VR256:$src1, addr:$src2)>;
-
- def : Pat<(v16i16 (X86vsrl VR256:$src1, (v8i16 VR128:$src2))),
- (VPSRLWYrr VR256:$src1, VR128:$src2)>;
- def : Pat<(v16i16 (X86vsrl VR256:$src1, (bc_v8i16 (memopv2i64 addr:$src2)))),
- (VPSRLWYrm VR256:$src1, addr:$src2)>;
- def : Pat<(v8i32 (X86vsrl VR256:$src1, (v4i32 VR128:$src2))),
- (VPSRLDYrr VR256:$src1, VR128:$src2)>;
- def : Pat<(v8i32 (X86vsrl VR256:$src1, (bc_v4i32 (memopv2i64 addr:$src2)))),
- (VPSRLDYrm VR256:$src1, addr:$src2)>;
- def : Pat<(v4i64 (X86vsrl VR256:$src1, (v2i64 VR128:$src2))),
- (VPSRLQYrr VR256:$src1, VR128:$src2)>;
- def : Pat<(v4i64 (X86vsrl VR256:$src1, (memopv2i64 addr:$src2))),
- (VPSRLQYrm VR256:$src1, addr:$src2)>;
-
- def : Pat<(v16i16 (X86vsra VR256:$src1, (v8i16 VR128:$src2))),
- (VPSRAWYrr VR256:$src1, VR128:$src2)>;
- def : Pat<(v16i16 (X86vsra VR256:$src1, (bc_v8i16 (memopv2i64 addr:$src2)))),
- (VPSRAWYrm VR256:$src1, addr:$src2)>;
- def : Pat<(v8i32 (X86vsra VR256:$src1, (v4i32 VR128:$src2))),
- (VPSRADYrr VR256:$src1, VR128:$src2)>;
- def : Pat<(v8i32 (X86vsra VR256:$src1, (bc_v4i32 (memopv2i64 addr:$src2)))),
- (VPSRADYrm VR256:$src1, addr:$src2)>;
}
let Predicates = [HasSSE2] in {
@@ -4006,60 +3876,6 @@
(PSLLDQri VR128:$src, (BYTE_imm imm:$amt))>;
def : Pat<(v2i64 (X86vshrdq VR128:$src, (i8 imm:$amt))),
(PSRLDQri VR128:$src, (BYTE_imm imm:$amt))>;
-
- def : Pat<(v8i16 (X86vshli VR128:$src1, (i32 imm:$src2))),
- (PSLLWri VR128:$src1, imm:$src2)>;
- def : Pat<(v4i32 (X86vshli VR128:$src1, (i32 imm:$src2))),
- (PSLLDri VR128:$src1, imm:$src2)>;
- def : Pat<(v2i64 (X86vshli VR128:$src1, (i32 imm:$src2))),
- (PSLLQri VR128:$src1, imm:$src2)>;
-
- def : Pat<(v8i16 (X86vsrli VR128:$src1, (i32 imm:$src2))),
- (PSRLWri VR128:$src1, imm:$src2)>;
- def : Pat<(v4i32 (X86vsrli VR128:$src1, (i32 imm:$src2))),
- (PSRLDri VR128:$src1, imm:$src2)>;
- def : Pat<(v2i64 (X86vsrli VR128:$src1, (i32 imm:$src2))),
- (PSRLQri VR128:$src1, imm:$src2)>;
-
- def : Pat<(v8i16 (X86vsrai VR128:$src1, (i32 imm:$src2))),
- (PSRAWri VR128:$src1, imm:$src2)>;
- def : Pat<(v4i32 (X86vsrai VR128:$src1, (i32 imm:$src2))),
- (PSRADri VR128:$src1, imm:$src2)>;
-
- def : Pat<(v8i16 (X86vshl VR128:$src1, (v8i16 VR128:$src2))),
- (PSLLWrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v8i16 (X86vshl VR128:$src1, (bc_v8i16 (memopv2i64 addr:$src2)))),
- (PSLLWrm VR128:$src1, addr:$src2)>;
- def : Pat<(v4i32 (X86vshl VR128:$src1, (v4i32 VR128:$src2))),
- (PSLLDrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v4i32 (X86vshl VR128:$src1, (bc_v4i32 (memopv2i64 addr:$src2)))),
- (PSLLDrm VR128:$src1, addr:$src2)>;
- def : Pat<(v2i64 (X86vshl VR128:$src1, (v2i64 VR128:$src2))),
- (PSLLQrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v2i64 (X86vshl VR128:$src1, (memopv2i64 addr:$src2))),
- (PSLLQrm VR128:$src1, addr:$src2)>;
-
- def : Pat<(v8i16 (X86vsrl VR128:$src1, (v8i16 VR128:$src2))),
- (PSRLWrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v8i16 (X86vsrl VR128:$src1, (bc_v8i16 (memopv2i64 addr:$src2)))),
- (PSRLWrm VR128:$src1, addr:$src2)>;
- def : Pat<(v4i32 (X86vsrl VR128:$src1, (v4i32 VR128:$src2))),
- (PSRLDrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v4i32 (X86vsrl VR128:$src1, (bc_v4i32 (memopv2i64 addr:$src2)))),
- (PSRLDrm VR128:$src1, addr:$src2)>;
- def : Pat<(v2i64 (X86vsrl VR128:$src1, (v2i64 VR128:$src2))),
- (PSRLQrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v2i64 (X86vsrl VR128:$src1, (memopv2i64 addr:$src2))),
- (PSRLQrm VR128:$src1, addr:$src2)>;
-
- def : Pat<(v8i16 (X86vsra VR128:$src1, (v8i16 VR128:$src2))),
- (PSRAWrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v8i16 (X86vsra VR128:$src1, (bc_v8i16 (memopv2i64 addr:$src2)))),
- (PSRAWrm VR128:$src1, addr:$src2)>;
- def : Pat<(v4i32 (X86vsra VR128:$src1, (v4i32 VR128:$src2))),
- (PSRADrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v4i32 (X86vsra VR128:$src1, (bc_v4i32 (memopv2i64 addr:$src2)))),
- (PSRADrm VR128:$src1, addr:$src2)>;
}
//===---------------------------------------------------------------------===//
From craig.topper at gmail.com Mon Jan 23 00:46:23 2012
From: craig.topper at gmail.com (Craig Topper)
Date: Mon, 23 Jan 2012 06:46:23 -0000
Subject: [llvm-commits] [llvm] r148685 -
/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
Message-ID: <20120123064623.4E9202A6C12C@llvm.org>
Author: ctopper
Date: Mon Jan 23 00:46:22 2012
New Revision: 148685
URL: http://llvm.org/viewvc/llvm-project?rev=148685&view=rev
Log:
Update more places to use target specific nodes for vector shifts instead of intrinsics.
Modified:
llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=148685&r1=148684&r2=148685&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Mon Jan 23 00:46:22 2012
@@ -9934,12 +9934,10 @@
// AhiBlo = __builtin_ia32_psllqi256( AhiBlo, 32 );
// return AloBlo + AloBhi + AhiBlo;
- SDValue Ahi = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
- DAG.getConstant(Intrinsic::x86_avx2_psrli_q, MVT::i32),
- A, DAG.getConstant(32, MVT::i32));
- SDValue Bhi = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
- DAG.getConstant(Intrinsic::x86_avx2_psrli_q, MVT::i32),
- B, DAG.getConstant(32, MVT::i32));
+ SDValue Ahi = DAG.getNode(X86ISD::VSRLI, dl, VT, A,
+ DAG.getConstant(32, MVT::i32));
+ SDValue Bhi = DAG.getNode(X86ISD::VSRLI, dl, VT, B,
+ DAG.getConstant(32, MVT::i32));
SDValue AloBlo = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
DAG.getConstant(Intrinsic::x86_avx2_pmulu_dq, MVT::i32),
A, B);
@@ -9949,12 +9947,10 @@
SDValue AhiBlo = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
DAG.getConstant(Intrinsic::x86_avx2_pmulu_dq, MVT::i32),
Ahi, B);
- AloBhi = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
- DAG.getConstant(Intrinsic::x86_avx2_pslli_q, MVT::i32),
- AloBhi, DAG.getConstant(32, MVT::i32));
- AhiBlo = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
- DAG.getConstant(Intrinsic::x86_avx2_pslli_q, MVT::i32),
- AhiBlo, DAG.getConstant(32, MVT::i32));
+ AloBhi = DAG.getNode(X86ISD::VSHLI, dl, VT, AloBhi,
+ DAG.getConstant(32, MVT::i32));
+ AhiBlo = DAG.getNode(X86ISD::VSHLI, dl, VT, AhiBlo,
+ DAG.getConstant(32, MVT::i32));
SDValue Res = DAG.getNode(ISD::ADD, dl, VT, AloBlo, AloBhi);
Res = DAG.getNode(ISD::ADD, dl, VT, Res, AhiBlo);
return Res;
@@ -9972,12 +9968,10 @@
// AhiBlo = __builtin_ia32_psllqi128( AhiBlo, 32 );
// return AloBlo + AloBhi + AhiBlo;
- SDValue Ahi = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
- DAG.getConstant(Intrinsic::x86_sse2_psrli_q, MVT::i32),
- A, DAG.getConstant(32, MVT::i32));
- SDValue Bhi = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
- DAG.getConstant(Intrinsic::x86_sse2_psrli_q, MVT::i32),
- B, DAG.getConstant(32, MVT::i32));
+ SDValue Ahi = DAG.getNode(X86ISD::VSRLI, dl, VT, A,
+ DAG.getConstant(32, MVT::i32));
+ SDValue Bhi = DAG.getNode(X86ISD::VSRLI, dl, VT, B,
+ DAG.getConstant(32, MVT::i32));
SDValue AloBlo = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
DAG.getConstant(Intrinsic::x86_sse2_pmulu_dq, MVT::i32),
A, B);
@@ -9987,12 +9981,10 @@
SDValue AhiBlo = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
DAG.getConstant(Intrinsic::x86_sse2_pmulu_dq, MVT::i32),
Ahi, B);
- AloBhi = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
- DAG.getConstant(Intrinsic::x86_sse2_pslli_q, MVT::i32),
- AloBhi, DAG.getConstant(32, MVT::i32));
- AhiBlo = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
- DAG.getConstant(Intrinsic::x86_sse2_pslli_q, MVT::i32),
- AhiBlo, DAG.getConstant(32, MVT::i32));
+ AloBhi = DAG.getNode(X86ISD::VSHLI, dl, VT, AloBhi,
+ DAG.getConstant(32, MVT::i32));
+ AhiBlo = DAG.getNode(X86ISD::VSHLI, dl, VT, AhiBlo,
+ DAG.getConstant(32, MVT::i32));
SDValue Res = DAG.getNode(ISD::ADD, dl, VT, AloBlo, AloBhi);
Res = DAG.getNode(ISD::ADD, dl, VT, Res, AhiBlo);
return Res;
@@ -13688,26 +13680,11 @@
// Validate that the Mask operand is a vector sra node.
// FIXME: what to do for bytes, since there is a psignb/pblendvb, but
// there is no psrai.b
- SDValue SraSrc, SraC;
- if (Mask.getOpcode() == ISD::INTRINSIC_WO_CHAIN) {
- switch (cast(Mask.getOperand(0))->getZExtValue()) {
- case Intrinsic::x86_sse2_psrai_w:
- case Intrinsic::x86_sse2_psrai_d:
- case Intrinsic::x86_avx2_psrai_w:
- case Intrinsic::x86_avx2_psrai_d:
- break;
- default: return SDValue();
- }
-
- SraSrc = Mask.getOperand(1);
- SraC = Mask.getOperand(2);
- } else if (Mask.getOpcode() == X86ISD::VSRAI) {
- SraSrc = Mask.getOperand(0);
- SraC = Mask.getOperand(1);
- } else
+ if (Mask.getOpcode() != X86ISD::VSRAI)
return SDValue();
// Check that the SRA is all signbits.
+ SDValue SraC = Mask.getOperand(1);
unsigned SraAmt = cast(SraC)->getZExtValue();
unsigned EltBits = MaskVT.getVectorElementType().getSizeInBits();
if ((SraAmt + 1) != EltBits)
@@ -13725,7 +13702,7 @@
X.getValueType() == MaskVT && Y.getValueType() == MaskVT) {
assert((EltBits == 8 || EltBits == 16 || EltBits == 32) &&
"Unsupported VT for PSIGN");
- Mask = DAG.getNode(X86ISD::PSIGN, DL, MaskVT, X, SraSrc);
+ Mask = DAG.getNode(X86ISD::PSIGN, DL, MaskVT, X, Mask.getOperand(0));
return DAG.getNode(ISD::BITCAST, DL, VT, Mask);
}
// PBLENDVB only available on SSE 4.1
From hfinkel at anl.gov Mon Jan 23 01:47:22 2012
From: hfinkel at anl.gov (Hal Finkel)
Date: Mon, 23 Jan 2012 01:47:22 -0600
Subject: [llvm-commits] [llvm] r148658 - in /llvm/trunk:
lib/Target/ARM/ARM.td lib/Target/ARM/ARMAsmPrinter.cpp
lib/Target/ARM/ARMInstrInfo.td lib/Target/ARM/ARMInstrNEON.td
lib/Target/ARM/ARMInstrVFP.td lib/Target/ARM/ARMSchedule.td
lib/Target/ARM/ARMSub
In-Reply-To:
References:
Message-ID: <1327304842.32397.696.camel@sapling>
On Sun, 2012-01-22 at 16:46 -0800, Eli Friedman wrote:
> On Sun, Jan 22, 2012 at 4:07 AM, Anton Korobeynikov wrote:
> > +//===----------------------------------------------------------------------===//
> > +// Fused FP Multiply-Accumulate Operations.
> > +//
> > +def VFMAD : ADbI<0b11101, 0b10, 0, 0,
> > + (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm),
> > + IIC_fpFMAC64, "vfma", ".f64\t$Dd, $Dn, $Dm",
> > + [(set DPR:$Dd, (fadd_mlx (fmul_su DPR:$Dn, DPR:$Dm),
> > + (f64 DPR:$Ddin)))]>,
> > + RegConstraint<"$Ddin = $Dd">,
> > + Requires<[HasVFP4]>;
> > +
> > +def VFMAS : ASbIn<0b11101, 0b10, 0, 0,
> > + (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm),
> > + IIC_fpFMAC32, "vfma", ".f32\t$Sd, $Sn, $Sm",
> > + [(set SPR:$Sd, (fadd_mlx (fmul_su SPR:$Sn, SPR:$Sm),
> > + SPR:$Sdin))]>,
> > + RegConstraint<"$Sdin = $Sd">,
> > + Requires<[HasVFP4,DontUseNEONForFP]> {
> > + // Some single precision VFP instructions may be executed on both NEON and
> > + // VFP pipelines.
> > +}
> > +
> > +def : Pat<(fadd_mlx DPR:$dstin, (fmul_su DPR:$a, (f64 DPR:$b))),
> > + (VFMAD DPR:$dstin, DPR:$a, DPR:$b)>,
> > + Requires<[HasVFP4]>;
> > +def : Pat<(fadd_mlx SPR:$dstin, (fmul_su SPR:$a, SPR:$b)),
> > + (VFMAS SPR:$dstin, SPR:$a, SPR:$b)>,
> > + Requires<[HasVFP4,DontUseNEONForFP]>;
> > +
> > +def VFMSD : ADbI<0b11101, 0b10, 1, 0,
> > + (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm),
> > + IIC_fpFMAC64, "vfms", ".f64\t$Dd, $Dn, $Dm",
> > + [(set DPR:$Dd, (fadd_mlx (fneg (fmul_su DPR:$Dn,DPR:$Dm)),
> > + (f64 DPR:$Ddin)))]>,
> > + RegConstraint<"$Ddin = $Dd">,
> > + Requires<[HasVFP4]>;
> > +
> > +def VFMSS : ASbIn<0b11101, 0b10, 1, 0,
> > + (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm),
> > + IIC_fpFMAC32, "vfms", ".f32\t$Sd, $Sn, $Sm",
> > + [(set SPR:$Sd, (fadd_mlx (fneg (fmul_su SPR:$Sn, SPR:$Sm)),
> > + SPR:$Sdin))]>,
> > + RegConstraint<"$Sdin = $Sd">,
> > + Requires<[HasVFP4,DontUseNEONForFP]> {
> > + // Some single precision VFP instructions may be executed on both NEON and
> > + // VFP pipelines.
> > +}
> > +
> > +def : Pat<(fsub_mlx DPR:$dstin, (fmul_su DPR:$a, (f64 DPR:$b))),
> > + (VFMSD DPR:$dstin, DPR:$a, DPR:$b)>,
> > + Requires<[HasVFP4]>;
> > +def : Pat<(fsub_mlx SPR:$dstin, (fmul_su SPR:$a, SPR:$b)),
> > + (VFMSS SPR:$dstin, SPR:$a, SPR:$b)>,
> > + Requires<[HasVFP4,DontUseNEONForFP]>;
> > +
> > +def VFNMAD : ADbI<0b11101, 0b01, 1, 0,
> > + (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm),
> > + IIC_fpFMAC64, "vfnma", ".f64\t$Dd, $Dn, $Dm",
> > + [(set DPR:$Dd,(fsub_mlx (fneg (fmul_su DPR:$Dn,DPR:$Dm)),
> > + (f64 DPR:$Ddin)))]>,
> > + RegConstraint<"$Ddin = $Dd">,
> > + Requires<[HasVFP4]>;
> > +
> > +def VFNMAS : ASbI<0b11101, 0b01, 1, 0,
> > + (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm),
> > + IIC_fpFMAC32, "vfnma", ".f32\t$Sd, $Sn, $Sm",
> > + [(set SPR:$Sd, (fsub_mlx (fneg (fmul_su SPR:$Sn, SPR:$Sm)),
> > + SPR:$Sdin))]>,
> > + RegConstraint<"$Sdin = $Sd">,
> > + Requires<[HasVFP4,DontUseNEONForFP]> {
> > + // Some single precision VFP instructions may be executed on both NEON and
> > + // VFP pipelines.
> > +}
> > +
> > +def : Pat<(fsub_mlx (fneg (fmul_su DPR:$a, (f64 DPR:$b))), DPR:$dstin),
> > + (VFNMAD DPR:$dstin, DPR:$a, DPR:$b)>,
> > + Requires<[HasVFP4]>;
> > +def : Pat<(fsub_mlx (fneg (fmul_su SPR:$a, SPR:$b)), SPR:$dstin),
> > + (VFNMAS SPR:$dstin, SPR:$a, SPR:$b)>,
> > + Requires<[HasVFP4,DontUseNEONForFP]>;
> > +
> > +def VFNMSD : ADbI<0b11101, 0b01, 0, 0,
> > + (outs DPR:$Dd), (ins DPR:$Ddin, DPR:$Dn, DPR:$Dm),
> > + IIC_fpFMAC64, "vfnms", ".f64\t$Dd, $Dn, $Dm",
> > + [(set DPR:$Dd, (fsub_mlx (fmul_su DPR:$Dn, DPR:$Dm),
> > + (f64 DPR:$Ddin)))]>,
> > + RegConstraint<"$Ddin = $Dd">,
> > + Requires<[HasVFP4]>;
> > +
> > +def VFNMSS : ASbI<0b11101, 0b01, 0, 0,
> > + (outs SPR:$Sd), (ins SPR:$Sdin, SPR:$Sn, SPR:$Sm),
> > + IIC_fpFMAC32, "vfnms", ".f32\t$Sd, $Sn, $Sm",
> > + [(set SPR:$Sd, (fsub_mlx (fmul_su SPR:$Sn, SPR:$Sm), SPR:$Sdin))]>,
> > + RegConstraint<"$Sdin = $Sd">,
> > + Requires<[HasVFP4,DontUseNEONForFP]> {
> > + // Some single precision VFP instructions may be executed on both NEON and
> > + // VFP pipelines.
> > +}
> > +
> > +def : Pat<(fsub_mlx (fmul_su DPR:$a, (f64 DPR:$b)), DPR:$dstin),
> > + (VFNMSD DPR:$dstin, DPR:$a, DPR:$b)>,
> > + Requires<[HasVFP4]>;
> > +def : Pat<(fsub_mlx (fmul_su SPR:$a, SPR:$b), SPR:$dstin),
> > + (VFNMSS SPR:$dstin, SPR:$a, SPR:$b)>,
> > + Requires<[HasVFP4,DontUseNEONForFP]>;
>
> I'm a bit concerned about these patterns: a multiply followed by an
> add is not, strictly speaking, the same thing as a fused multiply-add.
> We have an FMA intrinsic (http://llvm.org/docs/LangRef.html#int_fma);
> that should map onto this instruction, and we should only transform an
> unfused multiply+add in fast-math mode.
The PowerPC backend has patterns like this (for fmadd and friends), and
they are enabled whenever the TargetOptions flag NoExcessFPPrecision is
disabled (which is the default). I think that this behavior is
reasonable.
-Hal
>
> -Eli
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
--
Hal Finkel
Postdoctoral Appointee
Leadership Computing Facility
Argonne National Laboratory
From eugeni.stepanov at gmail.com Mon Jan 23 01:57:40 2012
From: eugeni.stepanov at gmail.com (Evgeniy Stepanov)
Date: Mon, 23 Jan 2012 07:57:40 -0000
Subject: [llvm-commits] [llvm] r148686 - in /llvm/trunk:
include/llvm/MC/MCAsmInfo.h lib/CodeGen/AsmPrinter/ARMException.cpp
lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp
test/CodeGen/ARM/ehabi-unwind.ll
Message-ID: <20120123075740.9CD762A6C12C@llvm.org>
Author: eugenis
Date: Mon Jan 23 01:57:39 2012
New Revision: 148686
URL: http://llvm.org/viewvc/llvm-project?rev=148686&view=rev
Log:
An option to selectively enable parts of ARM EHABI support.
This change adds an new value to the --arm-enable-ehabi option that
disables emitting unwinding descriptors. This mode gives a working
backtrace() without the (currently broken) exception support.
Modified:
llvm/trunk/include/llvm/MC/MCAsmInfo.h
llvm/trunk/lib/CodeGen/AsmPrinter/ARMException.cpp
llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp
llvm/trunk/test/CodeGen/ARM/ehabi-unwind.ll
Modified: llvm/trunk/include/llvm/MC/MCAsmInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAsmInfo.h?rev=148686&r1=148685&r2=148686&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCAsmInfo.h (original)
+++ llvm/trunk/include/llvm/MC/MCAsmInfo.h Mon Jan 23 01:57:39 2012
@@ -30,6 +30,7 @@
namespace ExceptionHandling {
enum ExceptionsType { None, DwarfCFI, SjLj, ARM, Win64 };
+ enum ARMEHABIMode { ARMEHABIDisabled, ARMEHABIUnwind, ARMEHABIFull };
}
namespace LCOMM {
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/ARMException.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/ARMException.cpp?rev=148686&r1=148685&r2=148686&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/ARMException.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/ARMException.cpp Mon Jan 23 01:57:39 2012
@@ -29,6 +29,7 @@
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/Target/TargetRegisterInfo.h"
+#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Dwarf.h"
#include "llvm/Support/FormattedStream.h"
#include "llvm/ADT/SmallString.h"
@@ -36,6 +37,18 @@
#include "llvm/ADT/Twine.h"
using namespace llvm;
+cl::opt
+EnableARMEHABI("arm-enable-ehabi", cl::Hidden,
+ cl::desc("Generate ARM EHABI tables:"),
+ cl::values(clEnumValN(ExceptionHandling::ARMEHABIDisabled, "no",
+ "Do not generate ARM EHABI tables"),
+ clEnumValN(ExceptionHandling::ARMEHABIUnwind, "unwind",
+ "Emit unwinding instructions, but not descriptors"),
+ clEnumValN(ExceptionHandling::ARMEHABIFull, "full",
+ "Generate full ARM EHABI tables"),
+ clEnumValEnd));
+
+
ARMException::ARMException(AsmPrinter *A)
: DwarfException(A),
shouldEmitTable(false), shouldEmitMoves(false), shouldEmitTableModule(false)
@@ -72,13 +85,15 @@
Asm->OutStreamer.EmitPersonality(PerSym);
}
- // Map all labels and get rid of any dead landing pads.
- MMI->TidyLandingPads();
+ if (EnableARMEHABI == ExceptionHandling::ARMEHABIFull) {
+ // Map all labels and get rid of any dead landing pads.
+ MMI->TidyLandingPads();
- Asm->OutStreamer.EmitHandlerData();
+ Asm->OutStreamer.EmitHandlerData();
- // Emit actual exception table
- EmitExceptionTable();
+ // Emit actual exception table
+ EmitExceptionTable();
+ }
}
Asm->OutStreamer.EmitFnEnd();
Modified: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp?rev=148686&r1=148685&r2=148686&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp (original)
+++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp Mon Jan 23 01:57:39 2012
@@ -16,10 +16,7 @@
using namespace llvm;
-cl::opt
-EnableARMEHABI("arm-enable-ehabi", cl::Hidden,
- cl::desc("Generate ARM EHABI tables"),
- cl::init(false));
+extern cl::opt EnableARMEHABI;
static const char *const arm_asm_table[] = {
@@ -82,6 +79,6 @@
SupportsDebugInformation = true;
// Exceptions handling
- if (EnableARMEHABI)
+ if (EnableARMEHABI != ExceptionHandling::ARMEHABIDisabled)
ExceptionsType = ExceptionHandling::ARM;
}
Modified: llvm/trunk/test/CodeGen/ARM/ehabi-unwind.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/ehabi-unwind.ll?rev=148686&r1=148685&r2=148686&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/ehabi-unwind.ll (original)
+++ llvm/trunk/test/CodeGen/ARM/ehabi-unwind.ll Mon Jan 23 01:57:39 2012
@@ -1,7 +1,8 @@
; Test that the EHABI unwind instruction generator does not encounter any
; unfamiliar instructions.
-; RUN: llc < %s -mtriple=thumbv7 -arm-enable-ehabi -disable-fp-elim
-; RUN: llc < %s -mtriple=thumbv7 -arm-enable-ehabi
+; RUN: llc < %s -mtriple=thumbv7 -arm-enable-ehabi=full -disable-fp-elim
+; RUN: llc < %s -mtriple=thumbv7 -arm-enable-ehabi=full
+; RUN: llc < %s -mtriple=thumbv7 -arm-enable-ehabi=unwind
define void @_Z1fv() nounwind {
entry:
From asl at math.spbu.ru Mon Jan 23 02:11:24 2012
From: asl at math.spbu.ru (Anton Korobeynikov)
Date: Mon, 23 Jan 2012 12:11:24 +0400
Subject: [llvm-commits] [llvm] r148658 - in /llvm/trunk:
lib/Target/ARM/ARM.td lib/Target/ARM/ARMAsmPrinter.cpp
lib/Target/ARM/ARMInstrInfo.td lib/Target/ARM/ARMInstrNEON.td
lib/Target/ARM/ARMInstrVFP.td lib/Target/ARM/ARMSchedule.td
lib/Target/ARM/ARMSub
In-Reply-To: <1327304842.32397.696.camel@sapling>
References:
<1327304842.32397.696.camel@sapling>
Message-ID:
> The PowerPC backend has patterns like this (for fmadd and friends), and
> they are enabled whenever the TargetOptions flag NoExcessFPPrecision is
> disabled (which is the default). I think that this behavior is
> reasonable.
We should also match the gcc's behavior here, I think.
Ana, will you please do this?
--
With best regards, Anton Korobeynikov
Faculty of Mathematics and Mechanics, Saint Petersburg State University
From craig.topper at gmail.com Mon Jan 23 02:18:28 2012
From: craig.topper at gmail.com (Craig Topper)
Date: Mon, 23 Jan 2012 08:18:28 -0000
Subject: [llvm-commits] [llvm] r148687 - in /llvm/trunk/lib/Target/X86:
X86ISelLowering.cpp X86InstrSSE.td
Message-ID: <20120123081828.8872A2A6C12C@llvm.org>
Author: ctopper
Date: Mon Jan 23 02:18:28 2012
New Revision: 148687
URL: http://llvm.org/viewvc/llvm-project?rev=148687&view=rev
Log:
Custom lower PCMPEQ/PCMPGT intrinsics to target specific nodes and remove the intrinsic patterns.
Modified:
llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
llvm/trunk/lib/Target/X86/X86InstrSSE.td
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=148687&r1=148686&r2=148687&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Mon Jan 23 02:18:28 2012
@@ -9318,6 +9318,26 @@
case Intrinsic::x86_avx2_psrav_d_256:
return DAG.getNode(ISD::SRA, dl, Op.getValueType(),
Op.getOperand(1), Op.getOperand(2));
+ case Intrinsic::x86_sse2_pcmpeq_b:
+ case Intrinsic::x86_sse2_pcmpeq_w:
+ case Intrinsic::x86_sse2_pcmpeq_d:
+ case Intrinsic::x86_sse41_pcmpeqq:
+ case Intrinsic::x86_avx2_pcmpeq_b:
+ case Intrinsic::x86_avx2_pcmpeq_w:
+ case Intrinsic::x86_avx2_pcmpeq_d:
+ case Intrinsic::x86_avx2_pcmpeq_q:
+ return DAG.getNode(X86ISD::PCMPEQ, dl, Op.getValueType(),
+ Op.getOperand(1), Op.getOperand(2));
+ case Intrinsic::x86_sse2_pcmpgt_b:
+ case Intrinsic::x86_sse2_pcmpgt_w:
+ case Intrinsic::x86_sse2_pcmpgt_d:
+ case Intrinsic::x86_sse42_pcmpgtq:
+ case Intrinsic::x86_avx2_pcmpgt_b:
+ case Intrinsic::x86_avx2_pcmpgt_w:
+ case Intrinsic::x86_avx2_pcmpgt_d:
+ case Intrinsic::x86_avx2_pcmpgt_q:
+ return DAG.getNode(X86ISD::PCMPGT, dl, Op.getValueType(),
+ Op.getOperand(1), Op.getOperand(2));
// ptest and testp intrinsics. The intrinsic these come from are designed to
// return an integer value, not just an instruction so lower it to the ptest
Modified: llvm/trunk/lib/Target/X86/X86InstrSSE.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrSSE.td?rev=148687&r1=148686&r2=148687&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86InstrSSE.td (original)
+++ llvm/trunk/lib/Target/X86/X86InstrSSE.td Mon Jan 23 02:18:28 2012
@@ -3510,31 +3510,31 @@
[(set RC:$dst, (IntId RC:$src1, (bitconvert (memop_frag addr:$src2))))]>;
}
-multiclass PDI_binop_rmi_int opc, bits<8> opc2, Format ImmForm,
- string OpcodeStr, SDNode OpNode,
- SDNode OpNode2, RegisterClass RC,
- ValueType DstVT, ValueType SrcVT, PatFrag bc_frag,
- bit Is2Addr = 1> {
+multiclass PDI_binop_rmi opc, bits<8> opc2, Format ImmForm,
+ string OpcodeStr, SDNode OpNode,
+ SDNode OpNode2, RegisterClass RC,
+ ValueType DstVT, ValueType SrcVT, PatFrag bc_frag,
+ bit Is2Addr = 1> {
// src2 is always 128-bit
def rr : PDI;
+ [(set RC:$dst, (DstVT (OpNode RC:$src1, (SrcVT VR128:$src2))))]>;
def rm : PDI;
+ [(set RC:$dst, (DstVT (OpNode RC:$src1,
+ (bc_frag (memopv2i64 addr:$src2)))))]>;
def ri : PDIi8;
+ [(set RC:$dst, (DstVT (OpNode2 RC:$src1, (i32 imm:$src2))))]>;
}
} // ExeDomain = SSEPackedInt
@@ -3730,24 +3730,24 @@
//===---------------------------------------------------------------------===//
let Predicates = [HasAVX] in {
-defm VPSLLW : PDI_binop_rmi_int<0xF1, 0x71, MRM6r, "vpsllw", X86vshl, X86vshli,
- VR128, v8i16, v8i16, bc_v8i16, 0>, VEX_4V;
-defm VPSLLD : PDI_binop_rmi_int<0xF2, 0x72, MRM6r, "vpslld", X86vshl, X86vshli,
- VR128, v4i32, v4i32, bc_v4i32, 0>, VEX_4V;
-defm VPSLLQ : PDI_binop_rmi_int<0xF3, 0x73, MRM6r, "vpsllq", X86vshl, X86vshli,
- VR128, v2i64, v2i64, bc_v2i64, 0>, VEX_4V;
-
-defm VPSRLW : PDI_binop_rmi_int<0xD1, 0x71, MRM2r, "vpsrlw", X86vsrl, X86vsrli,
- VR128, v8i16, v8i16, bc_v8i16, 0>, VEX_4V;
-defm VPSRLD : PDI_binop_rmi_int<0xD2, 0x72, MRM2r, "vpsrld", X86vsrl, X86vsrli,
- VR128, v4i32, v4i32, bc_v4i32, 0>, VEX_4V;
-defm VPSRLQ : PDI_binop_rmi_int<0xD3, 0x73, MRM2r, "vpsrlq", X86vsrl, X86vsrli,
- VR128, v2i64, v2i64, bc_v2i64, 0>, VEX_4V;
-
-defm VPSRAW : PDI_binop_rmi_int<0xE1, 0x71, MRM4r, "vpsraw", X86vsra, X86vsrai,
- VR128, v8i16, v8i16, bc_v8i16, 0>, VEX_4V;
-defm VPSRAD : PDI_binop_rmi_int<0xE2, 0x72, MRM4r, "vpsrad", X86vsra, X86vsrai,
- VR128, v4i32, v4i32, bc_v4i32, 0>, VEX_4V;
+defm VPSLLW : PDI_binop_rmi<0xF1, 0x71, MRM6r, "vpsllw", X86vshl, X86vshli,
+ VR128, v8i16, v8i16, bc_v8i16, 0>, VEX_4V;
+defm VPSLLD : PDI_binop_rmi<0xF2, 0x72, MRM6r, "vpslld", X86vshl, X86vshli,
+ VR128, v4i32, v4i32, bc_v4i32, 0>, VEX_4V;
+defm VPSLLQ : PDI_binop_rmi<0xF3, 0x73, MRM6r, "vpsllq", X86vshl, X86vshli,
+ VR128, v2i64, v2i64, bc_v2i64, 0>, VEX_4V;
+
+defm VPSRLW : PDI_binop_rmi<0xD1, 0x71, MRM2r, "vpsrlw", X86vsrl, X86vsrli,
+ VR128, v8i16, v8i16, bc_v8i16, 0>, VEX_4V;
+defm VPSRLD : PDI_binop_rmi<0xD2, 0x72, MRM2r, "vpsrld", X86vsrl, X86vsrli,
+ VR128, v4i32, v4i32, bc_v4i32, 0>, VEX_4V;
+defm VPSRLQ : PDI_binop_rmi<0xD3, 0x73, MRM2r, "vpsrlq", X86vsrl, X86vsrli,
+ VR128, v2i64, v2i64, bc_v2i64, 0>, VEX_4V;
+
+defm VPSRAW : PDI_binop_rmi<0xE1, 0x71, MRM4r, "vpsraw", X86vsra, X86vsrai,
+ VR128, v8i16, v8i16, bc_v8i16, 0>, VEX_4V;
+defm VPSRAD : PDI_binop_rmi<0xE2, 0x72, MRM4r, "vpsrad", X86vsra, X86vsrai,
+ VR128, v4i32, v4i32, bc_v4i32, 0>, VEX_4V;
let ExeDomain = SSEPackedInt in {
// 128-bit logical shifts.
@@ -3768,24 +3768,24 @@
} // Predicates = [HasAVX]
let Predicates = [HasAVX2] in {
-defm VPSLLWY : PDI_binop_rmi_int<0xF1, 0x71, MRM6r, "vpsllw", X86vshl, X86vshli,
- VR256, v16i16, v8i16, bc_v8i16, 0>, VEX_4V;
-defm VPSLLDY : PDI_binop_rmi_int<0xF2, 0x72, MRM6r, "vpslld", X86vshl, X86vshli,
- VR256, v8i32, v4i32, bc_v4i32, 0>, VEX_4V;
-defm VPSLLQY : PDI_binop_rmi_int<0xF3, 0x73, MRM6r, "vpsllq", X86vshl, X86vshli,
- VR256, v4i64, v2i64, bc_v2i64, 0>, VEX_4V;
-
-defm VPSRLWY : PDI_binop_rmi_int<0xD1, 0x71, MRM2r, "vpsrlw", X86vsrl, X86vsrli,
- VR256, v16i16, v8i16, bc_v8i16, 0>, VEX_4V;
-defm VPSRLDY : PDI_binop_rmi_int<0xD2, 0x72, MRM2r, "vpsrld", X86vsrl, X86vsrli,
- VR256, v8i32, v4i32, bc_v4i32, 0>, VEX_4V;
-defm VPSRLQY : PDI_binop_rmi_int<0xD3, 0x73, MRM2r, "vpsrlq", X86vsrl, X86vsrli,
- VR256, v4i64, v2i64, bc_v2i64, 0>, VEX_4V;
-
-defm VPSRAWY : PDI_binop_rmi_int<0xE1, 0x71, MRM4r, "vpsraw", X86vsra, X86vsrai,
- VR256, v16i16, v8i16, bc_v8i16, 0>, VEX_4V;
-defm VPSRADY : PDI_binop_rmi_int<0xE2, 0x72, MRM4r, "vpsrad", X86vsra, X86vsrai,
- VR256, v8i32, v4i32, bc_v4i32, 0>, VEX_4V;
+defm VPSLLWY : PDI_binop_rmi<0xF1, 0x71, MRM6r, "vpsllw", X86vshl, X86vshli,
+ VR256, v16i16, v8i16, bc_v8i16, 0>, VEX_4V;
+defm VPSLLDY : PDI_binop_rmi<0xF2, 0x72, MRM6r, "vpslld", X86vshl, X86vshli,
+ VR256, v8i32, v4i32, bc_v4i32, 0>, VEX_4V;
+defm VPSLLQY : PDI_binop_rmi<0xF3, 0x73, MRM6r, "vpsllq", X86vshl, X86vshli,
+ VR256, v4i64, v2i64, bc_v2i64, 0>, VEX_4V;
+
+defm VPSRLWY : PDI_binop_rmi<0xD1, 0x71, MRM2r, "vpsrlw", X86vsrl, X86vsrli,
+ VR256, v16i16, v8i16, bc_v8i16, 0>, VEX_4V;
+defm VPSRLDY : PDI_binop_rmi<0xD2, 0x72, MRM2r, "vpsrld", X86vsrl, X86vsrli,
+ VR256, v8i32, v4i32, bc_v4i32, 0>, VEX_4V;
+defm VPSRLQY : PDI_binop_rmi<0xD3, 0x73, MRM2r, "vpsrlq", X86vsrl, X86vsrli,
+ VR256, v4i64, v2i64, bc_v2i64, 0>, VEX_4V;
+
+defm VPSRAWY : PDI_binop_rmi<0xE1, 0x71, MRM4r, "vpsraw", X86vsra, X86vsrai,
+ VR256, v16i16, v8i16, bc_v8i16, 0>, VEX_4V;
+defm VPSRADY : PDI_binop_rmi<0xE2, 0x72, MRM4r, "vpsrad", X86vsra, X86vsrai,
+ VR256, v8i32, v4i32, bc_v4i32, 0>, VEX_4V;
let ExeDomain = SSEPackedInt in {
// 256-bit logical shifts.
@@ -3806,24 +3806,24 @@
} // Predicates = [HasAVX2]
let Constraints = "$src1 = $dst" in {
-defm PSLLW : PDI_binop_rmi_int<0xF1, 0x71, MRM6r, "psllw", X86vshl, X86vshli,
- VR128, v8i16, v8i16, bc_v8i16>;
-defm PSLLD : PDI_binop_rmi_int<0xF2, 0x72, MRM6r, "pslld", X86vshl, X86vshli,
- VR128, v4i32, v4i32, bc_v4i32>;
-defm PSLLQ : PDI_binop_rmi_int<0xF3, 0x73, MRM6r, "psllq", X86vshl, X86vshli,
- VR128, v2i64, v2i64, bc_v2i64>;
-
-defm PSRLW : PDI_binop_rmi_int<0xD1, 0x71, MRM2r, "psrlw", X86vsrl, X86vsrli,
- VR128, v8i16, v8i16, bc_v8i16>;
-defm PSRLD : PDI_binop_rmi_int<0xD2, 0x72, MRM2r, "psrld", X86vsrl, X86vsrli,
- VR128, v4i32, v4i32, bc_v4i32>;
-defm PSRLQ : PDI_binop_rmi_int<0xD3, 0x73, MRM2r, "psrlq", X86vsrl, X86vsrli,
- VR128, v2i64, v2i64, bc_v2i64>;
-
-defm PSRAW : PDI_binop_rmi_int<0xE1, 0x71, MRM4r, "psraw", X86vsra, X86vsrai,
- VR128, v8i16, v8i16, bc_v8i16>;
-defm PSRAD : PDI_binop_rmi_int<0xE2, 0x72, MRM4r, "psrad", X86vsra, X86vsrai,
- VR128, v4i32, v4i32, bc_v4i32>;
+defm PSLLW : PDI_binop_rmi<0xF1, 0x71, MRM6r, "psllw", X86vshl, X86vshli,
+ VR128, v8i16, v8i16, bc_v8i16>;
+defm PSLLD : PDI_binop_rmi<0xF2, 0x72, MRM6r, "pslld", X86vshl, X86vshli,
+ VR128, v4i32, v4i32, bc_v4i32>;
+defm PSLLQ : PDI_binop_rmi<0xF3, 0x73, MRM6r, "psllq", X86vshl, X86vshli,
+ VR128, v2i64, v2i64, bc_v2i64>;
+
+defm PSRLW : PDI_binop_rmi<0xD1, 0x71, MRM2r, "psrlw", X86vsrl, X86vsrli,
+ VR128, v8i16, v8i16, bc_v8i16>;
+defm PSRLD : PDI_binop_rmi<0xD2, 0x72, MRM2r, "psrld", X86vsrl, X86vsrli,
+ VR128, v4i32, v4i32, bc_v4i32>;
+defm PSRLQ : PDI_binop_rmi<0xD3, 0x73, MRM2r, "psrlq", X86vsrl, X86vsrli,
+ VR128, v2i64, v2i64, bc_v2i64>;
+
+defm PSRAW : PDI_binop_rmi<0xE1, 0x71, MRM4r, "psraw", X86vsra, X86vsrai,
+ VR128, v8i16, v8i16, bc_v8i16>;
+defm PSRAD : PDI_binop_rmi<0xE2, 0x72, MRM4r, "psrad", X86vsra, X86vsrai,
+ VR128, v4i32, v4i32, bc_v4i32>;
let ExeDomain = SSEPackedInt in {
// 128-bit logical shifts.
@@ -3883,148 +3883,50 @@
//===---------------------------------------------------------------------===//
let Predicates = [HasAVX] in {
- defm VPCMPEQB : PDI_binop_rm_int<0x74, "vpcmpeqb", int_x86_sse2_pcmpeq_b,
- VR128, memopv2i64, i128mem, 1, 0>, VEX_4V;
- defm VPCMPEQW : PDI_binop_rm_int<0x75, "vpcmpeqw", int_x86_sse2_pcmpeq_w,
- VR128, memopv2i64, i128mem, 1, 0>, VEX_4V;
- defm VPCMPEQD : PDI_binop_rm_int<0x76, "vpcmpeqd", int_x86_sse2_pcmpeq_d,
- VR128, memopv2i64, i128mem, 1, 0>, VEX_4V;
- defm VPCMPGTB : PDI_binop_rm_int<0x64, "vpcmpgtb", int_x86_sse2_pcmpgt_b,
- VR128, memopv2i64, i128mem, 0, 0>, VEX_4V;
- defm VPCMPGTW : PDI_binop_rm_int<0x65, "vpcmpgtw", int_x86_sse2_pcmpgt_w,
- VR128, memopv2i64, i128mem, 0, 0>, VEX_4V;
- defm VPCMPGTD : PDI_binop_rm_int<0x66, "vpcmpgtd", int_x86_sse2_pcmpgt_d,
- VR128, memopv2i64, i128mem, 0, 0>, VEX_4V;
-
- def : Pat<(v16i8 (X86pcmpeq VR128:$src1, VR128:$src2)),
- (VPCMPEQBrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v16i8 (X86pcmpeq VR128:$src1,
- (bc_v16i8 (memopv2i64 addr:$src2)))),
- (VPCMPEQBrm VR128:$src1, addr:$src2)>;
- def : Pat<(v8i16 (X86pcmpeq VR128:$src1, VR128:$src2)),
- (VPCMPEQWrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v8i16 (X86pcmpeq VR128:$src1,
- (bc_v8i16 (memopv2i64 addr:$src2)))),
- (VPCMPEQWrm VR128:$src1, addr:$src2)>;
- def : Pat<(v4i32 (X86pcmpeq VR128:$src1, VR128:$src2)),
- (VPCMPEQDrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v4i32 (X86pcmpeq VR128:$src1,
- (bc_v4i32 (memopv2i64 addr:$src2)))),
- (VPCMPEQDrm VR128:$src1, addr:$src2)>;
-
- def : Pat<(v16i8 (X86pcmpgt VR128:$src1, VR128:$src2)),
- (VPCMPGTBrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v16i8 (X86pcmpgt VR128:$src1,
- (bc_v16i8 (memopv2i64 addr:$src2)))),
- (VPCMPGTBrm VR128:$src1, addr:$src2)>;
- def : Pat<(v8i16 (X86pcmpgt VR128:$src1, VR128:$src2)),
- (VPCMPGTWrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v8i16 (X86pcmpgt VR128:$src1,
- (bc_v8i16 (memopv2i64 addr:$src2)))),
- (VPCMPGTWrm VR128:$src1, addr:$src2)>;
- def : Pat<(v4i32 (X86pcmpgt VR128:$src1, VR128:$src2)),
- (VPCMPGTDrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v4i32 (X86pcmpgt VR128:$src1,
- (bc_v4i32 (memopv2i64 addr:$src2)))),
- (VPCMPGTDrm VR128:$src1, addr:$src2)>;
+ defm VPCMPEQB : PDI_binop_rm<0x74, "vpcmpeqb", X86pcmpeq, v16i8,
+ VR128, memopv2i64, i128mem, 1, 0>, VEX_4V;
+ defm VPCMPEQW : PDI_binop_rm<0x75, "vpcmpeqw", X86pcmpeq, v8i16,
+ VR128, memopv2i64, i128mem, 1, 0>, VEX_4V;
+ defm VPCMPEQD : PDI_binop_rm<0x76, "vpcmpeqd", X86pcmpeq, v4i32,
+ VR128, memopv2i64, i128mem, 1, 0>, VEX_4V;
+ defm VPCMPGTB : PDI_binop_rm<0x64, "vpcmpgtb", X86pcmpgt, v16i8,
+ VR128, memopv2i64, i128mem, 0, 0>, VEX_4V;
+ defm VPCMPGTW : PDI_binop_rm<0x65, "vpcmpgtw", X86pcmpgt, v8i16,
+ VR128, memopv2i64, i128mem, 0, 0>, VEX_4V;
+ defm VPCMPGTD : PDI_binop_rm<0x66, "vpcmpgtd", X86pcmpgt, v4i32,
+ VR128, memopv2i64, i128mem, 0, 0>, VEX_4V;
}
let Predicates = [HasAVX2] in {
- defm VPCMPEQBY : PDI_binop_rm_int<0x74, "vpcmpeqb", int_x86_avx2_pcmpeq_b,
- VR256, memopv4i64, i256mem, 1, 0>, VEX_4V;
- defm VPCMPEQWY : PDI_binop_rm_int<0x75, "vpcmpeqw", int_x86_avx2_pcmpeq_w,
- VR256, memopv4i64, i256mem, 1, 0>, VEX_4V;
- defm VPCMPEQDY : PDI_binop_rm_int<0x76, "vpcmpeqd", int_x86_avx2_pcmpeq_d,
- VR256, memopv4i64, i256mem, 1, 0>, VEX_4V;
- defm VPCMPGTBY : PDI_binop_rm_int<0x64, "vpcmpgtb", int_x86_avx2_pcmpgt_b,
- VR256, memopv4i64, i256mem, 0, 0>, VEX_4V;
- defm VPCMPGTWY : PDI_binop_rm_int<0x65, "vpcmpgtw", int_x86_avx2_pcmpgt_w,
- VR256, memopv4i64, i256mem, 0, 0>, VEX_4V;
- defm VPCMPGTDY : PDI_binop_rm_int<0x66, "vpcmpgtd", int_x86_avx2_pcmpgt_d,
- VR256, memopv4i64, i256mem, 0, 0>, VEX_4V;
-
- def : Pat<(v32i8 (X86pcmpeq VR256:$src1, VR256:$src2)),
- (VPCMPEQBYrr VR256:$src1, VR256:$src2)>;
- def : Pat<(v32i8 (X86pcmpeq VR256:$src1,
- (bc_v32i8 (memopv4i64 addr:$src2)))),
- (VPCMPEQBYrm VR256:$src1, addr:$src2)>;
- def : Pat<(v16i16 (X86pcmpeq VR256:$src1, VR256:$src2)),
- (VPCMPEQWYrr VR256:$src1, VR256:$src2)>;
- def : Pat<(v16i16 (X86pcmpeq VR256:$src1,
- (bc_v16i16 (memopv4i64 addr:$src2)))),
- (VPCMPEQWYrm VR256:$src1, addr:$src2)>;
- def : Pat<(v8i32 (X86pcmpeq VR256:$src1, VR256:$src2)),
- (VPCMPEQDYrr VR256:$src1, VR256:$src2)>;
- def : Pat<(v8i32 (X86pcmpeq VR256:$src1,
- (bc_v8i32 (memopv4i64 addr:$src2)))),
- (VPCMPEQDYrm VR256:$src1, addr:$src2)>;
-
- def : Pat<(v32i8 (X86pcmpgt VR256:$src1, VR256:$src2)),
- (VPCMPGTBYrr VR256:$src1, VR256:$src2)>;
- def : Pat<(v32i8 (X86pcmpgt VR256:$src1,
- (bc_v32i8 (memopv4i64 addr:$src2)))),
- (VPCMPGTBYrm VR256:$src1, addr:$src2)>;
- def : Pat<(v16i16 (X86pcmpgt VR256:$src1, VR256:$src2)),
- (VPCMPGTWYrr VR256:$src1, VR256:$src2)>;
- def : Pat<(v16i16 (X86pcmpgt VR256:$src1,
- (bc_v16i16 (memopv4i64 addr:$src2)))),
- (VPCMPGTWYrm VR256:$src1, addr:$src2)>;
- def : Pat<(v8i32 (X86pcmpgt VR256:$src1, VR256:$src2)),
- (VPCMPGTDYrr VR256:$src1, VR256:$src2)>;
- def : Pat<(v8i32 (X86pcmpgt VR256:$src1,
- (bc_v8i32 (memopv4i64 addr:$src2)))),
- (VPCMPGTDYrm VR256:$src1, addr:$src2)>;
+ defm VPCMPEQBY : PDI_binop_rm<0x74, "vpcmpeqb", X86pcmpeq, v32i8,
+ VR256, memopv4i64, i256mem, 1, 0>, VEX_4V;
+ defm VPCMPEQWY : PDI_binop_rm<0x75, "vpcmpeqw", X86pcmpeq, v16i16,
+ VR256, memopv4i64, i256mem, 1, 0>, VEX_4V;
+ defm VPCMPEQDY : PDI_binop_rm<0x76, "vpcmpeqd", X86pcmpeq, v8i32,
+ VR256, memopv4i64, i256mem, 1, 0>, VEX_4V;
+ defm VPCMPGTBY : PDI_binop_rm<0x64, "vpcmpgtb", X86pcmpgt, v32i8,
+ VR256, memopv4i64, i256mem, 0, 0>, VEX_4V;
+ defm VPCMPGTWY : PDI_binop_rm<0x65, "vpcmpgtw", X86pcmpgt, v16i16,
+ VR256, memopv4i64, i256mem, 0, 0>, VEX_4V;
+ defm VPCMPGTDY : PDI_binop_rm<0x66, "vpcmpgtd", X86pcmpgt, v8i32,
+ VR256, memopv4i64, i256mem, 0, 0>, VEX_4V;
}
let Constraints = "$src1 = $dst" in {
- defm PCMPEQB : PDI_binop_rm_int<0x74, "pcmpeqb", int_x86_sse2_pcmpeq_b,
- VR128, memopv2i64, i128mem, 1>;
- defm PCMPEQW : PDI_binop_rm_int<0x75, "pcmpeqw", int_x86_sse2_pcmpeq_w,
- VR128, memopv2i64, i128mem, 1>;
- defm PCMPEQD : PDI_binop_rm_int<0x76, "pcmpeqd", int_x86_sse2_pcmpeq_d,
- VR128, memopv2i64, i128mem, 1>;
- defm PCMPGTB : PDI_binop_rm_int<0x64, "pcmpgtb", int_x86_sse2_pcmpgt_b,
- VR128, memopv2i64, i128mem>;
- defm PCMPGTW : PDI_binop_rm_int<0x65, "pcmpgtw", int_x86_sse2_pcmpgt_w,
- VR128, memopv2i64, i128mem>;
- defm PCMPGTD : PDI_binop_rm_int<0x66, "pcmpgtd", int_x86_sse2_pcmpgt_d,
- VR128, memopv2i64, i128mem>;
+ defm PCMPEQB : PDI_binop_rm<0x74, "pcmpeqb", X86pcmpeq, v16i8,
+ VR128, memopv2i64, i128mem, 1>;
+ defm PCMPEQW : PDI_binop_rm<0x75, "pcmpeqw", X86pcmpeq, v8i16,
+ VR128, memopv2i64, i128mem, 1>;
+ defm PCMPEQD : PDI_binop_rm<0x76, "pcmpeqd", X86pcmpeq, v4i32,
+ VR128, memopv2i64, i128mem, 1>;
+ defm PCMPGTB : PDI_binop_rm<0x64, "pcmpgtb", X86pcmpgt, v16i8,
+ VR128, memopv2i64, i128mem>;
+ defm PCMPGTW : PDI_binop_rm<0x65, "pcmpgtw", X86pcmpgt, v8i16,
+ VR128, memopv2i64, i128mem>;
+ defm PCMPGTD : PDI_binop_rm<0x66, "pcmpgtd", X86pcmpgt, v4i32,
+ VR128, memopv2i64, i128mem>;
} // Constraints = "$src1 = $dst"
-let Predicates = [HasSSE2] in {
- def : Pat<(v16i8 (X86pcmpeq VR128:$src1, VR128:$src2)),
- (PCMPEQBrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v16i8 (X86pcmpeq VR128:$src1,
- (bc_v16i8 (memopv2i64 addr:$src2)))),
- (PCMPEQBrm VR128:$src1, addr:$src2)>;
- def : Pat<(v8i16 (X86pcmpeq VR128:$src1, VR128:$src2)),
- (PCMPEQWrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v8i16 (X86pcmpeq VR128:$src1,
- (bc_v8i16 (memopv2i64 addr:$src2)))),
- (PCMPEQWrm VR128:$src1, addr:$src2)>;
- def : Pat<(v4i32 (X86pcmpeq VR128:$src1, VR128:$src2)),
- (PCMPEQDrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v4i32 (X86pcmpeq VR128:$src1,
- (bc_v4i32 (memopv2i64 addr:$src2)))),
- (PCMPEQDrm VR128:$src1, addr:$src2)>;
-
- def : Pat<(v16i8 (X86pcmpgt VR128:$src1, VR128:$src2)),
- (PCMPGTBrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v16i8 (X86pcmpgt VR128:$src1,
- (bc_v16i8 (memopv2i64 addr:$src2)))),
- (PCMPGTBrm VR128:$src1, addr:$src2)>;
- def : Pat<(v8i16 (X86pcmpgt VR128:$src1, VR128:$src2)),
- (PCMPGTWrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v8i16 (X86pcmpgt VR128:$src1,
- (bc_v8i16 (memopv2i64 addr:$src2)))),
- (PCMPGTWrm VR128:$src1, addr:$src2)>;
- def : Pat<(v4i32 (X86pcmpgt VR128:$src1, VR128:$src2)),
- (PCMPGTDrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v4i32 (X86pcmpgt VR128:$src1,
- (bc_v4i32 (memopv2i64 addr:$src2)))),
- (PCMPGTDrm VR128:$src1, addr:$src2)>;
-}
-
//===---------------------------------------------------------------------===//
// SSE2 - Packed Integer Pack Instructions
//===---------------------------------------------------------------------===//
@@ -6372,8 +6274,6 @@
let isCommutable = 0 in
defm VPACKUSDW : SS41I_binop_rm_int<0x2B, "vpackusdw", int_x86_sse41_packusdw,
0>, VEX_4V;
- defm VPCMPEQQ : SS41I_binop_rm_int<0x29, "vpcmpeqq", int_x86_sse41_pcmpeqq,
- 0>, VEX_4V;
defm VPMINSB : SS41I_binop_rm_int<0x38, "vpminsb", int_x86_sse41_pminsb,
0>, VEX_4V;
defm VPMINSD : SS41I_binop_rm_int<0x39, "vpminsd", int_x86_sse41_pminsd,
@@ -6392,19 +6292,12 @@
0>, VEX_4V;
defm VPMULDQ : SS41I_binop_rm_int<0x28, "vpmuldq", int_x86_sse41_pmuldq,
0>, VEX_4V;
-
- def : Pat<(v2i64 (X86pcmpeq VR128:$src1, VR128:$src2)),
- (VPCMPEQQrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v2i64 (X86pcmpeq VR128:$src1, (memop addr:$src2))),
- (VPCMPEQQrm VR128:$src1, addr:$src2)>;
}
let Predicates = [HasAVX2] in {
let isCommutable = 0 in
defm VPACKUSDW : SS41I_binop_rm_int_y<0x2B, "vpackusdw",
int_x86_avx2_packusdw>, VEX_4V;
- defm VPCMPEQQ : SS41I_binop_rm_int_y<0x29, "vpcmpeqq",
- int_x86_avx2_pcmpeq_q>, VEX_4V;
defm VPMINSB : SS41I_binop_rm_int_y<0x38, "vpminsb",
int_x86_avx2_pmins_b>, VEX_4V;
defm VPMINSD : SS41I_binop_rm_int_y<0x39, "vpminsd",
@@ -6423,17 +6316,11 @@
int_x86_avx2_pmaxu_w>, VEX_4V;
defm VPMULDQ : SS41I_binop_rm_int_y<0x28, "vpmuldq",
int_x86_avx2_pmul_dq>, VEX_4V;
-
- def : Pat<(v4i64 (X86pcmpeq VR256:$src1, VR256:$src2)),
- (VPCMPEQQYrr VR256:$src1, VR256:$src2)>;
- def : Pat<(v4i64 (X86pcmpeq VR256:$src1, (memop addr:$src2))),
- (VPCMPEQQYrm VR256:$src1, addr:$src2)>;
}
let Constraints = "$src1 = $dst" in {
let isCommutable = 0 in
defm PACKUSDW : SS41I_binop_rm_int<0x2B, "packusdw", int_x86_sse41_packusdw>;
- defm PCMPEQQ : SS41I_binop_rm_int<0x29, "pcmpeqq", int_x86_sse41_pcmpeqq>;
defm PMINSB : SS41I_binop_rm_int<0x38, "pminsb", int_x86_sse41_pminsb>;
defm PMINSD : SS41I_binop_rm_int<0x39, "pminsd", int_x86_sse41_pminsd>;
defm PMINUD : SS41I_binop_rm_int<0x3B, "pminud", int_x86_sse41_pminud>;
@@ -6445,57 +6332,46 @@
defm PMULDQ : SS41I_binop_rm_int<0x28, "pmuldq", int_x86_sse41_pmuldq>;
}
-let Predicates = [HasSSE41] in {
- def : Pat<(v2i64 (X86pcmpeq VR128:$src1, VR128:$src2)),
- (PCMPEQQrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v2i64 (X86pcmpeq VR128:$src1, (memop addr:$src2))),
- (PCMPEQQrm VR128:$src1, addr:$src2)>;
-}
-
/// SS48I_binop_rm - Simple SSE41 binary operator.
multiclass SS48I_binop_rm opc, string OpcodeStr, SDNode OpNode,
- ValueType OpVT, bit Is2Addr = 1> {
+ ValueType OpVT, RegisterClass RC, PatFrag memop_frag,
+ X86MemOperand x86memop, bit Is2Addr = 1> {
let isCommutable = 1 in
- def rr : SS48I,
- OpSize;
- def rm : SS48I, OpSize;
+ def rm : SS48I,
- OpSize;
+ [(set RC:$dst,
+ (OpVT (OpNode RC:$src1,
+ (bitconvert (memop_frag addr:$src2)))))]>, OpSize;
}
-/// SS48I_binop_rm - Simple SSE41 binary operator.
-multiclass SS48I_binop_rm_y opc, string OpcodeStr, SDNode OpNode,
- ValueType OpVT> {
- let isCommutable = 1 in
- def Yrr : SS48I,
- OpSize;
- def Yrm : SS48I,
- OpSize;
+let Predicates = [HasAVX] in {
+ defm VPMULLD : SS48I_binop_rm<0x40, "vpmulld", mul, v4i32, VR128,
+ memopv2i64, i128mem, 0>, VEX_4V;
+ defm VPCMPEQQ : SS48I_binop_rm<0x29, "vpcmpeqq", X86pcmpeq, v2i64, VR128,
+ memopv2i64, i128mem, 0>, VEX_4V;
+}
+let Predicates = [HasAVX2] in {
+ defm VPMULLDY : SS48I_binop_rm<0x40, "vpmulld", mul, v8i32, VR256,
+ memopv4i64, i256mem, 0>, VEX_4V;
+ defm VPCMPEQQY : SS48I_binop_rm<0x29, "vpcmpeqq", X86pcmpeq, v4i64, VR256,
+ memopv4i64, i256mem, 0>, VEX_4V;
}
-let Predicates = [HasAVX] in
- defm VPMULLD : SS48I_binop_rm<0x40, "vpmulld", mul, v4i32, 0>, VEX_4V;
-let Predicates = [HasAVX2] in
- defm VPMULLD : SS48I_binop_rm_y<0x40, "vpmulld", mul, v8i32>, VEX_4V;
-let Constraints = "$src1 = $dst" in
- defm PMULLD : SS48I_binop_rm<0x40, "pmulld", mul, v4i32>;
+let Constraints = "$src1 = $dst" in {
+ defm PMULLD : SS48I_binop_rm<0x40, "pmulld", mul, v4i32, VR128,
+ memopv2i64, i128mem>;
+ defm PCMPEQQ : SS48I_binop_rm<0x29, "pcmpeqq", X86pcmpeq, v2i64, VR128,
+ memopv2i64, i128mem>;
+}
/// SS41I_binop_rmi_int - SSE 4.1 binary operator with 8-bit immediate
multiclass SS41I_binop_rmi_int opc, string OpcodeStr,
@@ -6730,69 +6606,37 @@
// SSE4.2 - Compare Instructions
//===----------------------------------------------------------------------===//
-/// SS42I_binop_rm_int - Simple SSE 4.2 binary operator
-multiclass SS42I_binop_rm_int opc, string OpcodeStr,
- Intrinsic IntId128, bit Is2Addr = 1> {
- def rr : SS428I opc, string OpcodeStr, SDNode OpNode,
+ ValueType OpVT, RegisterClass RC, PatFrag memop_frag,
+ X86MemOperand x86memop, bit Is2Addr = 1> {
+ def rr : SS428I,
+ [(set RC:$dst, (OpVT (OpNode RC:$src1, RC:$src2)))]>,
OpSize;
- def rm : SS428I, OpSize;
+ [(set RC:$dst,
+ (OpVT (OpNode RC:$src1, (memop_frag addr:$src2))))]>, OpSize;
}
-/// SS42I_binop_rm_int - Simple SSE 4.2 binary operator
-multiclass SS42I_binop_rm_int_y opc, string OpcodeStr,
- Intrinsic IntId256> {
- def Yrr : SS428I,
- OpSize;
- def Yrm : SS428I, OpSize;
-}
-
-let Predicates = [HasAVX] in {
- defm VPCMPGTQ : SS42I_binop_rm_int<0x37, "vpcmpgtq", int_x86_sse42_pcmpgtq,
- 0>, VEX_4V;
-
- def : Pat<(v2i64 (X86pcmpgt VR128:$src1, VR128:$src2)),
- (VPCMPGTQrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v2i64 (X86pcmpgt VR128:$src1, (memop addr:$src2))),
- (VPCMPGTQrm VR128:$src1, addr:$src2)>;
-}
-
-let Predicates = [HasAVX2] in {
- defm VPCMPGTQ : SS42I_binop_rm_int_y<0x37, "vpcmpgtq", int_x86_avx2_pcmpgt_q>,
- VEX_4V;
+let Predicates = [HasAVX] in
+ defm VPCMPGTQ : SS42I_binop_rm<0x37, "vpcmpgtq", X86pcmpgt, v2i64, VR128,
+ memopv2i64, i128mem, 0>, VEX_4V;
- def : Pat<(v4i64 (X86pcmpgt VR256:$src1, VR256:$src2)),
- (VPCMPGTQYrr VR256:$src1, VR256:$src2)>;
- def : Pat<(v4i64 (X86pcmpgt VR256:$src1, (memop addr:$src2))),
- (VPCMPGTQYrm VR256:$src1, addr:$src2)>;
-}
+let Predicates = [HasAVX2] in
+ defm VPCMPGTQY : SS42I_binop_rm<0x37, "vpcmpgtq", X86pcmpgt, v4i64, VR256,
+ memopv4i64, i256mem, 0>, VEX_4V;
let Constraints = "$src1 = $dst" in
- defm PCMPGTQ : SS42I_binop_rm_int<0x37, "pcmpgtq", int_x86_sse42_pcmpgtq>;
-
-let Predicates = [HasSSE42] in {
- def : Pat<(v2i64 (X86pcmpgt VR128:$src1, VR128:$src2)),
- (PCMPGTQrr VR128:$src1, VR128:$src2)>;
- def : Pat<(v2i64 (X86pcmpgt VR128:$src1, (memop addr:$src2))),
- (PCMPGTQrm VR128:$src1, addr:$src2)>;
-}
+ defm PCMPGTQ : SS42I_binop_rm<0x37, "pcmpgtq", X86pcmpgt, v2i64, VR128,
+ memopv2i64, i128mem>;
//===----------------------------------------------------------------------===//
// SSE4.2 - String/text Processing Instructions
From sabre at nondot.org Mon Jan 23 02:19:57 2012
From: sabre at nondot.org (Chris Lattner)
Date: Mon, 23 Jan 2012 08:19:57 -0000
Subject: [llvm-commits] [llvm] r148688 -
/llvm/trunk/include/llvm/ADT/OwningPtr.h
Message-ID: <20120123081957.F16BE2A6C12C@llvm.org>
Author: lattner
Date: Mon Jan 23 02:19:57 2012
New Revision: 148688
URL: http://llvm.org/viewvc/llvm-project?rev=148688&view=rev
Log:
allow OwningPtr to be copy constructed if null, which is required to
make them be a valuetype in a DenseMap.
Modified:
llvm/trunk/include/llvm/ADT/OwningPtr.h
Modified: llvm/trunk/include/llvm/ADT/OwningPtr.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/OwningPtr.h?rev=148688&r1=148687&r2=148688&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/OwningPtr.h (original)
+++ llvm/trunk/include/llvm/ADT/OwningPtr.h Mon Jan 23 02:19:57 2012
@@ -25,12 +25,15 @@
/// pointee object can be taken away from OwningPtr by using the take method.
template
class OwningPtr {
- OwningPtr(OwningPtr const &); // DO NOT IMPLEMENT
- OwningPtr &operator=(OwningPtr const &); // DO NOT IMPLEMENT
+ OwningPtr &operator=(const OwningPtr &); // DO NOT IMPLEMENT
T *Ptr;
public:
explicit OwningPtr(T *P = 0) : Ptr(P) {}
+ OwningPtr(const OwningPtr &RHS) : Ptr(0) {
+ assert(RHS.Ptr == 0 && "Only null OwningPtr's are copyable!");
+ }
+
~OwningPtr() {
delete Ptr;
}
From sabre at nondot.org Mon Jan 23 02:42:38 2012
From: sabre at nondot.org (Chris Lattner)
Date: Mon, 23 Jan 2012 08:42:38 -0000
Subject: [llvm-commits] [llvm] r148691 - in /llvm/trunk/lib/VMCore:
Constants.cpp ConstantsContext.h LLVMContextImpl.cpp LLVMContextImpl.h
Message-ID: <20120123084239.1B8B62A6C12D@llvm.org>
Author: lattner
Date: Mon Jan 23 02:42:38 2012
New Revision: 148691
URL: http://llvm.org/viewvc/llvm-project?rev=148691&view=rev
Log:
Replace a use of ConstantUniqueMap for CAZ constants with a simple DenseMap.
Now that the type system rewrite has landed, there is no need for its
complexity and std::map'ness.
Modified:
llvm/trunk/lib/VMCore/Constants.cpp
llvm/trunk/lib/VMCore/ConstantsContext.h
llvm/trunk/lib/VMCore/LLVMContextImpl.cpp
llvm/trunk/lib/VMCore/LLVMContextImpl.h
Modified: llvm/trunk/lib/VMCore/Constants.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Constants.cpp?rev=148691&r1=148690&r2=148691&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/Constants.cpp (original)
+++ llvm/trunk/lib/VMCore/Constants.cpp Mon Jan 23 02:42:38 2012
@@ -993,18 +993,33 @@
//===----------------------------------------------------------------------===//
// Factory Function Implementation
-ConstantAggregateZero* ConstantAggregateZero::get(Type* Ty) {
+ConstantAggregateZero *ConstantAggregateZero::get(Type *Ty) {
assert((Ty->isStructTy() || Ty->isArrayTy() || Ty->isVectorTy()) &&
"Cannot create an aggregate zero of non-aggregate type!");
- LLVMContextImpl *pImpl = Ty->getContext().pImpl;
- return pImpl->AggZeroConstants.getOrCreate(Ty, 0);
+ OwningPtr &Entry =
+ Ty->getContext().pImpl->CAZConstants[Ty];
+ if (Entry == 0)
+ Entry.reset(new ConstantAggregateZero(Ty));
+
+ return Entry.get();
}
/// destroyConstant - Remove the constant from the constant table...
///
void ConstantAggregateZero::destroyConstant() {
- getType()->getContext().pImpl->AggZeroConstants.remove(this);
+ // Drop ownership of the CAZ object before removing the entry so that it
+ // doesn't get double deleted.
+ LLVMContextImpl::CAZMapTy &CAZConstants = getContext().pImpl->CAZConstants;
+ LLVMContextImpl::CAZMapTy::iterator I = CAZConstants.find(getType());
+ assert(I != CAZConstants.end() && "CAZ object not in uniquing map");
+ I->second.take();
+
+ // Actually remove the entry from the DenseMap now, which won't free the
+ // constant.
+ CAZConstants.erase(I);
+
+ // Free the constant and any dangling references to it.
destroyConstantImpl();
}
Modified: llvm/trunk/lib/VMCore/ConstantsContext.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/ConstantsContext.h?rev=148691&r1=148690&r2=148691&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/ConstantsContext.h (original)
+++ llvm/trunk/lib/VMCore/ConstantsContext.h Mon Jan 23 02:42:38 2012
@@ -477,13 +477,6 @@
}
};
-// ConstantAggregateZero does not take extra "value" argument...
-template
-struct ConstantCreator {
- static ConstantAggregateZero *create(Type *Ty, const ValType &V){
- return new ConstantAggregateZero(Ty);
- }
-};
template<>
struct ConstantKeyData {
@@ -498,14 +491,6 @@
};
template<>
-struct ConstantKeyData {
- typedef char ValType;
- static ValType getValType(ConstantAggregateZero *C) {
- return 0;
- }
-};
-
-template<>
struct ConstantKeyData {
typedef std::vector ValType;
static ValType getValType(ConstantArray *CA) {
Modified: llvm/trunk/lib/VMCore/LLVMContextImpl.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/LLVMContextImpl.cpp?rev=148691&r1=148690&r2=148691&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/LLVMContextImpl.cpp (original)
+++ llvm/trunk/lib/VMCore/LLVMContextImpl.cpp Mon Jan 23 02:42:38 2012
@@ -70,7 +70,7 @@
ArrayConstants.freeConstants();
StructConstants.freeConstants();
VectorConstants.freeConstants();
- AggZeroConstants.freeConstants();
+ CAZConstants.clear();
NullPtrConstants.freeConstants();
UndefValueConstants.freeConstants();
InlineAsms.freeConstants();
Modified: llvm/trunk/lib/VMCore/LLVMContextImpl.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/LLVMContextImpl.h?rev=148691&r1=148690&r2=148691&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/LLVMContextImpl.h (original)
+++ llvm/trunk/lib/VMCore/LLVMContextImpl.h Mon Jan 23 02:42:38 2012
@@ -27,6 +27,7 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/FoldingSet.h"
+#include "llvm/ADT/OwningPtr.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/StringMap.h"
#include
@@ -138,7 +139,8 @@
// on Context destruction.
SmallPtrSet NonUniquedMDNodes;
- ConstantUniqueMap AggZeroConstants;
+ typedef DenseMap > CAZMapTy;
+ CAZMapTy CAZConstants;
typedef ConstantUniqueMap, ArrayRef,
ArrayType, ConstantArray, true /*largekey*/> ArrayConstantsTy;
From nicholas at mxc.ca Mon Jan 23 02:47:21 2012
From: nicholas at mxc.ca (Nick Lewycky)
Date: Mon, 23 Jan 2012 08:47:21 -0000
Subject: [llvm-commits] [llvm] r148692 - /llvm/trunk/docs/LangRef.html
Message-ID: <20120123084721.AB5582A6C12D@llvm.org>
Author: nicholas
Date: Mon Jan 23 02:47:21 2012
New Revision: 148692
URL: http://llvm.org/viewvc/llvm-project?rev=148692&view=rev
Log:
Fix broken link.
Modified:
llvm/trunk/docs/LangRef.html
Modified: llvm/trunk/docs/LangRef.html
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.html?rev=148692&r1=148691&r2=148692&view=diff
==============================================================================
--- llvm/trunk/docs/LangRef.html (original)
+++ llvm/trunk/docs/LangRef.html Mon Jan 23 02:47:21 2012
@@ -1614,7 +1614,7 @@
synchronize with. These semantics are borrowed from Java and C++0x,
but are somewhat more colloquial. If these descriptions aren't precise enough,
check those specs (see spec references in the
-atomics guide).
+atomics guide).
fence instructions
treat these orderings somewhat differently since they don't take an address.
See that instruction's documentation for details.
From sabre at nondot.org Mon Jan 23 02:52:32 2012
From: sabre at nondot.org (Chris Lattner)
Date: Mon, 23 Jan 2012 08:52:32 -0000
Subject: [llvm-commits] [llvm] r148693 - in /llvm/trunk/lib/VMCore:
Constants.cpp ConstantsContext.h LLVMContextImpl.cpp LLVMContextImpl.h
Message-ID: <20120123085232.DC49D2A6C12C@llvm.org>
Author: lattner
Date: Mon Jan 23 02:52:32 2012
New Revision: 148693
URL: http://llvm.org/viewvc/llvm-project?rev=148693&view=rev
Log:
switch UndefValue and ConstantPointerNull over to DenseMap's for uniquing.
Modified:
llvm/trunk/lib/VMCore/Constants.cpp
llvm/trunk/lib/VMCore/ConstantsContext.h
llvm/trunk/lib/VMCore/LLVMContextImpl.cpp
llvm/trunk/lib/VMCore/LLVMContextImpl.h
Modified: llvm/trunk/lib/VMCore/Constants.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Constants.cpp?rev=148693&r1=148692&r2=148693&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/Constants.cpp (original)
+++ llvm/trunk/lib/VMCore/Constants.cpp Mon Jan 23 02:52:32 2012
@@ -1127,13 +1127,29 @@
//
ConstantPointerNull *ConstantPointerNull::get(PointerType *Ty) {
- return Ty->getContext().pImpl->NullPtrConstants.getOrCreate(Ty, 0);
+ OwningPtr &Entry =
+ Ty->getContext().pImpl->CPNConstants[Ty];
+ if (Entry == 0)
+ Entry.reset(new ConstantPointerNull(Ty));
+
+ return Entry.get();
}
// destroyConstant - Remove the constant from the constant table...
//
void ConstantPointerNull::destroyConstant() {
- getType()->getContext().pImpl->NullPtrConstants.remove(this);
+ // Drop ownership of the CPN object before removing the entry so that it
+ // doesn't get double deleted.
+ LLVMContextImpl::CPNMapTy &CPNConstants = getContext().pImpl->CPNConstants;
+ LLVMContextImpl::CPNMapTy::iterator I = CPNConstants.find(getType());
+ assert(I != CPNConstants.end() && "CPN object not in uniquing map");
+ I->second.take();
+
+ // Actually remove the entry from the DenseMap now, which won't free the
+ // constant.
+ CPNConstants.erase(I);
+
+ // Free the constant and any dangling references to it.
destroyConstantImpl();
}
@@ -1142,13 +1158,28 @@
//
UndefValue *UndefValue::get(Type *Ty) {
- return Ty->getContext().pImpl->UndefValueConstants.getOrCreate(Ty, 0);
+ OwningPtr &Entry = Ty->getContext().pImpl->UVConstants[Ty];
+ if (Entry == 0)
+ Entry.reset(new UndefValue(Ty));
+
+ return Entry.get();
}
// destroyConstant - Remove the constant from the constant table.
//
void UndefValue::destroyConstant() {
- getType()->getContext().pImpl->UndefValueConstants.remove(this);
+ // Drop ownership of the object before removing the entry so that it
+ // doesn't get double deleted.
+ LLVMContextImpl::UVMapTy &UVConstants = getContext().pImpl->UVConstants;
+ LLVMContextImpl::UVMapTy::iterator I = UVConstants.find(getType());
+ assert(I != UVConstants.end() && "UV object not in uniquing map");
+ I->second.take();
+
+ // Actually remove the entry from the DenseMap now, which won't free the
+ // constant.
+ UVConstants.erase(I);
+
+ // Free the constant and any dangling references to it.
destroyConstantImpl();
}
Modified: llvm/trunk/lib/VMCore/ConstantsContext.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/ConstantsContext.h?rev=148693&r1=148692&r2=148693&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/ConstantsContext.h (original)
+++ llvm/trunk/lib/VMCore/ConstantsContext.h Mon Jan 23 02:52:32 2012
@@ -514,37 +514,6 @@
}
};
-// ConstantPointerNull does not take extra "value" argument...
-template
-struct ConstantCreator {
- static ConstantPointerNull *create(PointerType *Ty, const ValType &V){
- return new ConstantPointerNull(Ty);
- }
-};
-
-template<>
-struct ConstantKeyData {
- typedef char ValType;
- static ValType getValType(ConstantPointerNull *C) {
- return 0;
- }
-};
-
-// UndefValue does not take extra "value" argument...
-template
-struct ConstantCreator {
- static UndefValue *create(Type *Ty, const ValType &V) {
- return new UndefValue(Ty);
- }
-};
-
-template<>
-struct ConstantKeyData {
- typedef char ValType;
- static ValType getValType(UndefValue *C) {
- return 0;
- }
-};
template<>
struct ConstantCreator {
Modified: llvm/trunk/lib/VMCore/LLVMContextImpl.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/LLVMContextImpl.cpp?rev=148693&r1=148692&r2=148693&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/LLVMContextImpl.cpp (original)
+++ llvm/trunk/lib/VMCore/LLVMContextImpl.cpp Mon Jan 23 02:52:32 2012
@@ -58,6 +58,8 @@
std::vector Modules(OwnedModules.begin(), OwnedModules.end());
DeleteContainerPointers(Modules);
+ // Free the constants. This is important to do here to ensure that they are
+ // freed before the LeakDetector is torn down.
std::for_each(ExprConstants.map_begin(), ExprConstants.map_end(),
DropReferences());
std::for_each(ArrayConstants.map_begin(), ArrayConstants.map_end(),
@@ -71,8 +73,8 @@
StructConstants.freeConstants();
VectorConstants.freeConstants();
CAZConstants.clear();
- NullPtrConstants.freeConstants();
- UndefValueConstants.freeConstants();
+ CPNConstants.clear();
+ UVConstants.clear();
InlineAsms.freeConstants();
DeleteContainerSeconds(IntConstants);
DeleteContainerSeconds(FPConstants);
Modified: llvm/trunk/lib/VMCore/LLVMContextImpl.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/LLVMContextImpl.h?rev=148693&r1=148692&r2=148693&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/LLVMContextImpl.h (original)
+++ llvm/trunk/lib/VMCore/LLVMContextImpl.h Mon Jan 23 02:52:32 2012
@@ -154,9 +154,11 @@
VectorType, ConstantVector> VectorConstantsTy;
VectorConstantsTy VectorConstants;
- ConstantUniqueMap
- NullPtrConstants;
- ConstantUniqueMap UndefValueConstants;
+ typedef DenseMap > CPNMapTy;
+ CPNMapTy CPNConstants;
+
+ typedef DenseMap > UVMapTy;
+ UVMapTy UVConstants;
DenseMap , BlockAddress*> BlockAddresses;
ConstantUniqueMap
From STPWORLD at narod.ru Mon Jan 23 03:10:57 2012
From: STPWORLD at narod.ru (Stepan Dyatkovskiy)
Date: Mon, 23 Jan 2012 13:10:57 +0400
Subject: [llvm-commits] [LLVM] SwitchInst PATCH: Changes in semantics
and usage.
In-Reply-To: <4F1A789C.6040808@narod.ru>
References: <216291326628464@web57.yandex.ru> <188821326736101@web38.yandex.ru>
<179511326997999@web49.yandex.ru> <4F1A789C.6040808@narod.ru>
Message-ID: <124601327309857@web136.yandex.ru>
Hi all.
I also updated serializing of SwitchInst in BitcodeWriter. Done the same like in other files - replaced low level operands usage with SwitchInst analogues.
Please find the updated patch in attachment for review.
-Stepan.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: si-cleanup.patch
Type: application/octet-stream
Size: 40245 bytes
Desc: not available
Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20120123/19daf727/attachment.obj
From geek4civic at gmail.com Mon Jan 23 03:14:42 2012
From: geek4civic at gmail.com (NAKAMURA Takumi)
Date: Mon, 23 Jan 2012 09:14:42 -0000
Subject: [llvm-commits] [llvm] r148694 -
/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
Message-ID: <20120123091442.EC64E2A6C12C@llvm.org>
Author: chapuni
Date: Mon Jan 23 03:14:42 2012
New Revision: 148694
URL: http://llvm.org/viewvc/llvm-project?rev=148694&view=rev
Log:
ARMAsmPrinter.cpp: Try to fix up r148686. EnableARMEHABI was also here.
Modified:
llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=148694&r1=148693&r2=148694&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Mon Jan 23 03:14:42 2012
@@ -1192,7 +1192,7 @@
}
}
-extern cl::opt EnableARMEHABI;
+extern cl::opt EnableARMEHABI;
// Simple pseudo-instructions have their lowering (with expansion to real
// instructions) auto-generated.
@@ -1203,7 +1203,8 @@
OutStreamer.EmitCodeRegion();
// Emit unwinding stuff for frame-related instructions
- if (EnableARMEHABI && MI->getFlag(MachineInstr::FrameSetup))
+ if (EnableARMEHABI != ExceptionHandling::ARMEHABIDisabled &&
+ MI->getFlag(MachineInstr::FrameSetup))
EmitUnwindingInstruction(MI);
// Do any auto-generated pseudo lowerings.
From geek4civic at gmail.com Mon Jan 23 03:24:59 2012
From: geek4civic at gmail.com (NAKAMURA Takumi)
Date: Mon, 23 Jan 2012 18:24:59 +0900
Subject: [llvm-commits] [llvm] r148694 -
/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
In-Reply-To: <20120123091442.EC64E2A6C12C@llvm.org>
References: <20120123091442.EC64E2A6C12C@llvm.org>
Message-ID:
Evgeniy, please confirm whether my fixup would be reasonable or not, thank you.
...Takumi
2012/1/23 NAKAMURA Takumi :
> Author: chapuni
> Date: Mon Jan 23 03:14:42 2012
> New Revision: 148694
>
> URL: http://llvm.org/viewvc/llvm-project?rev=148694&view=rev
> Log:
> ARMAsmPrinter.cpp: Try to fix up r148686. EnableARMEHABI was also here.
>
> Modified:
> ? ?llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
>
> Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=148694&r1=148693&r2=148694&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Mon Jan 23 03:14:42 2012
> @@ -1192,7 +1192,7 @@
> ? }
> ?}
>
> -extern cl::opt EnableARMEHABI;
> +extern cl::opt EnableARMEHABI;
>
> ?// Simple pseudo-instructions have their lowering (with expansion to real
> ?// instructions) auto-generated.
> @@ -1203,7 +1203,8 @@
> ? ? OutStreamer.EmitCodeRegion();
>
> ? // Emit unwinding stuff for frame-related instructions
> - ?if (EnableARMEHABI && MI->getFlag(MachineInstr::FrameSetup))
> + ?if (EnableARMEHABI != ExceptionHandling::ARMEHABIDisabled &&
> + ? ? ?MI->getFlag(MachineInstr::FrameSetup))
> ? ? EmitUnwindingInstruction(MI);
>
> ? // Do any auto-generated pseudo lowerings.
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
From glider at google.com Mon Jan 23 04:06:14 2012
From: glider at google.com (Alexander Potapenko)
Date: Mon, 23 Jan 2012 10:06:14 -0000
Subject: [llvm-commits] [compiler-rt] r148695 -
/compiler-rt/trunk/lib/asan/tests/asan_test.cc
Message-ID: <20120123100614.7AA7E2A6C12C@llvm.org>
Author: glider
Date: Mon Jan 23 04:06:14 2012
New Revision: 148695
URL: http://llvm.org/viewvc/llvm-project?rev=148695&view=rev
Log:
Add a test for CFStringCreateCopy.
Normally this function should not create copies of constant strings, but it does when the default CFAllocator
is replaced (e.g. under AddressSanitizer)
This test is related to http://code.google.com/p/address-sanitizer/issues/detail?id=10
Modified:
compiler-rt/trunk/lib/asan/tests/asan_test.cc
Modified: compiler-rt/trunk/lib/asan/tests/asan_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/tests/asan_test.cc?rev=148695&r1=148694&r2=148695&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/tests/asan_test.cc (original)
+++ compiler-rt/trunk/lib/asan/tests/asan_test.cc Mon Jan 23 04:06:14 2012
@@ -29,6 +29,8 @@
#ifndef __APPLE__
#include
+#else
+#include
#endif // __APPLE__
#ifdef __APPLE__
@@ -1894,6 +1896,14 @@
pthread_join(th, NULL);
pthread_key_delete(test_key);
}
+
+// Test that CFStringCreateCopy does not copy constant strings.
+TEST(AddressSanitizerMac, DISABLED_CFStringCreateCopy) {
+ CFStringRef str = CFSTR("Hello world!\n");
+ CFStringRef str2 = CFStringCreateCopy(0, str);
+ EXPECT_EQ(str, str2);
+}
+
#endif // __APPLE__
int main(int argc, char **argv) {
From glider at google.com Mon Jan 23 04:09:54 2012
From: glider at google.com (Alexander Potapenko)
Date: Mon, 23 Jan 2012 10:09:54 -0000
Subject: [llvm-commits] [compiler-rt] r148696 - in
/compiler-rt/trunk/lib/asan: asan_interceptors.cc asan_mac.cc asan_mac.h
tests/asan_test.cc
Message-ID: <20120123100954.82BDD2A6C12C@llvm.org>
Author: glider
Date: Mon Jan 23 04:09:54 2012
New Revision: 148696
URL: http://llvm.org/viewvc/llvm-project?rev=148696&view=rev
Log:
Wrap CFStringCreateCopy to prevent copying constant CF strings.
This should fix http://code.google.com/p/address-sanitizer/issues/detail?id=10
Modified:
compiler-rt/trunk/lib/asan/asan_interceptors.cc
compiler-rt/trunk/lib/asan/asan_mac.cc
compiler-rt/trunk/lib/asan/asan_mac.h
compiler-rt/trunk/lib/asan/tests/asan_test.cc
Modified: compiler-rt/trunk/lib/asan/asan_interceptors.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_interceptors.cc?rev=148696&r1=148695&r2=148696&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_interceptors.cc (original)
+++ compiler-rt/trunk/lib/asan/asan_interceptors.cc Mon Jan 23 04:09:54 2012
@@ -94,6 +94,7 @@
dispatch_barrier_async_f_f real_dispatch_barrier_async_f;
dispatch_group_async_f_f real_dispatch_group_async_f;
pthread_workqueue_additem_np_f real_pthread_workqueue_additem_np;
+CFStringCreateCopy_f real_CFStringCreateCopy;
#endif
sigaction_f real_sigaction;
@@ -648,6 +649,14 @@
if (FLAG_v >= 2) {
INTERCEPT_FUNCTION(pthread_workqueue_additem_np);
}
+ // Normally CFStringCreateCopy should not copy constant CF strings.
+ // Replacing the default CFAllocator causes constant strings to be copied
+ // rather than just returned, which leads to bugs in big applications like
+ // Chromium and WebKit, see
+ // http://code.google.com/p/address-sanitizer/issues/detail?id=10
+ // Until this problem is fixed we need to check that the string is
+ // non-constant before calling CFStringCreateCopy.
+ INTERCEPT_FUNCTION(CFStringCreateCopy);
#else
// On Darwin siglongjmp tailcalls longjmp, so we don't want to intercept it
// there.
Modified: compiler-rt/trunk/lib/asan/asan_mac.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_mac.cc?rev=148696&r1=148695&r2=148696&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_mac.cc (original)
+++ compiler-rt/trunk/lib/asan/asan_mac.cc Mon Jan 23 04:09:54 2012
@@ -42,6 +42,7 @@
extern dispatch_barrier_async_f_f real_dispatch_barrier_async_f;
extern dispatch_group_async_f_f real_dispatch_group_async_f;
extern pthread_workqueue_additem_np_f real_pthread_workqueue_additem_np;
+extern CFStringCreateCopy_f real_CFStringCreateCopy;
void GetPcSpBp(void *context, uintptr_t *pc, uintptr_t *sp, uintptr_t *bp) {
ucontext_t *ucontext = (ucontext_t*)context;
@@ -514,4 +515,45 @@
itemhandlep, gencountp);
}
+// CF_RC_BITS, the layout of CFRuntimeBase and __CFStrIsConstant are internal
+// and subject to change in further CoreFoundation versions. Apple does not
+// guarantee any binary compatibility from release to release.
+
+// See http://opensource.apple.com/source/CF/CF-635.15/CFInternal.h
+#if defined(__BIG_ENDIAN__)
+#define CF_RC_BITS 0
+#endif
+
+#if defined(__LITTLE_ENDIAN__)
+#define CF_RC_BITS 3
+#endif
+
+// See http://opensource.apple.com/source/CF/CF-635.15/CFRuntime.h
+typedef struct __CFRuntimeBase {
+ uintptr_t _cfisa;
+ uint8_t _cfinfo[4];
+#if __LP64__
+ uint32_t _rc;
+#endif
+} CFRuntimeBase;
+
+// See http://opensource.apple.com/source/CF/CF-635.15/CFString.c
+int __CFStrIsConstant(CFStringRef str) {
+ CFRuntimeBase *base = (CFRuntimeBase*)str;
+#if __LP64__
+ return base->_rc == 0;
+#else
+ return (base->_cfinfo[CF_RC_BITS]) == 0;
+#endif
+}
+
+extern "C"
+CFStringRef WRAP(CFStringCreateCopy)(CFAllocatorRef alloc, CFStringRef str) {
+ if (__CFStrIsConstant(str)) {
+ return str;
+ } else {
+ return real_CFStringCreateCopy(alloc, str);
+ }
+}
+
#endif // __APPLE__
Modified: compiler-rt/trunk/lib/asan/asan_mac.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_mac.h?rev=148696&r1=148695&r2=148696&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_mac.h (original)
+++ compiler-rt/trunk/lib/asan/asan_mac.h Mon Jan 23 04:09:54 2012
@@ -22,6 +22,7 @@
#include
#include
#include
+#include
typedef void* pthread_workqueue_t;
typedef void* pthread_workitem_handle_t;
@@ -44,7 +45,8 @@
typedef int (*pthread_workqueue_additem_np_f)(pthread_workqueue_t workq,
void *(*workitem_func)(void *), void * workitem_arg,
pthread_workitem_handle_t * itemhandlep, unsigned int *gencountp);
-
+typedef CFStringRef (*CFStringCreateCopy_f)(CFAllocatorRef alloc,
+ CFStringRef str);
// A wrapper for the ObjC blocks used to support libdispatch.
typedef struct {
@@ -90,6 +92,7 @@
int WRAP(pthread_workqueue_additem_np)(pthread_workqueue_t workq,
void *(*workitem_func)(void *), void * workitem_arg,
pthread_workitem_handle_t * itemhandlep, unsigned int *gencountp);
+CFStringRef WRAP(CFStringCreateCopy)(CFAllocatorRef alloc, CFStringRef str);
}
#endif // ASAN_MAC_H
Modified: compiler-rt/trunk/lib/asan/tests/asan_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/tests/asan_test.cc?rev=148696&r1=148695&r2=148696&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/tests/asan_test.cc (original)
+++ compiler-rt/trunk/lib/asan/tests/asan_test.cc Mon Jan 23 04:09:54 2012
@@ -1898,7 +1898,7 @@
}
// Test that CFStringCreateCopy does not copy constant strings.
-TEST(AddressSanitizerMac, DISABLED_CFStringCreateCopy) {
+TEST(AddressSanitizerMac, CFStringCreateCopy) {
CFStringRef str = CFSTR("Hello world!\n");
CFStringRef str2 = CFStringCreateCopy(0, str);
EXPECT_EQ(str, str2);
From eugeni.stepanov at gmail.com Mon Jan 23 04:14:48 2012
From: eugeni.stepanov at gmail.com (Evgeniy Stepanov)
Date: Mon, 23 Jan 2012 14:14:48 +0400
Subject: [llvm-commits] [llvm] r148694 -
/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
In-Reply-To:
References: <20120123091442.EC64E2A6C12C@llvm.org>
Message-ID:
Yes, this is correct. Sorry for the trouble and thank you for the fix.
On Mon, Jan 23, 2012 at 1:24 PM, NAKAMURA Takumi wrote:
> Evgeniy, please confirm whether my fixup would be reasonable or not, thank you.
>
> ...Takumi
>
> 2012/1/23 NAKAMURA Takumi :
>> Author: chapuni
>> Date: Mon Jan 23 03:14:42 2012
>> New Revision: 148694
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=148694&view=rev
>> Log:
>> ARMAsmPrinter.cpp: Try to fix up r148686. EnableARMEHABI was also here.
>>
>> Modified:
>> ? ?llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
>>
>> Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=148694&r1=148693&r2=148694&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original)
>> +++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Mon Jan 23 03:14:42 2012
>> @@ -1192,7 +1192,7 @@
>> ? }
>> ?}
>>
>> -extern cl::opt EnableARMEHABI;
>> +extern cl::opt EnableARMEHABI;
>>
>> ?// Simple pseudo-instructions have their lowering (with expansion to real
>> ?// instructions) auto-generated.
>> @@ -1203,7 +1203,8 @@
>> ? ? OutStreamer.EmitCodeRegion();
>>
>> ? // Emit unwinding stuff for frame-related instructions
>> - ?if (EnableARMEHABI && MI->getFlag(MachineInstr::FrameSetup))
>> + ?if (EnableARMEHABI != ExceptionHandling::ARMEHABIDisabled &&
>> + ? ? ?MI->getFlag(MachineInstr::FrameSetup))
>> ? ? EmitUnwindingInstruction(MI);
>>
>> ? // Do any auto-generated pseudo lowerings.
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
From glider at google.com Mon Jan 23 05:22:43 2012
From: glider at google.com (Alexander Potapenko)
Date: Mon, 23 Jan 2012 11:22:43 -0000
Subject: [llvm-commits] [llvm] r148697 -
/llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
Message-ID: <20120123112243.BE3122A6C12C@llvm.org>
Author: glider
Date: Mon Jan 23 05:22:43 2012
New Revision: 148697
URL: http://llvm.org/viewvc/llvm-project?rev=148697&view=rev
Log:
Implemented AddressSanitizer::getPassName()
Modified:
llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
Modified: llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp?rev=148697&r1=148696&r2=148697&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp Mon Jan 23 05:22:43 2012
@@ -143,6 +143,7 @@
/// AddressSanitizer: instrument the code in module to find memory bugs.
struct AddressSanitizer : public ModulePass {
AddressSanitizer();
+ virtual const char *getPassName() const;
void instrumentMop(Instruction *I);
void instrumentAddress(Instruction *OrigIns, IRBuilder<> &IRB,
Value *Addr, uint32_t TypeSize, bool IsWrite);
@@ -205,6 +206,10 @@
return new AddressSanitizer();
}
+const char *AddressSanitizer::getPassName() const {
+ return "AddressSanitizer";
+}
+
// Create a constant for Str so that we can pass it to the run-time lib.
static GlobalVariable *createPrivateGlobalForString(Module &M, StringRef Str) {
Constant *StrConst = ConstantArray::get(M.getContext(), Str);
From glider at google.com Mon Jan 23 05:40:13 2012
From: glider at google.com (Alexander Potapenko)
Date: Mon, 23 Jan 2012 15:40:13 +0400
Subject: [llvm-commits] [llvm] r148691 - in /llvm/trunk/lib/VMCore:
Constants.cpp ConstantsContext.h LLVMContextImpl.cpp LLVMContextImpl.h
In-Reply-To: <20120123084239.1B8B62A6C12D@llvm.org>
References: <20120123084239.1B8B62A6C12D@llvm.org>
Message-ID:
Hi Chris,
I believe this patch has broken AddressSanitizer (and probably other patches).
I get the following error message from clang r148696:
clang: /usr/local/google/asan/asan-llvm-trunk/llvm/include/llvm/ADT/OwningPtr.h:34:
llvm::OwningPtr::OwningPtr(const llvm::OwningPtr&) [with T =
llvm::ConstantAggregateZero]: Assertion `RHS.Ptr == 0 && "Only null
OwningPtr's are copyable!"' failed.
0 clang 0x0000000001dad27f
1 clang 0x0000000001daf4f2
2 libpthread.so.0 0x00007ff3b2e7b8f0
3 libc.so.6 0x00007ff3b216aa75 gsignal + 53
4 libc.so.6 0x00007ff3b216e5c0 abort + 384
5 libc.so.6 0x00007ff3b2163941 __assert_fail + 241
6 clang 0x0000000001c95949
7 clang 0x0000000001c90c15
llvm::ConstantAggregateZero::get(llvm::Type*) + 677
8 clang 0x0000000001c94548
llvm::ConstantStruct::get(llvm::StructType*, ...) + 248
9 clang 0x00000000011d2a41
10 clang 0x00000000011d3d9c
11 clang 0x0000000001d4c5e1
llvm::MPPassManager::runOnModule(llvm::Module&) + 497
12 clang 0x0000000001d4c76b
llvm::PassManagerImpl::run(llvm::Module&) + 187
13 clang 0x00000000007a8945
clang::EmitBackendOutput(clang::DiagnosticsEngine&,
clang::CodeGenOptions const&, clang::TargetOptions const&,
clang::LangOptions const&, llvm::Module*, clang::BackendAction,
llvm::raw_ostream*) + 1525
14 clang 0x00000000007a5c01
15 clang 0x00000000008ffd2f clang::ParseAST(clang::Sema&, bool) + 511
16 clang 0x00000000007a47d4 clang::CodeGenAction::ExecuteAction() + 68
17 clang 0x000000000064b271
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 321
18 clang 0x0000000000634369
clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 1401
19 clang 0x000000000062a339 cc1_main(char const**, char
const**, char const*, void*) + 745
20 clang 0x0000000000633137 main + 7207
21 libc.so.6 0x00007ff3b2155c4d __libc_start_main + 253
22 clang 0x0000000000627d49
Stack dump:
0. Program arguments:
/usr/local/google/asan/asan-llvm-trunk/llvm/build/Release+Asserts/bin/clang
-cc1 -triple i386-unknown-linux-gnu -emit-obj -disable-free
-main-file-name asan_test.cc -mrelocation-model static -masm-verbose
-mconstructor-aliases -target-cpu pentium4 -target-linker-version
2.20.1 -momit-leaf-frame-pointer -g -coverage-file
bin_linux/asan_test32.o -resource-dir
/usr/local/google/asan/asan-llvm-trunk/llvm/build/Release+Asserts/bin/../lib/clang/3.1
-D ASAN_UAR=0 -D ASAN_HAS_EXCEPTIONS=1 -D ASAN_NEEDS_SEGV=1 -D
ASAN_HAS_BLACKLIST=1 -I third_party/googletest/include -I .
-fmodule-cache-path /var/tmp/clang-module-cache -internal-isystem
/usr/lib/gcc/x86_64-linux-gnu/4.4/../../../../include/c++/4.4
-internal-isystem
/usr/lib/gcc/x86_64-linux-gnu/4.4/../../../../include/c++/4.4/x86_64-linux-gnu/32
-internal-isystem
/usr/lib/gcc/x86_64-linux-gnu/4.4/../../../../include/c++/4.4/backward
-internal-isystem /usr/local/include -internal-isystem
/usr/local/google/asan/asan-llvm-trunk/llvm/build/Release+Asserts/bin/../lib/clang/3.1/include
-internal-externc-isystem /usr/include/i486-linux-gnu
-internal-externc-isystem /include -internal-externc-isystem
/usr/include -O2 -Wall -fdeprecated-macro -faddress-sanitizer
-fdebug-compilation-dir
/usr/local/google/asan/asan-llvm-trunk/llvm/projects/compiler-rt/lib/asan
-ferror-limit 19 -fmessage-length 221 -fvisibility hidden
-mstackrealign -fgnu-runtime -fobjc-runtime-has-arc
-fobjc-runtime-has-weak -fobjc-fragile-abi -fcxx-exceptions
-fexceptions -fdiagnostics-show-option -fcolor-diagnostics -mllvm
-asan-blacklist=/usr/local/google/asan/asan-llvm-trunk/llvm/projects/compiler-rt/lib/asan/tests/asan_test.ignore
-mllvm -asan-stack=1 -mllvm -asan-globals=1 -mllvm
-asan-mapping-scale=0 -mllvm -asan-mapping-offset-log=-1 -mllvm
-asan-use-after-return=0 test.ii
1. parser at end of file
2. Per-module optimization passes
3. Running pass 'AddressSanitizer' on module 'test.ii'.
(I'll prepare a smaller reproducer and file a bug soon)
From glider at google.com Mon Jan 23 05:55:07 2012
From: glider at google.com (Alexander Potapenko)
Date: Mon, 23 Jan 2012 15:55:07 +0400
Subject: [llvm-commits] [llvm] r148691 - in /llvm/trunk/lib/VMCore:
Constants.cpp ConstantsContext.h LLVMContextImpl.cpp LLVMContextImpl.h
In-Reply-To:
References: <20120123084239.1B8B62A6C12D@llvm.org>
Message-ID:
On Mon, Jan 23, 2012 at 3:40 PM, Alexander Potapenko wrote:
> Hi Chris,
>
> I believe this patch has broken AddressSanitizer (and probably other patches).
> I get the following error message from clang r148696:
>
s/patches/passes
From geek4civic at gmail.com Mon Jan 23 06:59:32 2012
From: geek4civic at gmail.com (NAKAMURA Takumi)
Date: Mon, 23 Jan 2012 21:59:32 +0900
Subject: [llvm-commits] [llvm] r148691 - in /llvm/trunk/lib/VMCore:
Constants.cpp ConstantsContext.h LLVMContextImpl.cpp LLVMContextImpl.h
In-Reply-To: <20120123084239.1B8B62A6C12D@llvm.org>
References: <20120123084239.1B8B62A6C12D@llvm.org>
Message-ID:
2012/1/23 Chris Lattner :
> Author: lattner
> Date: Mon Jan 23 02:42:38 2012
> New Revision: 148691
>
> URL: http://llvm.org/viewvc/llvm-project?rev=148691&view=rev
> Log:
> Replace a use of ConstantUniqueMap for CAZ constants with a simple DenseMap.
> Now that the type system rewrite has landed, there is no need for its
> complexity and std::map'ness.
>
> Modified:
> ? ?llvm/trunk/lib/VMCore/Constants.cpp
> ? ?llvm/trunk/lib/VMCore/ConstantsContext.h
> ? ?llvm/trunk/lib/VMCore/LLVMContextImpl.cpp
> ? ?llvm/trunk/lib/VMCore/LLVMContextImpl.h
Chris, it broke stage2 build. I am investigating.
...Takumi
From clattner at apple.com Mon Jan 23 09:09:24 2012
From: clattner at apple.com (Chris Lattner)
Date: Mon, 23 Jan 2012 07:09:24 -0800
Subject: [llvm-commits] [llvm] r148691 - in /llvm/trunk/lib/VMCore:
Constants.cpp ConstantsContext.h LLVMContextImpl.cpp LLVMContextImpl.h
In-Reply-To:
References: <20120123084239.1B8B62A6C12D@llvm.org>
Message-ID: <55ABD2F1-7522-485C-8140-62C80C2D8F78@apple.com>
Ah, I forgot that dense map needs to resize at some point. Too bad we done have move semantics to fix this with. I'll correct it sorry for the breakage!
-Chris
On Jan 23, 2012, at 4:59 AM, NAKAMURA Takumi wrote:
> 2012/1/23 Chris Lattner :
>> Author: lattner
>> Date: Mon Jan 23 02:42:38 2012
>> New Revision: 148691
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=148691&view=rev
>> Log:
>> Replace a use of ConstantUniqueMap for CAZ constants with a simple DenseMap.
>> Now that the type system rewrite has landed, there is no need for its
>> complexity and std::map'ness.
>>
>> Modified:
>> llvm/trunk/lib/VMCore/Constants.cpp
>> llvm/trunk/lib/VMCore/ConstantsContext.h
>> llvm/trunk/lib/VMCore/LLVMContextImpl.cpp
>> llvm/trunk/lib/VMCore/LLVMContextImpl.h
>
> Chris, it broke stage2 build. I am investigating.
>
> ...Takumi
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
From glider at google.com Mon Jan 23 09:10:37 2012
From: glider at google.com (Alexander Potapenko)
Date: Mon, 23 Jan 2012 19:10:37 +0400
Subject: [llvm-commits] [llvm] r148691 - in /llvm/trunk/lib/VMCore:
Constants.cpp ConstantsContext.h LLVMContextImpl.cpp LLVMContextImpl.h
In-Reply-To:
References: <20120123084239.1B8B62A6C12D@llvm.org>
Message-ID:
Here's where I got today.
run.sh is a script for multidelta that compiles test.ii with
-faddress-sanitizer (see
http://code.google.com/p/address-sanitizer/wiki/HowToBuild for build
instructions)
On Mon, Jan 23, 2012 at 4:59 PM, NAKAMURA Takumi wrote:
> 2012/1/23 Chris Lattner :
>> Author: lattner
>> Date: Mon Jan 23 02:42:38 2012
>> New Revision: 148691
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=148691&view=rev
>> Log:
>> Replace a use of ConstantUniqueMap for CAZ constants with a simple DenseMap.
>> Now that the type system rewrite has landed, there is no need for its
>> complexity and std::map'ness.
>>
>> Modified:
>> ? ?llvm/trunk/lib/VMCore/Constants.cpp
>> ? ?llvm/trunk/lib/VMCore/ConstantsContext.h
>> ? ?llvm/trunk/lib/VMCore/LLVMContextImpl.cpp
>> ? ?llvm/trunk/lib/VMCore/LLVMContextImpl.h
>
> Chris, it broke stage2 build. I am investigating.
>
> ...Takumi
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
--
Alexander Potapenko
Software Engineer
Google Moscow
-------------- next part --------------
A non-text attachment was scrubbed...
Name: run.sh
Type: application/x-sh
Size: 904 bytes
Desc: not available
Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20120123/634b7329/attachment.sh
-------------- next part --------------
A non-text attachment was scrubbed...
Name: test.ii
Type: application/octet-stream
Size: 12817 bytes
Desc: not available
Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20120123/634b7329/attachment.obj
From sabre at nondot.org Mon Jan 23 09:09:45 2012
From: sabre at nondot.org (Chris Lattner)
Date: Mon, 23 Jan 2012 15:09:45 -0000
Subject: [llvm-commits] [llvm] r148698 - in /llvm/trunk/lib/VMCore:
Constants.cpp ConstantsContext.h LLVMContextImpl.cpp LLVMContextImpl.h
Message-ID: <20120123150945.2C7C52A6C12C@llvm.org>
Author: lattner
Date: Mon Jan 23 09:09:44 2012
New Revision: 148698
URL: http://llvm.org/viewvc/llvm-project?rev=148698&view=rev
Log:
revert r148691 and 148693
Modified:
llvm/trunk/lib/VMCore/Constants.cpp
llvm/trunk/lib/VMCore/ConstantsContext.h
llvm/trunk/lib/VMCore/LLVMContextImpl.cpp
llvm/trunk/lib/VMCore/LLVMContextImpl.h
Modified: llvm/trunk/lib/VMCore/Constants.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Constants.cpp?rev=148698&r1=148697&r2=148698&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/Constants.cpp (original)
+++ llvm/trunk/lib/VMCore/Constants.cpp Mon Jan 23 09:09:44 2012
@@ -993,33 +993,18 @@
//===----------------------------------------------------------------------===//
// Factory Function Implementation
-ConstantAggregateZero *ConstantAggregateZero::get(Type *Ty) {
+ConstantAggregateZero* ConstantAggregateZero::get(Type* Ty) {
assert((Ty->isStructTy() || Ty->isArrayTy() || Ty->isVectorTy()) &&
"Cannot create an aggregate zero of non-aggregate type!");
- OwningPtr &Entry =
- Ty->getContext().pImpl->CAZConstants[Ty];
- if (Entry == 0)
- Entry.reset(new ConstantAggregateZero(Ty));
-
- return Entry.get();
+ LLVMContextImpl *pImpl = Ty->getContext().pImpl;
+ return pImpl->AggZeroConstants.getOrCreate(Ty, 0);
}
/// destroyConstant - Remove the constant from the constant table...
///
void ConstantAggregateZero::destroyConstant() {
- // Drop ownership of the CAZ object before removing the entry so that it
- // doesn't get double deleted.
- LLVMContextImpl::CAZMapTy &CAZConstants = getContext().pImpl->CAZConstants;
- LLVMContextImpl::CAZMapTy::iterator I = CAZConstants.find(getType());
- assert(I != CAZConstants.end() && "CAZ object not in uniquing map");
- I->second.take();
-
- // Actually remove the entry from the DenseMap now, which won't free the
- // constant.
- CAZConstants.erase(I);
-
- // Free the constant and any dangling references to it.
+ getType()->getContext().pImpl->AggZeroConstants.remove(this);
destroyConstantImpl();
}
@@ -1127,29 +1112,13 @@
//
ConstantPointerNull *ConstantPointerNull::get(PointerType *Ty) {
- OwningPtr &Entry =
- Ty->getContext().pImpl->CPNConstants[Ty];
- if (Entry == 0)
- Entry.reset(new ConstantPointerNull(Ty));
-
- return Entry.get();
+ return Ty->getContext().pImpl->NullPtrConstants.getOrCreate(Ty, 0);
}
// destroyConstant - Remove the constant from the constant table...
//
void ConstantPointerNull::destroyConstant() {
- // Drop ownership of the CPN object before removing the entry so that it
- // doesn't get double deleted.
- LLVMContextImpl::CPNMapTy &CPNConstants = getContext().pImpl->CPNConstants;
- LLVMContextImpl::CPNMapTy::iterator I = CPNConstants.find(getType());
- assert(I != CPNConstants.end() && "CPN object not in uniquing map");
- I->second.take();
-
- // Actually remove the entry from the DenseMap now, which won't free the
- // constant.
- CPNConstants.erase(I);
-
- // Free the constant and any dangling references to it.
+ getType()->getContext().pImpl->NullPtrConstants.remove(this);
destroyConstantImpl();
}
@@ -1158,28 +1127,13 @@
//
UndefValue *UndefValue::get(Type *Ty) {
- OwningPtr &Entry = Ty->getContext().pImpl->UVConstants[Ty];
- if (Entry == 0)
- Entry.reset(new UndefValue(Ty));
-
- return Entry.get();
+ return Ty->getContext().pImpl->UndefValueConstants.getOrCreate(Ty, 0);
}
// destroyConstant - Remove the constant from the constant table.
//
void UndefValue::destroyConstant() {
- // Drop ownership of the object before removing the entry so that it
- // doesn't get double deleted.
- LLVMContextImpl::UVMapTy &UVConstants = getContext().pImpl->UVConstants;
- LLVMContextImpl::UVMapTy::iterator I = UVConstants.find(getType());
- assert(I != UVConstants.end() && "UV object not in uniquing map");
- I->second.take();
-
- // Actually remove the entry from the DenseMap now, which won't free the
- // constant.
- UVConstants.erase(I);
-
- // Free the constant and any dangling references to it.
+ getType()->getContext().pImpl->UndefValueConstants.remove(this);
destroyConstantImpl();
}
Modified: llvm/trunk/lib/VMCore/ConstantsContext.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/ConstantsContext.h?rev=148698&r1=148697&r2=148698&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/ConstantsContext.h (original)
+++ llvm/trunk/lib/VMCore/ConstantsContext.h Mon Jan 23 09:09:44 2012
@@ -477,6 +477,13 @@
}
};
+// ConstantAggregateZero does not take extra "value" argument...
+template
+struct ConstantCreator {
+ static ConstantAggregateZero *create(Type *Ty, const ValType &V){
+ return new ConstantAggregateZero(Ty);
+ }
+};
template<>
struct ConstantKeyData {
@@ -491,6 +498,14 @@
};
template<>
+struct ConstantKeyData {
+ typedef char ValType;
+ static ValType getValType(ConstantAggregateZero *C) {
+ return 0;
+ }
+};
+
+template<>
struct ConstantKeyData {
typedef std::vector ValType;
static ValType getValType(ConstantArray *CA) {
@@ -514,6 +529,37 @@
}
};
+// ConstantPointerNull does not take extra "value" argument...
+template
+struct ConstantCreator {
+ static ConstantPointerNull *create(PointerType *Ty, const ValType &V){
+ return new ConstantPointerNull(Ty);
+ }
+};
+
+template<>
+struct ConstantKeyData {
+ typedef char ValType;
+ static ValType getValType(ConstantPointerNull *C) {
+ return 0;
+ }
+};
+
+// UndefValue does not take extra "value" argument...
+template
+struct ConstantCreator {
+ static UndefValue *create(Type *Ty, const ValType &V) {
+ return new UndefValue(Ty);
+ }
+};
+
+template<>
+struct ConstantKeyData {
+ typedef char ValType;
+ static ValType getValType(UndefValue *C) {
+ return 0;
+ }
+};
template<>
struct ConstantCreator {
Modified: llvm/trunk/lib/VMCore/LLVMContextImpl.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/LLVMContextImpl.cpp?rev=148698&r1=148697&r2=148698&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/LLVMContextImpl.cpp (original)
+++ llvm/trunk/lib/VMCore/LLVMContextImpl.cpp Mon Jan 23 09:09:44 2012
@@ -58,8 +58,6 @@
std::vector Modules(OwnedModules.begin(), OwnedModules.end());
DeleteContainerPointers(Modules);
- // Free the constants. This is important to do here to ensure that they are
- // freed before the LeakDetector is torn down.
std::for_each(ExprConstants.map_begin(), ExprConstants.map_end(),
DropReferences());
std::for_each(ArrayConstants.map_begin(), ArrayConstants.map_end(),
@@ -72,9 +70,9 @@
ArrayConstants.freeConstants();
StructConstants.freeConstants();
VectorConstants.freeConstants();
- CAZConstants.clear();
- CPNConstants.clear();
- UVConstants.clear();
+ AggZeroConstants.freeConstants();
+ NullPtrConstants.freeConstants();
+ UndefValueConstants.freeConstants();
InlineAsms.freeConstants();
DeleteContainerSeconds(IntConstants);
DeleteContainerSeconds(FPConstants);
Modified: llvm/trunk/lib/VMCore/LLVMContextImpl.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/LLVMContextImpl.h?rev=148698&r1=148697&r2=148698&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/LLVMContextImpl.h (original)
+++ llvm/trunk/lib/VMCore/LLVMContextImpl.h Mon Jan 23 09:09:44 2012
@@ -27,7 +27,6 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/FoldingSet.h"
-#include "llvm/ADT/OwningPtr.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/StringMap.h"
#include
@@ -139,8 +138,7 @@
// on Context destruction.
SmallPtrSet NonUniquedMDNodes;
- typedef DenseMap > CAZMapTy;
- CAZMapTy CAZConstants;
+ ConstantUniqueMap AggZeroConstants;
typedef ConstantUniqueMap, ArrayRef,
ArrayType, ConstantArray, true /*largekey*/> ArrayConstantsTy;
@@ -154,11 +152,9 @@
VectorType, ConstantVector> VectorConstantsTy;
VectorConstantsTy VectorConstants;
- typedef DenseMap > CPNMapTy;
- CPNMapTy CPNConstants;
-
- typedef DenseMap > UVMapTy;
- UVMapTy UVConstants;
+ ConstantUniqueMap
+ NullPtrConstants;
+ ConstantUniqueMap UndefValueConstants;
DenseMap , BlockAddress*> BlockAddresses;
ConstantUniqueMap
From sabre at nondot.org Mon Jan 23 09:10:41 2012
From: sabre at nondot.org (Chris Lattner)
Date: Mon, 23 Jan 2012 15:10:41 -0000
Subject: [llvm-commits] [llvm] r148699 -
/llvm/trunk/include/llvm/ADT/OwningPtr.h
Message-ID: <20120123151041.82CFF2A6C12C@llvm.org>
Author: lattner
Date: Mon Jan 23 09:10:41 2012
New Revision: 148699
URL: http://llvm.org/viewvc/llvm-project?rev=148699&view=rev
Log:
revert r148688 too, this isn't safe for DenseMap use. When DenseMap resizes, it will need to copy around arbitrary pointers
Modified:
llvm/trunk/include/llvm/ADT/OwningPtr.h
Modified: llvm/trunk/include/llvm/ADT/OwningPtr.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/OwningPtr.h?rev=148699&r1=148698&r2=148699&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/OwningPtr.h (original)
+++ llvm/trunk/include/llvm/ADT/OwningPtr.h Mon Jan 23 09:10:41 2012
@@ -25,15 +25,12 @@
/// pointee object can be taken away from OwningPtr by using the take method.
template
class OwningPtr {
- OwningPtr &operator=(const OwningPtr &); // DO NOT IMPLEMENT
+ OwningPtr(OwningPtr const &); // DO NOT IMPLEMENT
+ OwningPtr &operator=(OwningPtr const &); // DO NOT IMPLEMENT
T *Ptr;
public:
explicit OwningPtr(T *P = 0) : Ptr(P) {}
- OwningPtr(const OwningPtr &RHS) : Ptr(0) {
- assert(RHS.Ptr == 0 && "Only null OwningPtr's are copyable!");
- }
-
~OwningPtr() {
delete Ptr;
}
From sabre at nondot.org Mon Jan 23 09:20:12 2012
From: sabre at nondot.org (Chris Lattner)
Date: Mon, 23 Jan 2012 15:20:12 -0000
Subject: [llvm-commits] [llvm] r148700 - in /llvm/trunk/lib/VMCore:
Constants.cpp ConstantsContext.h LLVMContextImpl.cpp LLVMContextImpl.h
Message-ID: <20120123152012.DE3322A6C12C@llvm.org>
Author: lattner
Date: Mon Jan 23 09:20:12 2012
New Revision: 148700
URL: http://llvm.org/viewvc/llvm-project?rev=148700&view=rev
Log:
convert CAZ, UndefValue, and CPN to use DenseMap's again, this time without
using OwningPtr. OwningPtr would barf when the densemap had to reallocate,
which doesn't appear to happen on the regression test suite, but obviously
happens in real life :)
Modified:
llvm/trunk/lib/VMCore/Constants.cpp
llvm/trunk/lib/VMCore/ConstantsContext.h
llvm/trunk/lib/VMCore/LLVMContextImpl.cpp
llvm/trunk/lib/VMCore/LLVMContextImpl.h
Modified: llvm/trunk/lib/VMCore/Constants.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Constants.cpp?rev=148700&r1=148699&r2=148700&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/Constants.cpp (original)
+++ llvm/trunk/lib/VMCore/Constants.cpp Mon Jan 23 09:20:12 2012
@@ -993,18 +993,21 @@
//===----------------------------------------------------------------------===//
// Factory Function Implementation
-ConstantAggregateZero* ConstantAggregateZero::get(Type* Ty) {
+ConstantAggregateZero *ConstantAggregateZero::get(Type *Ty) {
assert((Ty->isStructTy() || Ty->isArrayTy() || Ty->isVectorTy()) &&
"Cannot create an aggregate zero of non-aggregate type!");
- LLVMContextImpl *pImpl = Ty->getContext().pImpl;
- return pImpl->AggZeroConstants.getOrCreate(Ty, 0);
+ ConstantAggregateZero *&Entry = Ty->getContext().pImpl->CAZConstants[Ty];
+ if (Entry == 0)
+ Entry = new ConstantAggregateZero(Ty);
+
+ return Entry;
}
/// destroyConstant - Remove the constant from the constant table...
///
void ConstantAggregateZero::destroyConstant() {
- getType()->getContext().pImpl->AggZeroConstants.remove(this);
+ getContext().pImpl->CAZConstants.erase(getType());
destroyConstantImpl();
}
@@ -1112,13 +1115,18 @@
//
ConstantPointerNull *ConstantPointerNull::get(PointerType *Ty) {
- return Ty->getContext().pImpl->NullPtrConstants.getOrCreate(Ty, 0);
+ ConstantPointerNull *&Entry = Ty->getContext().pImpl->CPNConstants[Ty];
+ if (Entry == 0)
+ Entry = new ConstantPointerNull(Ty);
+
+ return Entry;
}
// destroyConstant - Remove the constant from the constant table...
//
void ConstantPointerNull::destroyConstant() {
- getType()->getContext().pImpl->NullPtrConstants.remove(this);
+ getContext().pImpl->CPNConstants.erase(getType());
+ // Free the constant and any dangling references to it.
destroyConstantImpl();
}
@@ -1127,13 +1135,18 @@
//
UndefValue *UndefValue::get(Type *Ty) {
- return Ty->getContext().pImpl->UndefValueConstants.getOrCreate(Ty, 0);
+ UndefValue *&Entry = Ty->getContext().pImpl->UVConstants[Ty];
+ if (Entry == 0)
+ Entry = new UndefValue(Ty);
+
+ return Entry;
}
// destroyConstant - Remove the constant from the constant table.
//
void UndefValue::destroyConstant() {
- getType()->getContext().pImpl->UndefValueConstants.remove(this);
+ // Free the constant and any dangling references to it.
+ getContext().pImpl->UVConstants.erase(getType());
destroyConstantImpl();
}
Modified: llvm/trunk/lib/VMCore/ConstantsContext.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/ConstantsContext.h?rev=148700&r1=148699&r2=148700&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/ConstantsContext.h (original)
+++ llvm/trunk/lib/VMCore/ConstantsContext.h Mon Jan 23 09:20:12 2012
@@ -477,13 +477,6 @@
}
};
-// ConstantAggregateZero does not take extra "value" argument...
-template
-struct ConstantCreator {
- static ConstantAggregateZero *create(Type *Ty, const ValType &V){
- return new ConstantAggregateZero(Ty);
- }
-};
template<>
struct ConstantKeyData {
@@ -498,14 +491,6 @@
};
template<>
-struct ConstantKeyData {
- typedef char ValType;
- static ValType getValType(ConstantAggregateZero *C) {
- return 0;
- }
-};
-
-template<>
struct ConstantKeyData {
typedef std::vector ValType;
static ValType getValType(ConstantArray *CA) {
@@ -529,37 +514,6 @@
}
};
-// ConstantPointerNull does not take extra "value" argument...
-template
-struct ConstantCreator {
- static ConstantPointerNull *create(PointerType *Ty, const ValType &V){
- return new ConstantPointerNull(Ty);
- }
-};
-
-template<>
-struct ConstantKeyData {
- typedef char ValType;
- static ValType getValType(ConstantPointerNull *C) {
- return 0;
- }
-};
-
-// UndefValue does not take extra "value" argument...
-template
-struct ConstantCreator {
- static UndefValue *create(Type *Ty, const ValType &V) {
- return new UndefValue(Ty);
- }
-};
-
-template<>
-struct ConstantKeyData {
- typedef char ValType;
- static ValType getValType(UndefValue *C) {
- return 0;
- }
-};
template<>
struct ConstantCreator {
Modified: llvm/trunk/lib/VMCore/LLVMContextImpl.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/LLVMContextImpl.cpp?rev=148700&r1=148699&r2=148700&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/LLVMContextImpl.cpp (original)
+++ llvm/trunk/lib/VMCore/LLVMContextImpl.cpp Mon Jan 23 09:20:12 2012
@@ -58,6 +58,8 @@
std::vector Modules(OwnedModules.begin(), OwnedModules.end());
DeleteContainerPointers(Modules);
+ // Free the constants. This is important to do here to ensure that they are
+ // freed before the LeakDetector is torn down.
std::for_each(ExprConstants.map_begin(), ExprConstants.map_end(),
DropReferences());
std::for_each(ArrayConstants.map_begin(), ArrayConstants.map_end(),
@@ -70,9 +72,9 @@
ArrayConstants.freeConstants();
StructConstants.freeConstants();
VectorConstants.freeConstants();
- AggZeroConstants.freeConstants();
- NullPtrConstants.freeConstants();
- UndefValueConstants.freeConstants();
+ DeleteContainerSeconds(CAZConstants);
+ DeleteContainerSeconds(CPNConstants);
+ DeleteContainerSeconds(UVConstants);
InlineAsms.freeConstants();
DeleteContainerSeconds(IntConstants);
DeleteContainerSeconds(FPConstants);
Modified: llvm/trunk/lib/VMCore/LLVMContextImpl.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/LLVMContextImpl.h?rev=148700&r1=148699&r2=148700&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/LLVMContextImpl.h (original)
+++ llvm/trunk/lib/VMCore/LLVMContextImpl.h Mon Jan 23 09:20:12 2012
@@ -138,7 +138,7 @@
// on Context destruction.
SmallPtrSet NonUniquedMDNodes;
- ConstantUniqueMap AggZeroConstants;
+ DenseMap CAZConstants;
typedef ConstantUniqueMap, ArrayRef,
ArrayType, ConstantArray, true /*largekey*/> ArrayConstantsTy;
@@ -152,9 +152,9 @@
VectorType, ConstantVector> VectorConstantsTy;
VectorConstantsTy VectorConstants;
- ConstantUniqueMap
- NullPtrConstants;
- ConstantUniqueMap UndefValueConstants;
+ DenseMap CPNConstants;
+
+ DenseMap UVConstants;
DenseMap , BlockAddress*> BlockAddresses;
ConstantUniqueMap
From sabre at nondot.org Mon Jan 23 09:24:35 2012
From: sabre at nondot.org (Chris Lattner)
Date: Mon, 23 Jan 2012 07:24:35 -0800
Subject: [llvm-commits] [llvm] r148691 - in /llvm/trunk/lib/VMCore:
Constants.cpp ConstantsContext.h LLVMContextImpl.cpp
LLVMContextImpl.h
In-Reply-To:
References: <20120123084239.1B8B62A6C12D@llvm.org>
Message-ID:
On Jan 23, 2012, at 7:10 AM, Alexander Potapenko wrote:
> Here's where I got today.
> run.sh is a script for multidelta that compiles test.ii with
> -faddress-sanitizer (see
> http://code.google.com/p/address-sanitizer/wiki/HowToBuild for build
> instructions)
Please try with r148700, thanks!
-Chris
>
>
> On Mon, Jan 23, 2012 at 4:59 PM, NAKAMURA Takumi wrote:
>> 2012/1/23 Chris Lattner :
>>> Author: lattner
>>> Date: Mon Jan 23 02:42:38 2012
>>> New Revision: 148691
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=148691&view=rev
>>> Log:
>>> Replace a use of ConstantUniqueMap for CAZ constants with a simple DenseMap.
>>> Now that the type system rewrite has landed, there is no need for its
>>> complexity and std::map'ness.
>>>
>>> Modified:
>>> llvm/trunk/lib/VMCore/Constants.cpp
>>> llvm/trunk/lib/VMCore/ConstantsContext.h
>>> llvm/trunk/lib/VMCore/LLVMContextImpl.cpp
>>> llvm/trunk/lib/VMCore/LLVMContextImpl.h
>>
>> Chris, it broke stage2 build. I am investigating.
>>
>> ...Takumi
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
>
> --
> Alexander Potapenko
> Software Engineer
> Google Moscow
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
From eirc.lew at gmail.com Mon Jan 23 11:07:16 2012
From: eirc.lew at gmail.com (eirc.lew at gmail.com)
Date: Mon, 23 Jan 2012 12:07:16 -0500
Subject: [llvm-commits] FW: static taint analysis in LLVM
Message-ID: <4f1d93c6.5121e00a.7716.6f4a@mx.google.com>
Hi, All
I want to know if LLVM support static taint analysis ? if it can, does it support interprocedural taint anslysis ?
Thanks in advance!
Xingjing Lu
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20120123/85153e34/attachment.html
From stoklund at 2pi.dk Mon Jan 23 12:35:32 2012
From: stoklund at 2pi.dk (Jakob Stoklund Olesen)
Date: Mon, 23 Jan 2012 10:35:32 -0800
Subject: [llvm-commits] [llvm] r147286 - in /llvm/trunk:
lib/Transforms/Utils/SimplifyCFG.cpp
test/Transforms/SimplifyCFG/preserve-branchweights.ll
In-Reply-To: <4F1CE13B.2090908@mxc.ca>
References: <20111227043152.F2AE42A6C12C@llvm.org>
<4F1CE13B.2090908@mxc.ca>
Message-ID: <2D02DA62-8677-4481-8127-9952932D187C@2pi.dk>
On Jan 22, 2012, at 8:25 PM, Nick Lewycky wrote:
> So, I've tried to implement this and ended up with the patch attached. Any suggestions for improvement would be appreciated.
Thanks, Nick. The patch looks good to me.
BTW, are you actually benefiting from computing everything in APInt? We know the ranges of these values.
> You still need the GCD stuff, otherwise you could end up with branch weights 'i32 5', 'i32 5'. That might be legal, but it's certainly not optimal.
I don't think it actually hurts, but you get some really weird rounding behavior based on number theoretic happenstance.
These weights really should have been floats, but we had to approximate with ints because we need reproducible results across platforms. They are approximations of real numbers, they are not intended as 'mathematical integers'.
Let me put it this way: If the weights were floats, would you be computing the GCD of the mantissas?
/jakob
From dpatel at apple.com Mon Jan 23 12:31:58 2012
From: dpatel at apple.com (Devang Patel)
Date: Mon, 23 Jan 2012 18:31:58 -0000
Subject: [llvm-commits] [llvm] r148712 - in /llvm/trunk:
lib/Target/X86/AsmParser/X86AsmParser.cpp test/MC/X86/intel-syntax.s
Message-ID: <20120123183159.09D092A6C12C@llvm.org>
Author: dpatel
Date: Mon Jan 23 12:31:58 2012
New Revision: 148712
URL: http://llvm.org/viewvc/llvm-project?rev=148712&view=rev
Log:
Intel syntax: Parse segment registers.
Modified:
llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
llvm/trunk/test/MC/X86/intel-syntax.s
Modified: llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp?rev=148712&r1=148711&r2=148712&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original)
+++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Mon Jan 23 12:31:58 2012
@@ -54,7 +54,7 @@
X86Operand *ParseATTOperand();
X86Operand *ParseIntelOperand();
X86Operand *ParseIntelMemOperand();
- X86Operand *ParseIntelBracExpression(unsigned Size);
+ X86Operand *ParseIntelBracExpression(unsigned SegReg, unsigned Size);
X86Operand *ParseMemOperand(unsigned SegReg, SMLoc StartLoc);
bool ParseDirectiveWord(unsigned Size, SMLoc L);
@@ -593,8 +593,9 @@
return Size;
}
-X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned Size) {
- unsigned SegReg = 0, BaseReg = 0, IndexReg = 0, Scale = 1;
+X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg,
+ unsigned Size) {
+ unsigned BaseReg = 0, IndexReg = 0, Scale = 1;
SMLoc Start = Parser.getTok().getLoc(), End;
const MCExpr *Disp = MCConstantExpr::Create(0, getParser().getContext());
@@ -669,6 +670,7 @@
X86Operand *X86AsmParser::ParseIntelMemOperand() {
const AsmToken &Tok = Parser.getTok();
SMLoc Start = Parser.getTok().getLoc(), End;
+ unsigned SegReg = 0;
unsigned Size = getIntelMemOperandSize(Tok.getString());
if (Size) {
@@ -678,7 +680,17 @@
}
if (getLexer().is(AsmToken::LBrac))
- return ParseIntelBracExpression(Size);
+ return ParseIntelBracExpression(SegReg, Size);
+
+ if (!ParseRegister(SegReg, Start, End)) {
+ // Handel SegReg : [ ... ]
+ if (getLexer().isNot(AsmToken::Colon))
+ return ErrorOperand(Start, "Expected ':' token!");
+ Parser.Lex(); // Eat :
+ if (getLexer().isNot(AsmToken::LBrac))
+ return ErrorOperand(Start, "Expected '[' token!");
+ return ParseIntelBracExpression(SegReg, Size);
+ }
const MCExpr *Disp = MCConstantExpr::Create(0, getParser().getContext());
if (getParser().ParseExpression(Disp, End)) return 0;
Modified: llvm/trunk/test/MC/X86/intel-syntax.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/intel-syntax.s?rev=148712&r1=148711&r2=148712&view=diff
==============================================================================
--- llvm/trunk/test/MC/X86/intel-syntax.s (original)
+++ llvm/trunk/test/MC/X86/intel-syntax.s Mon Jan 23 12:31:58 2012
@@ -55,4 +55,6 @@
and rax, -257
// CHECK: fld %st(0)
fld ST(0)
+// CHECK: movl %fs:(%rdi), %eax
+mov EAX, DWORD PTR FS:[RDI]
ret
From grosbach at apple.com Mon Jan 23 12:37:41 2012
From: grosbach at apple.com (Jim Grosbach)
Date: Mon, 23 Jan 2012 10:37:41 -0800
Subject: [llvm-commits] [llvm] r148653 - in /llvm/trunk:
include/llvm/Object/ObjectFile.h include/llvm/Support/Endian.h
lib/Object/ELFObjectFile.cpp
In-Reply-To: <20120122090104.4CD0B2A6C12C@llvm.org>
References: <20120122090104.4CD0B2A6C12C@llvm.org>
Message-ID: <14B0BD87-2FF4-417D-B932-3F18E7E939B4@apple.com>
Hi Eli,
This patch uses std::vector quite a lot. Have you considered SmallVector? It seems likely that may be a better fit in at least some cases.
-Jim
On Jan 22, 2012, at 1:01 AM, Eli Bendersky wrote:
> Author: eliben
> Date: Sun Jan 22 03:01:03 2012
> New Revision: 148653
>
> URL: http://llvm.org/viewvc/llvm-project?rev=148653&view=rev
> Log:
> Basic runtime dynamic loading capabilities added to ELFObjectFile, implemented
> in a subclass named DyldELFObject. This class supports rebasing the object file
> it represents by re-mapping section addresses to the actual memory addresses
> the object was placed in. This is required for MC-JIT implementation on ELF with
> debugging support.
>
> Patch reviewed on llvm-commits.
>
> Developed together with Ashok Thirumurthi and Andrew Kaylor.
>
>
> Modified:
> llvm/trunk/include/llvm/Object/ObjectFile.h
> llvm/trunk/include/llvm/Support/Endian.h
> llvm/trunk/lib/Object/ELFObjectFile.cpp
>
> Modified: llvm/trunk/include/llvm/Object/ObjectFile.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ObjectFile.h?rev=148653&r1=148652&r2=148653&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/ObjectFile.h (original)
> +++ llvm/trunk/include/llvm/Object/ObjectFile.h Sun Jan 22 03:01:03 2012
> @@ -20,6 +20,7 @@
> #include "llvm/Support/ErrorHandling.h"
> #include "llvm/Support/MemoryBuffer.h"
> #include
> +#include
>
> namespace llvm {
> namespace object {
> @@ -337,7 +338,8 @@
>
> public:
> static ObjectFile *createCOFFObjectFile(MemoryBuffer *Object);
> - static ObjectFile *createELFObjectFile(MemoryBuffer *Object);
> + static ObjectFile *createELFObjectFile(MemoryBuffer *Object,
> + bool doDyld = false, std::vector *MemoryMap = 0);
> static ObjectFile *createMachOObjectFile(MemoryBuffer *Object);
> };
>
>
> Modified: llvm/trunk/include/llvm/Support/Endian.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Endian.h?rev=148653&r1=148652&r2=148653&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/Endian.h (original)
> +++ llvm/trunk/include/llvm/Support/Endian.h Sun Jan 22 03:01:03 2012
> @@ -98,6 +98,9 @@
> operator value_type() const {
> return endian::read_le(Value);
> }
> + void operator=(value_type newValue) {
> + endian::write_le((void *)&Value, newValue);
> + }
> private:
> uint8_t Value[sizeof(value_type)];
> };
> @@ -108,6 +111,9 @@
> operator value_type() const {
> return endian::read_be(Value);
> }
> + void operator=(value_type newValue) {
> + endian::write_be((void *)&Value, newValue);
> + }
> private:
> uint8_t Value[sizeof(value_type)];
> };
> @@ -118,6 +124,9 @@
> operator value_type() const {
> return endian::read_le(&Value);
> }
> + void operator=(value_type newValue) {
> + endian::write_le((void *)&Value, newValue);
> + }
> private:
> value_type Value;
> };
> @@ -128,6 +137,9 @@
> operator value_type() const {
> return endian::read_be(&Value);
> }
> + void operator=(value_type newValue) {
> + endian::write_be((void *)&Value, newValue);
> + }
> private:
> value_type Value;
> };
>
> Modified: llvm/trunk/lib/Object/ELFObjectFile.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/ELFObjectFile.cpp?rev=148653&r1=148652&r2=148653&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Object/ELFObjectFile.cpp (original)
> +++ llvm/trunk/lib/Object/ELFObjectFile.cpp Sun Jan 22 03:01:03 2012
> @@ -7,7 +7,7 @@
> //
> //===----------------------------------------------------------------------===//
> //
> -// This file defines the ELFObjectFile class.
> +// This file defines the ELFObjectFile and DyldELFObject classes.
> //
> //===----------------------------------------------------------------------===//
>
> @@ -16,6 +16,7 @@
> #include "llvm/ADT/Triple.h"
> #include "llvm/ADT/DenseMap.h"
> #include "llvm/Object/ObjectFile.h"
> +#include "llvm/Support/Casting.h"
> #include "llvm/Support/ELF.h"
> #include "llvm/Support/Endian.h"
> #include "llvm/Support/ErrorHandling.h"
> @@ -53,20 +54,22 @@
> template
> struct ELFDataTypeTypedefHelper
> : ELFDataTypeTypedefHelperCommon {
> + typedef uint32_t value_type;
> typedef support::detail::packed_endian_specific_integral
> - Elf_Addr;
> + Elf_Addr;
> typedef support::detail::packed_endian_specific_integral
> - Elf_Off;
> + Elf_Off;
> };
>
> /// ELF 64bit types.
> template
> struct ELFDataTypeTypedefHelper
> : ELFDataTypeTypedefHelperCommon{
> + typedef uint64_t value_type;
> typedef support::detail::packed_endian_specific_integral
> - Elf_Addr;
> + Elf_Addr;
> typedef support::detail::packed_endian_specific_integral
> - Elf_Off;
> + Elf_Off;
> };
> }
>
> @@ -263,6 +266,7 @@
> typedef Elf_Rel_Impl Elf_Rel;
> typedef Elf_Rel_Impl Elf_Rela;
>
> +protected:
> struct Elf_Ehdr {
> unsigned char e_ident[ELF::EI_NIDENT]; // ELF Identification bytes
> Elf_Half e_type; // Type of file (see ET_*)
> @@ -285,7 +289,12 @@
> unsigned char getFileClass() const { return e_ident[ELF::EI_CLASS]; }
> unsigned char getDataEncoding() const { return e_ident[ELF::EI_DATA]; }
> };
> + // This flag is used for classof, to distinguish ELFObjectFile from
> + // its subclass. If more subclasses will be created, this flag will
> + // have to become an enum.
> + bool isDyldELFObject;
>
> +private:
> typedef SmallVector Sections_t;
> typedef DenseMap IndexMap_t;
> typedef DenseMap > RelocMap_t;
> @@ -307,13 +316,11 @@
> return getSection(Rel.w.b);
> }
>
> - void validateSymbol(DataRefImpl Symb) const;
> bool isRelocationHasAddend(DataRefImpl Rel) const;
> template
> const T *getEntry(uint16_t Section, uint32_t Entry) const;
> template
> const T *getEntry(const Elf_Shdr *Section, uint32_t Entry) const;
> - const Elf_Sym *getSymbol(DataRefImpl Symb) const;
> const Elf_Shdr *getSection(DataRefImpl index) const;
> const Elf_Shdr *getSection(uint32_t index) const;
> const Elf_Rel *getRel(DataRefImpl Rel) const;
> @@ -323,6 +330,10 @@
> error_code getSymbolName(const Elf_Sym *Symb, StringRef &Res) const;
>
> protected:
> + const Elf_Sym *getSymbol(DataRefImpl Symb) const; // FIXME: Should be private?
> + void validateSymbol(DataRefImpl Symb) const;
> +
> +protected:
> virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const;
> virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const;
> virtual error_code getSymbolFileOffset(DataRefImpl Symb, uint64_t &Res) const;
> @@ -384,8 +395,10 @@
> ELF::Elf64_Word getSymbolTableIndex(const Elf_Sym *symb) const;
> const Elf_Shdr *getSection(const Elf_Sym *symb) const;
>
> + // Methods for type inquiry through isa, cast, and dyn_cast
> + bool isDyldType() const { return isDyldELFObject; }
> static inline bool classof(const Binary *v) {
> - return v->getType() == isELF;
> + return v->getType() == Binary::isELF;
> }
> static inline bool classof(const ELFObjectFile *v) { return true; }
> };
> @@ -471,7 +484,7 @@
> const Elf_Shdr *Section;
> switch (getSymbolTableIndex(symb)) {
> case ELF::SHN_COMMON:
> - // Undefined symbols have no address yet.
> + // Unintialized symbols have no offset in the object file
> case ELF::SHN_UNDEF:
> Result = UnknownAddressOrSize;
> return object_error::success;
> @@ -489,7 +502,7 @@
> case ELF::STT_OBJECT:
> case ELF::STT_NOTYPE:
> Result = symb->st_value +
> - (Section ? Section->sh_offset - Section->sh_addr : 0);
> + (Section ? Section->sh_offset : 0);
> return object_error::success;
> default:
> Result = UnknownAddressOrSize;
> @@ -506,7 +519,6 @@
> const Elf_Shdr *Section;
> switch (getSymbolTableIndex(symb)) {
> case ELF::SHN_COMMON:
> - // Undefined symbols have no address yet.
> case ELF::SHN_UNDEF:
> Result = UnknownAddressOrSize;
> return object_error::success;
> @@ -523,7 +535,7 @@
> case ELF::STT_FUNC:
> case ELF::STT_OBJECT:
> case ELF::STT_NOTYPE:
> - Result = symb->st_value;
> + Result = symb->st_value + (Section ? Section->sh_addr : 0);
> return object_error::success;
> default:
> Result = UnknownAddressOrSize;
> @@ -1157,6 +1169,7 @@
> ELFObjectFile::ELFObjectFile(MemoryBuffer *Object
> , error_code &ec)
> : ObjectFile(Binary::isELF, Object, ec)
> + , isDyldELFObject(false)
> , SectionHeaderTable(0)
> , dot_shstrtab_sec(0)
> , dot_strtab_sec(0) {
> @@ -1168,10 +1181,12 @@
> SectionHeaderTable =
> reinterpret_cast(base() + Header->e_shoff);
> uint64_t SectionTableSize = getNumSections() * Header->e_shentsize;
> - if (!( (const uint8_t *)SectionHeaderTable + SectionTableSize
> - <= base() + Data->getBufferSize()))
> +
> + if ((const uint8_t *)SectionHeaderTable + SectionTableSize
> + > base() + Data->getBufferSize()) {
> // FIXME: Proper error handling.
> report_fatal_error("Section table goes past end of file!");
> + }
>
>
> // To find the symbol tables we walk the section table to find SHT_SYMTAB.
> @@ -1466,21 +1481,226 @@
> , (uint8_t)Object->getBufferStart()[ELF::EI_DATA]);
> }
>
> +
> +namespace {
> + template
> + class DyldELFObject : public ELFObjectFile {
> + LLVM_ELF_IMPORT_TYPES(target_endianness, is64Bits)
> +
> + typedef Elf_Shdr_Impl Elf_Shdr;
> + typedef Elf_Sym_Impl Elf_Sym;
> + typedef Elf_Rel_Impl Elf_Rel;
> + typedef Elf_Rel_Impl Elf_Rela;
> +
> + typedef typename ELFObjectFile::
> + Elf_Ehdr Elf_Ehdr;
> + Elf_Ehdr *Header;
> +
> + // Update section headers according to the current location in memory
> + virtual void rebaseObject(std::vector *MemoryMap);
> + // Record memory addresses for cleanup
> + virtual void saveAddress(std::vector *MemoryMap, uint8_t *addr);
> +
> + protected:
> + virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const;
> +
> + public:
> + DyldELFObject(MemoryBuffer *Object, std::vector *MemoryMap,
> + error_code &ec);
> +
> + // Methods for type inquiry through isa, cast, and dyn_cast
> + static inline bool classof(const Binary *v) {
> + return (isa >(v)
> + && classof(cast >(v)));
> + }
> + static inline bool classof(
> + const ELFObjectFile *v) {
> + return v->isDyldType();
> + }
> + static inline bool classof(const DyldELFObject *v) {
> + return true;
> + }
> + };
> +} // end anonymous namespace
> +
> +template
> +DyldELFObject::DyldELFObject(MemoryBuffer *Object,
> + std::vector *MemoryMap, error_code &ec)
> + : ELFObjectFile(Object, ec)
> + , Header(0) {
> + this->isDyldELFObject = true;
> + Header = const_cast(
> + reinterpret_cast(this->base()));
> + if (Header->e_shoff == 0)
> + return;
> +
> + // Mark the image as a dynamic shared library
> + Header->e_type = ELF::ET_DYN;
> +
> + rebaseObject(MemoryMap);
> +}
> +
> +// Walk through the ELF headers, updating virtual addresses to reflect where
> +// the object is currently loaded in memory
> +template
> +void DyldELFObject::rebaseObject(
> + std::vector *MemoryMap) {
> + typedef typename ELFDataTypeTypedefHelper<
> + target_endianness, is64Bits>::value_type addr_type;
> +
> + uint8_t *base_p = const_cast(this->base());
> + Elf_Shdr *sectionTable =
> + reinterpret_cast(base_p + Header->e_shoff);
> + uint64_t numSections = this->getNumSections();
> +
> + // Allocate memory space for NOBITS sections (such as .bss), which only exist
> + // in memory, but don't occupy space in the object file.
> + // Update the address in the section headers to reflect this allocation.
> + for (uint64_t index = 0; index < numSections; index++) {
> + Elf_Shdr *sec = reinterpret_cast(
> + reinterpret_cast(sectionTable) + index * Header->e_shentsize);
> +
> + // Only update sections that are meant to be present in program memory
> + if (sec->sh_flags & ELF::SHF_ALLOC) {
> + uint8_t *addr = base_p + sec->sh_offset;
> + if (sec->sh_type == ELF::SHT_NOBITS) {
> + addr = static_cast(calloc(sec->sh_size, 1));
> + saveAddress(MemoryMap, addr);
> + }
> + else {
> + // FIXME: Currently memory with RWX permissions is allocated. In the
> + // future, make sure that permissions are as necessary
> + if (sec->sh_flags & ELF::SHF_WRITE) {
> + // see FIXME above
> + }
> + if (sec->sh_flags & ELF::SHF_EXECINSTR) {
> + // see FIXME above
> + }
> + }
> + assert(sizeof(addr_type) == sizeof(intptr_t) &&
> + "Cross-architecture ELF dy-load is not supported!");
> + sec->sh_addr = static_cast(intptr_t(addr));
> + }
> + }
> +
> + // Now allocate actual space for COMMON symbols, which also don't occupy
> + // space in the object file.
> + // We want to allocate space for all COMMON symbols at once, so the flow is:
> + // 1. Go over all symbols, find those that are in COMMON. For each such
> + // symbol, record its size and the value field in its symbol header in a
> + // special vector.
> + // 2. Allocate memory for all COMMON symbols in one fell swoop.
> + // 3. Using the recorded information from (1), update the address fields in
> + // the symbol headers of the COMMON symbols to reflect their allocated
> + // address.
> + uint64_t TotalSize = 0;
> + std::vector > SymbAddrInfo;
> + error_code ec = object_error::success;
> + for (symbol_iterator si = this->begin_symbols(),
> + se = this->end_symbols(); si != se; si.increment(ec)) {
> + uint64_t Size = 0;
> + ec = si->getSize(Size);
> + Elf_Sym* symb = const_cast(
> + this->getSymbol(si->getRawDataRefImpl()));
> + if (ec == object_error::success &&
> + this->getSymbolTableIndex(symb) == ELF::SHN_COMMON && Size > 0) {
> + SymbAddrInfo.push_back(std::make_pair(&(symb->st_value), Size));
> + TotalSize += Size;
> + }
> + }
> +
> + uint8_t* SectionPtr = (uint8_t *)calloc(TotalSize, 1);
> + saveAddress(MemoryMap, SectionPtr);
> +
> + typedef typename std::vector >::iterator
> + AddrInfoIterator;
> + AddrInfoIterator EndIter = SymbAddrInfo.end();
> + for (AddrInfoIterator AddrIter = SymbAddrInfo.begin();
> + AddrIter != EndIter; ++AddrIter) {
> + assert(sizeof(addr_type) == sizeof(intptr_t) &&
> + "Cross-architecture ELF dy-load is not supported!");
> + *(AddrIter->first) = static_cast(intptr_t(SectionPtr));
> + SectionPtr += AddrIter->second;
> + }
> +}
> +
> +// Record memory addresses for callers
> +template
> +void DyldELFObject::saveAddress(
> + std::vector *MemoryMap, uint8_t* addr) {
> + if (MemoryMap)
> + MemoryMap->push_back(addr);
> + else
> + errs() << "WARNING: Memory leak - cannot record memory for ELF dyld.";
> +}
> +
> +template
> +error_code DyldELFObject::getSymbolAddress(
> + DataRefImpl Symb, uint64_t &Result) const {
> + this->validateSymbol(Symb);
> + const Elf_Sym *symb = this->getSymbol(Symb);
> + if (this->getSymbolTableIndex(symb) == ELF::SHN_COMMON) {
> + Result = symb->st_value;
> + return object_error::success;
> + }
> + else {
> + return ELFObjectFile::getSymbolAddress(
> + Symb, Result);
> + }
> +}
> +
> namespace llvm {
>
> - ObjectFile *ObjectFile::createELFObjectFile(MemoryBuffer *Object) {
> + // Creates an in-memory object-file by default: createELFObjectFile(Buffer)
> + // Set doDyld to true to create a live (executable/debug-worthy) image
> + // If doDyld is true, any memory allocated for non-resident sections and
> + // symbols is recorded in MemoryMap.
> + ObjectFile *ObjectFile::createELFObjectFile(MemoryBuffer *Object,
> + bool doDyld, std::vector *MemoryMap) {
> std::pair Ident = getElfArchType(Object);
> error_code ec;
> +
> + if (doDyld) {
> + if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2LSB)
> + return new DyldELFObject(Object, MemoryMap, ec);
> + else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB)
> + return new DyldELFObject(Object, MemoryMap, ec);
> + else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB)
> + return new DyldELFObject(Object, MemoryMap, ec);
> + else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) {
> + DyldELFObject *result =
> + new DyldELFObject(Object, MemoryMap, ec);
> +
> + // Unit testing for type inquiry
> + bool isBinary = isa(result);
> + bool isDyld = isa >(result);
> + bool isFile = isa >(result);
> + assert(isBinary && isDyld && isFile &&
> + "Type inquiry failed for ELF object!");
> + return result;
> + }
> + }
> +
> if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2LSB)
> return new ELFObjectFile(Object, ec);
> else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB)
> return new ELFObjectFile(Object, ec);
> - else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB)
> - return new ELFObjectFile(Object, ec);
> else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB)
> return new ELFObjectFile(Object, ec);
> - // FIXME: Proper error handling.
> - report_fatal_error("Not an ELF object file!");
> + else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) {
> + ELFObjectFile *result =
> + new ELFObjectFile(Object, ec);
> +
> + // Unit testing for type inquiry
> + bool isBinary = isa(result);
> + bool isDyld = isa >(result);
> + bool isFile = isa >(result);
> + assert(isBinary && isFile && !isDyld &&
> + "Type inquiry failed for ELF object!");
> + return result;
> + }
> +
> + report_fatal_error("Buffer is not an ELF object file!");
> }
>
> } // end namespace llvm
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
From kcc at google.com Mon Jan 23 12:44:35 2012
From: kcc at google.com (Kostya Serebryany)
Date: Mon, 23 Jan 2012 18:44:35 -0000
Subject: [llvm-commits] [compiler-rt] r148714 - in
/compiler-rt/trunk/lib/asan/tests: deep_tail_call.cc deep_tail_call.tmpl
test_output.sh
Message-ID: <20120123184435.432DE2A6C12C@llvm.org>
Author: kcc
Date: Mon Jan 23 12:44:34 2012
New Revision: 148714
URL: http://llvm.org/viewvc/llvm-project?rev=148714&view=rev
Log:
[asan] test that -fno-optimize-sibling-calls helps to get sane stack traces
Added:
compiler-rt/trunk/lib/asan/tests/deep_tail_call.cc
compiler-rt/trunk/lib/asan/tests/deep_tail_call.tmpl
Modified:
compiler-rt/trunk/lib/asan/tests/test_output.sh
Added: compiler-rt/trunk/lib/asan/tests/deep_tail_call.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/tests/deep_tail_call.cc?rev=148714&view=auto
==============================================================================
--- compiler-rt/trunk/lib/asan/tests/deep_tail_call.cc (added)
+++ compiler-rt/trunk/lib/asan/tests/deep_tail_call.cc Mon Jan 23 12:44:34 2012
@@ -0,0 +1,13 @@
+int global[10];
+__attribute__((noinline))
+void call4(int i) { global[i+10]++; }
+__attribute__((noinline))
+void call3(int i) { call4(i); }
+__attribute__((noinline))
+void call2(int i) { call3(i); }
+__attribute__((noinline))
+void call1(int i) { call2(i); }
+int main(int argc, char **argv) {
+ call1(argc);
+ return global[0];
+}
Added: compiler-rt/trunk/lib/asan/tests/deep_tail_call.tmpl
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/tests/deep_tail_call.tmpl?rev=148714&view=auto
==============================================================================
--- compiler-rt/trunk/lib/asan/tests/deep_tail_call.tmpl (added)
+++ compiler-rt/trunk/lib/asan/tests/deep_tail_call.tmpl Mon Jan 23 12:44:34 2012
@@ -0,0 +1,6 @@
+AddressSanitizer global-buffer-overflow
+ #0.*call4
+ #1.*call3
+ #2.*call2
+ #3.*call1
+ #4.*main
Modified: compiler-rt/trunk/lib/asan/tests/test_output.sh
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/tests/test_output.sh?rev=148714&r1=148713&r2=148714&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/tests/test_output.sh (original)
+++ compiler-rt/trunk/lib/asan/tests/test_output.sh Mon Jan 23 12:44:34 2012
@@ -5,7 +5,7 @@
OS=`uname`
CXX=$1
CC=$2
-CXXFLAGS="-mno-omit-leaf-frame-pointer -fno-omit-frame-pointer"
+CXXFLAGS="-mno-omit-leaf-frame-pointer -fno-omit-frame-pointer -fno-optimize-sibling-calls"
SYMBOLIZER=../scripts/asan_symbolize.py
C_TEST=use-after-free
From matthewbg at google.com Mon Jan 23 12:46:04 2012
From: matthewbg at google.com (Matt Beaumont-Gay)
Date: Mon, 23 Jan 2012 18:46:04 -0000
Subject: [llvm-commits] [llvm] r148715 -
/llvm/trunk/lib/Object/ELFObjectFile.cpp
Message-ID: <20120123184604.9348B2A6C12C@llvm.org>
Author: matthewbg
Date: Mon Jan 23 12:46:04 2012
New Revision: 148715
URL: http://llvm.org/viewvc/llvm-project?rev=148715&view=rev
Log:
Silence warnings in -asserts build
Modified:
llvm/trunk/lib/Object/ELFObjectFile.cpp
Modified: llvm/trunk/lib/Object/ELFObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/ELFObjectFile.cpp?rev=148715&r1=148714&r2=148715&view=diff
==============================================================================
--- llvm/trunk/lib/Object/ELFObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/ELFObjectFile.cpp Mon Jan 23 12:46:04 2012
@@ -1675,6 +1675,9 @@
bool isBinary = isa(result);
bool isDyld = isa >(result);
bool isFile = isa >(result);
+ (void)isBinary;
+ (void)isDyld;
+ (void)isFile;
assert(isBinary && isDyld && isFile &&
"Type inquiry failed for ELF object!");
return result;
@@ -1695,6 +1698,9 @@
bool isBinary = isa(result);
bool isDyld = isa >(result);
bool isFile = isa >(result);
+ (void)isBinary;
+ (void)isDyld;
+ (void)isFile;
assert(isBinary && isFile && !isDyld &&
"Type inquiry failed for ELF object!");
return result;
From kcc at google.com Mon Jan 23 13:02:58 2012
From: kcc at google.com (Kostya Serebryany)
Date: Mon, 23 Jan 2012 11:02:58 -0800
Subject: [llvm-commits] fix the MSVC warning in include/llvm-c/Core.h
Message-ID:
My previous change in include/llvm-c/Core.h that introduced 64-bit
Attributes (r148553) caused a warning
while building with MSVC. http://llvm.org/bugs/show_bug.cgi?id=11828
The following patch fixes the problem (use "static const uint64_t" instead
of enum).
Ok to commit?
--kcc
Index: include/llvm-c/Core.h
===================================================================
--- include/llvm-c/Core.h (revision 148708)
+++ include/llvm-c/Core.h (working copy)
@@ -92,7 +92,7 @@
/** Used to get the users and usees of a Value. See the llvm::Use class. */
typedef struct LLVMOpaqueUse *LLVMUseRef;
-typedef enum {
+static const uint64_t
LLVMZExtAttribute = 1<<0,
LLVMSExtAttribute = 1<<1,
LLVMNoReturnAttribute = 1<<2,
@@ -119,8 +119,8 @@
LLVMReturnsTwice = 1 << 29,
LLVMUWTable = 1 << 30,
LLVMNonLazyBind = 1U << 31,
- LLVMAddressSafety = 1ULL << 32
-} LLVMAttribute;
+ LLVMAddressSafety = 1ULL << 32;
+typedef uint64_t LLVMAttribute;
typedef enum {
/* Terminator Instructions */
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20120123/9b5ffec8/attachment.html
From grosbach at apple.com Mon Jan 23 13:39:08 2012
From: grosbach at apple.com (Jim Grosbach)
Date: Mon, 23 Jan 2012 19:39:08 -0000
Subject: [llvm-commits] [llvm] r148718 - in /llvm/trunk:
lib/Target/ARM/ARMInstrFormats.td lib/Target/ARM/ARMInstrNEON.td
lib/Target/ARM/AsmParser/ARMAsmParser.cpp test/MC/ARM/neon-vst-encoding.s
Message-ID: <20120123193909.12F072A6C12C@llvm.org>
Author: grosbach
Date: Mon Jan 23 13:39:08 2012
New Revision: 148718
URL: http://llvm.org/viewvc/llvm-project?rev=148718&view=rev
Log:
Simplify some NEON assembly pseudo definitions.
Let the generic token alias definitions handle the data subtype
suffices. We don't need explicit versions for each.
Modified:
llvm/trunk/lib/Target/ARM/ARMInstrFormats.td
llvm/trunk/lib/Target/ARM/ARMInstrNEON.td
llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
llvm/trunk/test/MC/ARM/neon-vst-encoding.s
Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrFormats.td?rev=148718&r1=148717&r2=148718&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMInstrFormats.td (original)
+++ llvm/trunk/lib/Target/ARM/ARMInstrFormats.td Mon Jan 23 13:39:08 2012
@@ -2029,75 +2029,6 @@
// for instalias defs.
class NEONDataTypeAsmPseudoInst :
AsmPseudoInst, Requires<[HasNEON]>;
-multiclass NEONDT8ReqAsmPseudoInst {
- def I8 : NEONDataTypeAsmPseudoInst;
- def S8 : NEONDataTypeAsmPseudoInst;
- def U8 : NEONDataTypeAsmPseudoInst;
- def P8 : NEONDataTypeAsmPseudoInst;
-}
-// NEONDT8ReqAsmPseudoInst plus plain ".8"
-multiclass NEONDT8AsmPseudoInst {
- def _8 : NEONDataTypeAsmPseudoInst;
- defm _ : NEONDT8ReqAsmPseudoInst;
-}
-multiclass NEONDT16ReqAsmPseudoInst {
- def I16 : NEONDataTypeAsmPseudoInst;
- def S16 : NEONDataTypeAsmPseudoInst;
- def U16 : NEONDataTypeAsmPseudoInst;
- def P16 : NEONDataTypeAsmPseudoInst;
-}
-// NEONDT16ReqAsmPseudoInst plus plain ".16"
-multiclass NEONDT16AsmPseudoInst {
- def _16 : NEONDataTypeAsmPseudoInst;
- defm _ : NEONDT16ReqAsmPseudoInst;
-}
-multiclass NEONDT32ReqAsmPseudoInst {
- def I32 : NEONDataTypeAsmPseudoInst;
- def S32 : NEONDataTypeAsmPseudoInst;
- def U32 : NEONDataTypeAsmPseudoInst;
- def F32 : NEONDataTypeAsmPseudoInst;
- def F : NEONDataTypeAsmPseudoInst;
-}
-// NEONDT32ReqAsmPseudoInst plus plain ".32"
-multiclass NEONDT32AsmPseudoInst {
- def _32 : NEONDataTypeAsmPseudoInst;
- defm _ : NEONDT32ReqAsmPseudoInst;
-}
-multiclass NEONDT64ReqAsmPseudoInst {
- def I64 : NEONDataTypeAsmPseudoInst;
- def S64 : NEONDataTypeAsmPseudoInst;
- def U64 : NEONDataTypeAsmPseudoInst;
- def F64 : NEONDataTypeAsmPseudoInst;
- def D : NEONDataTypeAsmPseudoInst;
-}
-// NEONDT64ReqAsmPseudoInst plus plain ".64"
-multiclass NEONDT64AsmPseudoInst {
- def _64 : NEONDataTypeAsmPseudoInst;
- defm _ : NEONDT64ReqAsmPseudoInst;
-}
-multiclass NEONDT64NoF64ReqAsmPseudoInst {
- def I64 : NEONDataTypeAsmPseudoInst;
- def S64 : NEONDataTypeAsmPseudoInst