Merge pull request #739 from ifilippov/fluky

Fix for fluky problem 'argument out of range'
This commit is contained in:
Dmitry Babokin
2014-02-13 16:13:32 +03:00

53
opt.cpp
View File

@@ -769,24 +769,29 @@ IntrinsicsOpt::IntrinsicsOpt()
// All of the mask instructions we may encounter. Note that even if // All of the mask instructions we may encounter. Note that even if
// compiling for AVX, we may still encounter the regular 4-wide SSE // compiling for AVX, we may still encounter the regular 4-wide SSE
// MOVMSK instruction. // MOVMSK instruction.
llvm::Function *ssei8Movmsk = if (llvm::Function *ssei8Movmsk =
llvm::Intrinsic::getDeclaration(m->module, llvm::Intrinsic::x86_sse2_pmovmskb_128); m->module->getFunction(llvm::Intrinsic::getName(llvm::Intrinsic::x86_sse2_pmovmskb_128))) {
maskInstructions.push_back(ssei8Movmsk); maskInstructions.push_back(ssei8Movmsk);
llvm::Function *sseFloatMovmsk = }
llvm::Intrinsic::getDeclaration(m->module, llvm::Intrinsic::x86_sse_movmsk_ps); if (llvm::Function *sseFloatMovmsk =
maskInstructions.push_back(sseFloatMovmsk); m->module->getFunction(llvm::Intrinsic::getName(llvm::Intrinsic::x86_sse_movmsk_ps))) {
maskInstructions.push_back(m->module->getFunction("__movmsk")); maskInstructions.push_back(sseFloatMovmsk);
llvm::Function *avxFloatMovmsk = }
llvm::Intrinsic::getDeclaration(m->module, llvm::Intrinsic::x86_avx_movmsk_ps_256); if (llvm::Function *__movmsk =
Assert(avxFloatMovmsk != NULL); m->module->getFunction("__movmsk")) {
maskInstructions.push_back(avxFloatMovmsk); maskInstructions.push_back(__movmsk);
}
if (llvm::Function *avxFloatMovmsk =
m->module->getFunction(llvm::Intrinsic::getName(llvm::Intrinsic::x86_avx_movmsk_ps_256))) {
maskInstructions.push_back(avxFloatMovmsk);
}
// And all of the blend instructions // And all of the blend instructions
blendInstructions.push_back(BlendInstruction( blendInstructions.push_back(BlendInstruction(
llvm::Intrinsic::getDeclaration(m->module, llvm::Intrinsic::x86_sse41_blendvps), m->module->getFunction(llvm::Intrinsic::getName(llvm::Intrinsic::x86_sse41_blendvps)),
0xf, 0, 1, 2)); 0xf, 0, 1, 2));
blendInstructions.push_back(BlendInstruction( blendInstructions.push_back(BlendInstruction(
llvm::Intrinsic::getDeclaration(m->module, llvm::Intrinsic::x86_avx_blendv_ps_256), m->module->getFunction(llvm::Intrinsic::getName(llvm::Intrinsic::x86_avx_blendv_ps_256)),
0xff, 0, 1, 2)); 0xff, 0, 1, 2));
} }
@@ -818,15 +823,13 @@ IntrinsicsOpt::runOnBasicBlock(llvm::BasicBlock &bb) {
DEBUG_START_PASS("IntrinsicsOpt"); DEBUG_START_PASS("IntrinsicsOpt");
llvm::Function *avxMaskedLoad32 = llvm::Function *avxMaskedLoad32 =
llvm::Intrinsic::getDeclaration(m->module, llvm::Intrinsic::x86_avx_maskload_ps_256); m->module->getFunction(llvm::Intrinsic::getName(llvm::Intrinsic::x86_avx_maskload_ps_256));
llvm::Function *avxMaskedLoad64 = llvm::Function *avxMaskedLoad64 =
llvm::Intrinsic::getDeclaration(m->module, llvm::Intrinsic::x86_avx_maskload_pd_256); m->module->getFunction(llvm::Intrinsic::getName(llvm::Intrinsic::x86_avx_maskload_pd_256));
llvm::Function *avxMaskedStore32 = llvm::Function *avxMaskedStore32 =
llvm::Intrinsic::getDeclaration(m->module, llvm::Intrinsic::x86_avx_maskstore_ps_256); m->module->getFunction(llvm::Intrinsic::getName(llvm::Intrinsic::x86_avx_maskstore_ps_256));
llvm::Function *avxMaskedStore64 = llvm::Function *avxMaskedStore64 =
llvm::Intrinsic::getDeclaration(m->module, llvm::Intrinsic::x86_avx_maskstore_pd_256); m->module->getFunction(llvm::Intrinsic::getName(llvm::Intrinsic::x86_avx_maskstore_pd_256));
Assert(avxMaskedLoad32 != NULL && avxMaskedStore32 != NULL);
Assert(avxMaskedLoad64 != NULL && avxMaskedStore64 != NULL);
bool modifiedAny = false; bool modifiedAny = false;
restart: restart:
@@ -993,20 +996,24 @@ IntrinsicsOpt::runOnBasicBlock(llvm::BasicBlock &bb) {
bool bool
IntrinsicsOpt::matchesMaskInstruction(llvm::Function *function) { IntrinsicsOpt::matchesMaskInstruction(llvm::Function *function) {
for (unsigned int i = 0; i < maskInstructions.size(); ++i) for (unsigned int i = 0; i < maskInstructions.size(); ++i) {
if (maskInstructions[i].function != NULL && if (maskInstructions[i].function != NULL &&
function == maskInstructions[i].function) function == maskInstructions[i].function) {
return true; return true;
}
}
return false; return false;
} }
IntrinsicsOpt::BlendInstruction * IntrinsicsOpt::BlendInstruction *
IntrinsicsOpt::matchingBlendInstruction(llvm::Function *function) { IntrinsicsOpt::matchingBlendInstruction(llvm::Function *function) {
for (unsigned int i = 0; i < blendInstructions.size(); ++i) for (unsigned int i = 0; i < blendInstructions.size(); ++i) {
if (blendInstructions[i].function != NULL && if (blendInstructions[i].function != NULL &&
function == blendInstructions[i].function) function == blendInstructions[i].function) {
return &blendInstructions[i]; return &blendInstructions[i];
}
}
return NULL; return NULL;
} }