Merge pull request #739 from ifilippov/fluky
Fix for fluky problem 'argument out of range'
This commit is contained in:
53
opt.cpp
53
opt.cpp
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user