changes in function LLVMFlattenInsertChain

This commit is contained in:
Ilia Filippov
2013-06-14 16:38:54 +04:00
parent d92f9df17c
commit 5c89080469
2 changed files with 13 additions and 11 deletions

View File

@@ -600,9 +600,9 @@ lGetIntValue(llvm::Value *offset) {
}
llvm::Value *
llvm::Value *
LLVMFlattenInsertChain(llvm::Value *inst, int vectorWidth,
bool compare, bool undef) {
bool compare, bool undef) {
llvm::Value ** elements = new llvm::Value*[vectorWidth];
for (int i = 0; i < vectorWidth; ++i) {
elements[i] = NULL;
@@ -631,7 +631,7 @@ LLVMFlattenInsertChain(llvm::Value *inst, int vectorWidth,
if (llvm::isa<llvm::UndefValue>(insertBase)) {
break;
}
if (llvm::isa<llvm::ConstantVector>(insertBase) ||
llvm::isa<llvm::ConstantAggregateZero>(insertBase)) {
llvm::Constant *cv = llvm::dyn_cast<llvm::Constant>(insertBase);
@@ -648,17 +648,20 @@ LLVMFlattenInsertChain(llvm::Value *inst, int vectorWidth,
// They are not equal to each other so we should return NULL if compare
// and first element if we have it.
Assert(compare == true || elements[0] != NULL);
if (compare)
if (compare) {
return NULL;
else
}
else {
return elements[0];
}
}
// TODO: Also, should we handle some other values like
// ConstantDataVectors.
}
if (compare == false)
//We simply want first element
if (compare == false) {
//We simply want first element
return elements[0];
}
int null_number = 0;
int NonNull = 0;

View File

@@ -270,10 +270,9 @@ extern bool LLVMExtractVectorInts(llvm::Value *v, int64_t ret[], int *nElts);
%broadcast.1 = shufflevector <4 x i32> %smear.0, <4 x i32> undef,
<4 x i32> zeroinitializer
Function returns:
First element of array if compare is false,
NonNull element only if all elements are equal or NULL if compare is true,
NonNull element only if all elements are equal if compare is true and undef is false,
NULL if all elements are NULLs
Compare all elements and return one of them if all are equal, otherwise NULL.
If compare argument is false, don't do compare and return first element instead.
If undef argument is true, ignore undef elements (but all undef yields NULL anyway).
*/
extern llvm::Value * LLVMFlattenInsertChain (llvm::Value *inst, int vectorWidth,
bool compare = true, bool undef = true);