[llvm-commits] [llvm] r125319 - in /llvm/trunk: lib/Analysis/ValueTracking.cpp test/Transforms/JumpThreading/degenerate-phi.ll
Nick Lewycky
nicholas at mxc.ca
Fri Feb 11 00:25:48 PST 2011
Duncan Sands wrote:
> Hi Nick,
>
>> --- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
>> +++ llvm/trunk/lib/Analysis/ValueTracking.cpp Thu Feb 10 17:54:10 2011
>> @@ -590,6 +590,10 @@
>> }
>> }
>>
>> + // Unreachable blocks may have zero-operand PHI nodes.
>> + if (P->getNumIncomingValues() == 0)
>> + return;
>
> the LangRef says that zero operand phis are not allowed. I'm pretty sure that
> there is some code in InstructionSimplify (which is calling ValueTracking here)
> which assumes that phi nodes have at least one operand. Who knows where else
> this assumption is made? I think it would be better to have jump-threading zap
> any zero operand phis when it makes them, rather than changing all analyses to
> support them.
It doesn't create them, it calls BasicBlock::removePredecessor.
This code already has to handle the case where you make a query about a
value and one of the possible inputs (say, through a select) comes from
an unreachable block which contains a "%x = add %x, %x" instruction.
Nick
>
> Ciao, Duncan.
>
>> +
>> // Otherwise take the unions of the known bit sets of the operands,
>> // taking conservative care to avoid excessive recursion.
>> if (Depth< MaxDepth - 1&& !KnownZero&& !KnownOne) {
>>
>> Added: llvm/trunk/test/Transforms/JumpThreading/degenerate-phi.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/JumpThreading/degenerate-phi.ll?rev=125319&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/Transforms/JumpThreading/degenerate-phi.ll (added)
>> +++ llvm/trunk/test/Transforms/JumpThreading/degenerate-phi.ll Thu Feb 10 17:54:10 2011
>> @@ -0,0 +1,24 @@
>> +; RUN: opt -jump-threading -disable-output %s
>> +; PR9112
>> +
>> +; This is actually a test for value tracking. Jump threading produces
>> +; "%phi = phi i16" when it removes all edges leading to %unreachable.
>> +; The .ll parser won't let us write that directly since it's invalid code.
>> +
>> +define void @func() nounwind {
>> +entry:
>> + br label %bb
>> +
>> +bb:
>> + br label %bb
>> +
>> +unreachable:
>> + %phi = phi i16 [ %add, %unreachable ], [ 0, %next ]
>> + %add = add i16 0, %phi
>> + %cmp = icmp slt i16 %phi, 0
>> + br i1 %cmp, label %unreachable, label %next
>> +
>> +next:
>> + br label %unreachable
>> +}
>> +
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
More information about the llvm-commits
mailing list