[LLVMdev] Handling of undef in the IR
Pete Cooper
peter_cooper at apple.com
Thu Jan 15 09:45:51 PST 2015
Actually please ignore me. After talking with Mehdi its clear that all the subclasses of Constant I mentioned would have triggered the same assert Mehdi originally found.
Sorry for the noise.
Thanks,
Pete
> On Jan 15, 2015, at 9:31 AM, Pete Cooper <peter_cooper at apple.com> wrote:
>
> Hi David
>
> Your change will actually be a change in behavior as 'C->getType()->isFPOrFPVectorTy()’ will catch float vectors in ConstantAggregateZero. Also looks like floats can be in ConstantDataVector or maybe even ConstantDataArray although I don’t see an easy way to ensure thats what we parse from an .ll file.
>
> So I think its a good change, but we should probably add a test case for this new behavior, if its even possible to get a 0.0 all the way through to this point, which it might not be.
>
> Thanks,
> Pete
>> On Jan 14, 2015, at 10:31 PM, David Majnemer <david.majnemer at gmail.com <mailto:david.majnemer at gmail.com>> wrote:
>>
>> Hi Mehdi,
>>
>> I think this is a simple bug in Reassociate.
>>
>> It's assuming that objects which are Constant but not ConstantFP must have a type which isn't floating point.
>>
>> The code in question should be dispatching off of the type, not the particular subclass of the Constant hierarchy.
>>
>> The following patch seems to work fine and passes all the tests in the repository:
>>
>> diff --git a/lib/Transforms/Scalar/Reassociate.cpp b/lib/Transforms/Scalar/Reassociate.cpp
>> index 4e02255..f618268 100644
>> --- a/lib/Transforms/Scalar/Reassociate.cpp
>> +++ b/lib/Transforms/Scalar/Reassociate.cpp
>> @@ -917,10 +917,12 @@ void Reassociate::RewriteExprTree(BinaryOperator *I,
>> /// version of the value is returned, and BI is left pointing at the instruction
>> /// that should be processed next by the reassociation pass.
>> static Value *NegateValue(Value *V, Instruction *BI) {
>> - if (ConstantFP *C = dyn_cast<ConstantFP>(V))
>> - return ConstantExpr::getFNeg(C);
>> - if (Constant *C = dyn_cast<Constant>(V))
>> + if (Constant *C = dyn_cast<Constant>(V)) {
>> + if (C->getType()->isFPOrFPVectorTy()) {
>> + return ConstantExpr::getFNeg(C);
>> + }
>> return ConstantExpr::getNeg(C);
>> + }
>>
>> On Wed, Jan 14, 2015 at 9:42 PM, Mehdi Amini <mehdi.amini at apple.com <mailto:mehdi.amini at apple.com>> wrote:
>> Hi all,
>>
>> I have a very simple test case (thanks to bugpoint) that hit an assert in reassociate.
>> (the assert is (C->getType()->isIntOrIntVectorTy() && "Cannot NEG a nonintegral value!"), function getNeg)
>>
>> The function is taking a Constant as argument, but the assert does not expect an undef. I’m not sure whose responsibility is it to handle that (caller?).
>> Do we have to defensively assume that any Constant can be an undef anywhere and I should just add a check here?
>>
>> Thanks,
>>
>> Mehdi
>>
>> PS: IR attached for reference.
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu> http://llvm.cs.uiuc.edu <http://llvm.cs.uiuc.edu/>
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev <http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev>
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu> http://llvm.cs.uiuc.edu <http://llvm.cs.uiuc.edu/>
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev <http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150115/58fc4263/attachment.html>
More information about the llvm-dev
mailing list