274 lines
11 KiB
Diff
274 lines
11 KiB
Diff
Index: include/llvm/Intrinsics.td
|
|
===================================================================
|
|
--- include/llvm/Intrinsics.td (revision 3710)
|
|
+++ include/llvm/Intrinsics.td (working copy)
|
|
@@ -439,10 +439,10 @@
|
|
// Target-specific intrinsics
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
-include "llvm/IntrinsicsPowerPC.td"
|
|
+//include "llvm/IntrinsicsPowerPC.td"
|
|
include "llvm/IntrinsicsX86.td"
|
|
-include "llvm/IntrinsicsARM.td"
|
|
-include "llvm/IntrinsicsCellSPU.td"
|
|
-include "llvm/IntrinsicsAlpha.td"
|
|
-include "llvm/IntrinsicsXCore.td"
|
|
-include "llvm/IntrinsicsPTX.td"
|
|
+//include "llvm/IntrinsicsARM.td"
|
|
+//include "llvm/IntrinsicsCellSPU.td"
|
|
+//include "llvm/IntrinsicsAlpha.td"
|
|
+//include "llvm/IntrinsicsXCore.td"
|
|
+//include "llvm/IntrinsicsPTX.td"
|
|
Index: lib/Analysis/BasicAliasAnalysis.cpp
|
|
===================================================================
|
|
--- lib/Analysis/BasicAliasAnalysis.cpp (revision 3710)
|
|
+++ lib/Analysis/BasicAliasAnalysis.cpp (working copy)
|
|
@@ -785,27 +785,27 @@
|
|
return NoModRef;
|
|
break;
|
|
}
|
|
- case Intrinsic::arm_neon_vld1: {
|
|
- // LLVM's vld1 and vst1 intrinsics currently only support a single
|
|
- // vector register.
|
|
- uint64_t Size =
|
|
- TD ? TD->getTypeStoreSize(II->getType()) : UnknownSize;
|
|
- if (isNoAlias(Location(II->getArgOperand(0), Size,
|
|
- II->getMetadata(LLVMContext::MD_tbaa)),
|
|
- Loc))
|
|
- return NoModRef;
|
|
- break;
|
|
+ //case Intrinsic::arm_neon_vld1: {
|
|
+ // // LLVM's vld1 and vst1 intrinsics currently only support a single
|
|
+ // // vector register.
|
|
+ // uint64_t Size =
|
|
+ // TD ? TD->getTypeStoreSize(II->getType()) : UnknownSize;
|
|
+ // if (isNoAlias(Location(II->getArgOperand(0), Size,
|
|
+ // II->getMetadata(LLVMContext::MD_tbaa)),
|
|
+ // Loc))
|
|
+ // return NoModRef;
|
|
+ // break;
|
|
+ //}
|
|
+ //case Intrinsic::arm_neon_vst1: {
|
|
+ // uint64_t Size =
|
|
+ // TD ? TD->getTypeStoreSize(II->getArgOperand(1)->getType()) : UnknownSize;
|
|
+ // if (isNoAlias(Location(II->getArgOperand(0), Size,
|
|
+ // II->getMetadata(LLVMContext::MD_tbaa)),
|
|
+ // Loc))
|
|
+ // return NoModRef;
|
|
+ // break;
|
|
+ //}
|
|
}
|
|
- case Intrinsic::arm_neon_vst1: {
|
|
- uint64_t Size =
|
|
- TD ? TD->getTypeStoreSize(II->getArgOperand(1)->getType()) : UnknownSize;
|
|
- if (isNoAlias(Location(II->getArgOperand(0), Size,
|
|
- II->getMetadata(LLVMContext::MD_tbaa)),
|
|
- Loc))
|
|
- return NoModRef;
|
|
- break;
|
|
- }
|
|
- }
|
|
|
|
// We can bound the aliasing properties of memset_pattern16 just as we can
|
|
// for memcpy/memset. This is particularly important because the
|
|
Index: lib/Transforms/InstCombine/InstCombineCalls.cpp
|
|
===================================================================
|
|
--- lib/Transforms/InstCombine/InstCombineCalls.cpp (revision 3710)
|
|
+++ lib/Transforms/InstCombine/InstCombineCalls.cpp (working copy)
|
|
@@ -544,25 +544,25 @@
|
|
}
|
|
}
|
|
break;
|
|
- case Intrinsic::ppc_altivec_lvx:
|
|
- case Intrinsic::ppc_altivec_lvxl:
|
|
- // Turn PPC lvx -> load if the pointer is known aligned.
|
|
- if (getOrEnforceKnownAlignment(II->getArgOperand(0), 16, TD) >= 16) {
|
|
- Value *Ptr = Builder->CreateBitCast(II->getArgOperand(0),
|
|
- PointerType::getUnqual(II->getType()));
|
|
- return new LoadInst(Ptr);
|
|
- }
|
|
- break;
|
|
- case Intrinsic::ppc_altivec_stvx:
|
|
- case Intrinsic::ppc_altivec_stvxl:
|
|
- // Turn stvx -> store if the pointer is known aligned.
|
|
- if (getOrEnforceKnownAlignment(II->getArgOperand(1), 16, TD) >= 16) {
|
|
- Type *OpPtrTy =
|
|
- PointerType::getUnqual(II->getArgOperand(0)->getType());
|
|
- Value *Ptr = Builder->CreateBitCast(II->getArgOperand(1), OpPtrTy);
|
|
- return new StoreInst(II->getArgOperand(0), Ptr);
|
|
- }
|
|
- break;
|
|
+ //case Intrinsic::ppc_altivec_lvx:
|
|
+ //case Intrinsic::ppc_altivec_lvxl:
|
|
+ // // Turn PPC lvx -> load if the pointer is known aligned.
|
|
+ // if (getOrEnforceKnownAlignment(II->getArgOperand(0), 16, TD) >= 16) {
|
|
+ // Value *Ptr = Builder->CreateBitCast(II->getArgOperand(0),
|
|
+ // PointerType::getUnqual(II->getType()));
|
|
+ // return new LoadInst(Ptr);
|
|
+ // }
|
|
+ // break;
|
|
+ //case Intrinsic::ppc_altivec_stvx:
|
|
+ //case Intrinsic::ppc_altivec_stvxl:
|
|
+ // // Turn stvx -> store if the pointer is known aligned.
|
|
+ // if (getOrEnforceKnownAlignment(II->getArgOperand(1), 16, TD) >= 16) {
|
|
+ // Type *OpPtrTy =
|
|
+ // PointerType::getUnqual(II->getArgOperand(0)->getType());
|
|
+ // Value *Ptr = Builder->CreateBitCast(II->getArgOperand(1), OpPtrTy);
|
|
+ // return new StoreInst(II->getArgOperand(0), Ptr);
|
|
+ // }
|
|
+ // break;
|
|
case Intrinsic::x86_sse_storeu_ps:
|
|
case Intrinsic::x86_sse2_storeu_pd:
|
|
case Intrinsic::x86_sse2_storeu_dq:
|
|
@@ -619,79 +619,79 @@
|
|
break;
|
|
}
|
|
|
|
- case Intrinsic::ppc_altivec_vperm:
|
|
- // Turn vperm(V1,V2,mask) -> shuffle(V1,V2,mask) if mask is a constant.
|
|
- if (ConstantVector *Mask = dyn_cast<ConstantVector>(II->getArgOperand(2))) {
|
|
- assert(Mask->getNumOperands() == 16 && "Bad type for intrinsic!");
|
|
-
|
|
- // Check that all of the elements are integer constants or undefs.
|
|
- bool AllEltsOk = true;
|
|
- for (unsigned i = 0; i != 16; ++i) {
|
|
- if (!isa<ConstantInt>(Mask->getOperand(i)) &&
|
|
- !isa<UndefValue>(Mask->getOperand(i))) {
|
|
- AllEltsOk = false;
|
|
- break;
|
|
- }
|
|
- }
|
|
-
|
|
- if (AllEltsOk) {
|
|
- // Cast the input vectors to byte vectors.
|
|
- Value *Op0 = Builder->CreateBitCast(II->getArgOperand(0),
|
|
- Mask->getType());
|
|
- Value *Op1 = Builder->CreateBitCast(II->getArgOperand(1),
|
|
- Mask->getType());
|
|
- Value *Result = UndefValue::get(Op0->getType());
|
|
-
|
|
- // Only extract each element once.
|
|
- Value *ExtractedElts[32];
|
|
- memset(ExtractedElts, 0, sizeof(ExtractedElts));
|
|
-
|
|
- for (unsigned i = 0; i != 16; ++i) {
|
|
- if (isa<UndefValue>(Mask->getOperand(i)))
|
|
- continue;
|
|
- unsigned Idx=cast<ConstantInt>(Mask->getOperand(i))->getZExtValue();
|
|
- Idx &= 31; // Match the hardware behavior.
|
|
-
|
|
- if (ExtractedElts[Idx] == 0) {
|
|
- ExtractedElts[Idx] =
|
|
- Builder->CreateExtractElement(Idx < 16 ? Op0 : Op1,
|
|
- Builder->getInt32(Idx&15));
|
|
- }
|
|
-
|
|
- // Insert this value into the result vector.
|
|
- Result = Builder->CreateInsertElement(Result, ExtractedElts[Idx],
|
|
- Builder->getInt32(i));
|
|
- }
|
|
- return CastInst::Create(Instruction::BitCast, Result, CI.getType());
|
|
- }
|
|
- }
|
|
- break;
|
|
+ //case Intrinsic::ppc_altivec_vperm:
|
|
+ // // Turn vperm(V1,V2,mask) -> shuffle(V1,V2,mask) if mask is a constant.
|
|
+ // if (ConstantVector *Mask = dyn_cast<ConstantVector>(II->getArgOperand(2))) {
|
|
+ // assert(Mask->getNumOperands() == 16 && "Bad type for intrinsic!");
|
|
+ //
|
|
+ // // Check that all of the elements are integer constants or undefs.
|
|
+ // bool AllEltsOk = true;
|
|
+ // for (unsigned i = 0; i != 16; ++i) {
|
|
+ // if (!isa<ConstantInt>(Mask->getOperand(i)) &&
|
|
+ // !isa<UndefValue>(Mask->getOperand(i))) {
|
|
+ // AllEltsOk = false;
|
|
+ // break;
|
|
+ // }
|
|
+ // }
|
|
+ //
|
|
+ // if (AllEltsOk) {
|
|
+ // // Cast the input vectors to byte vectors.
|
|
+ // Value *Op0 = Builder->CreateBitCast(II->getArgOperand(0),
|
|
+ // Mask->getType());
|
|
+ // Value *Op1 = Builder->CreateBitCast(II->getArgOperand(1),
|
|
+ // Mask->getType());
|
|
+ // Value *Result = UndefValue::get(Op0->getType());
|
|
+ //
|
|
+ // // Only extract each element once.
|
|
+ // Value *ExtractedElts[32];
|
|
+ // memset(ExtractedElts, 0, sizeof(ExtractedElts));
|
|
+ //
|
|
+ // for (unsigned i = 0; i != 16; ++i) {
|
|
+ // if (isa<UndefValue>(Mask->getOperand(i)))
|
|
+ // continue;
|
|
+ // unsigned Idx=cast<ConstantInt>(Mask->getOperand(i))->getZExtValue();
|
|
+ // Idx &= 31; // Match the hardware behavior.
|
|
+ //
|
|
+ // if (ExtractedElts[Idx] == 0) {
|
|
+ // ExtractedElts[Idx] =
|
|
+ // Builder->CreateExtractElement(Idx < 16 ? Op0 : Op1,
|
|
+ // Builder->getInt32(Idx&15));
|
|
+ // }
|
|
+ //
|
|
+ // // Insert this value into the result vector.
|
|
+ // Result = Builder->CreateInsertElement(Result, ExtractedElts[Idx],
|
|
+ // Builder->getInt32(i));
|
|
+ // }
|
|
+ // return CastInst::Create(Instruction::BitCast, Result, CI.getType());
|
|
+ // }
|
|
+ // }
|
|
+ // break;
|
|
|
|
- case Intrinsic::arm_neon_vld1:
|
|
- case Intrinsic::arm_neon_vld2:
|
|
- case Intrinsic::arm_neon_vld3:
|
|
- case Intrinsic::arm_neon_vld4:
|
|
- case Intrinsic::arm_neon_vld2lane:
|
|
- case Intrinsic::arm_neon_vld3lane:
|
|
- case Intrinsic::arm_neon_vld4lane:
|
|
- case Intrinsic::arm_neon_vst1:
|
|
- case Intrinsic::arm_neon_vst2:
|
|
- case Intrinsic::arm_neon_vst3:
|
|
- case Intrinsic::arm_neon_vst4:
|
|
- case Intrinsic::arm_neon_vst2lane:
|
|
- case Intrinsic::arm_neon_vst3lane:
|
|
- case Intrinsic::arm_neon_vst4lane: {
|
|
- unsigned MemAlign = getKnownAlignment(II->getArgOperand(0), TD);
|
|
- unsigned AlignArg = II->getNumArgOperands() - 1;
|
|
- ConstantInt *IntrAlign = dyn_cast<ConstantInt>(II->getArgOperand(AlignArg));
|
|
- if (IntrAlign && IntrAlign->getZExtValue() < MemAlign) {
|
|
- II->setArgOperand(AlignArg,
|
|
- ConstantInt::get(Type::getInt32Ty(II->getContext()),
|
|
- MemAlign, false));
|
|
- return II;
|
|
- }
|
|
- break;
|
|
- }
|
|
+ //case Intrinsic::arm_neon_vld1:
|
|
+ //case Intrinsic::arm_neon_vld2:
|
|
+ //case Intrinsic::arm_neon_vld3:
|
|
+ //case Intrinsic::arm_neon_vld4:
|
|
+ //case Intrinsic::arm_neon_vld2lane:
|
|
+ //case Intrinsic::arm_neon_vld3lane:
|
|
+ //case Intrinsic::arm_neon_vld4lane:
|
|
+ //case Intrinsic::arm_neon_vst1:
|
|
+ //case Intrinsic::arm_neon_vst2:
|
|
+ //case Intrinsic::arm_neon_vst3:
|
|
+ //case Intrinsic::arm_neon_vst4:
|
|
+ //case Intrinsic::arm_neon_vst2lane:
|
|
+ //case Intrinsic::arm_neon_vst3lane:
|
|
+ //case Intrinsic::arm_neon_vst4lane: {
|
|
+ // unsigned MemAlign = getKnownAlignment(II->getArgOperand(0), TD);
|
|
+ // unsigned AlignArg = II->getNumArgOperands() - 1;
|
|
+ // ConstantInt *IntrAlign = dyn_cast<ConstantInt>(II->getArgOperand(AlignArg));
|
|
+ // if (IntrAlign && IntrAlign->getZExtValue() < MemAlign) {
|
|
+ // II->setArgOperand(AlignArg,
|
|
+ // ConstantInt::get(Type::getInt32Ty(II->getContext()),
|
|
+ // MemAlign, false));
|
|
+ // return II;
|
|
+ // }
|
|
+ // break;
|
|
+ //}
|
|
|
|
case Intrinsic::stackrestore: {
|
|
// If the save is right next to the restore, remove the restore. This can
|