[llvm-commits] [llvm] r168361 - in /llvm/trunk: lib/Transforms/Scalar/SROA.cpp test/Transforms/SROA/phi-and-select.ll
32bitmicro
root at 32bitmicro.com
Wed Nov 21 10:45:35 PST 2012
> Pawel, another simple bug fix for 3.2 I think. I'm the code owner for SROA.
r168361, r168346 and r168227 merged into 3.2 branch release as
single SROA changset in 168443.
Committed revision 168443.
> Re: [llvm-commits] [llvm] r168346 ...
>
> Pawel, please pull this patch (and if necessary Evan's prior patch,
> r168227) into the 3.2 release branch. They fix quite common crashes.
Indeed the r168227 was necessary for r168346.
>
> On Tue, Nov 20, 2012 at 2:02 AM, Chandler Carruth <chandlerc at gmail.com> wrote:
>> Author: chandlerc
>> Date: Tue Nov 20 04:02:19 2012
>> New Revision: 168361
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=168361&view=rev
>> Log:
>> Fix PR14132 and handle OOB loads speculated throuh PHI nodes.
>>
>> The issue is that we may end up with newly OOB loads when speculating
>> a load into the predecessors of a PHI node, and this confuses the new
>> integer splitting logic in some cases, triggering an assertion failure.
>> In fact, the branch in question must be dead code as it loads from
>> a too-narrow alloca. Add code to handle this gracefully and leave the
>> requisite FIXMEs for both optimizing more aggressively and doing more to
>> aid sanitizing invalid code which triggers these patterns.
>>
>> Modified:
>> llvm/trunk/lib/Transforms/Scalar/SROA.cpp
>> llvm/trunk/test/Transforms/SROA/phi-and-select.ll
>>
>> Modified: llvm/trunk/lib/Transforms/Scalar/SROA.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SROA.cpp?rev=168361&r1=168360&r2=168361&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Scalar/SROA.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Scalar/SROA.cpp Tue Nov 20 04:02:19 2012
>> @@ -568,6 +568,10 @@
>>
>> // Clamp the end offset to the end of the allocation. Note that this is
>> // formulated to handle even the case where "BeginOffset + Size" overflows.
>> + // NOTE! This may appear superficially to be something we could ignore
>> + // entirely, but that is not so! There may be PHI-node uses where some
>> + // instructions are dead but not others. We can't completely ignore the
>> + // PHI node, and so have to record at least the information here.
>> assert(AllocSize >= BeginOffset); // Established above.
>> if (Size > AllocSize - BeginOffset) {
>> DEBUG(dbgs() << "WARNING: Clamping a " << Size << " byte use @" << Offset
>> @@ -2492,6 +2496,23 @@
>>
>> uint64_t Size = EndOffset - BeginOffset;
>> bool IsSplitIntLoad = Size < TD.getTypeStoreSize(LI.getType());
>> +
>> + // If this memory access can be shown to *statically* extend outside the
>> + // bounds of the original allocation it's behavior is undefined. Rather
>> + // than trying to transform it, just replace it with undef.
>> + // FIXME: We should do something more clever for functions being
>> + // instrumented by asan.
>> + // FIXME: Eventually, once ASan and friends can flush out bugs here, this
>> + // should be transformed to a load of null making it unreachable.
>> + uint64_t OldAllocSize = TD.getTypeAllocSize(OldAI.getAllocatedType());
>> + if (TD.getTypeStoreSize(LI.getType()) > OldAllocSize) {
>> + LI.replaceAllUsesWith(UndefValue::get(LI.getType()));
>> + Pass.DeadInsts.insert(&LI);
>> + deleteIfTriviallyDead(OldOp);
>> + DEBUG(dbgs() << " to: undef!!\n");
>> + return true;
>> + }
>> +
>> Type *TargetTy = IsSplitIntLoad ? Type::getIntNTy(LI.getContext(), Size * 8)
>> : LI.getType();
>> bool IsPtrAdjusted = false;
>>
>> Modified: llvm/trunk/test/Transforms/SROA/phi-and-select.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SROA/phi-and-select.ll?rev=168361&r1=168360&r2=168361&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/Transforms/SROA/phi-and-select.ll (original)
>> +++ llvm/trunk/test/Transforms/SROA/phi-and-select.ll Tue Nov 20 04:02:19 2012
>> @@ -390,3 +390,38 @@
>> %tmpcast.d.0 = select i1 undef, i32* %c, i32* %d.0
>> br label %for.cond
>> }
>> +
>> +define i64 @PR14132(i1 %flag) {
>> +; CHECK: @PR14132
>> +; Here we form a PHI-node by promoting the pointer alloca first, and then in
>> +; order to promote the other two allocas, we speculate the load of the
>> +; now-phi-node-pointer. In doing so we end up loading a 64-bit value from an i8
>> +; alloca, which is completely bogus. However, we were asserting on trying to
>> +; rewrite it. Now it is replaced with undef. Eventually we may replace it with
>> +; unrechable and even the CFG will go away here.
>> +entry:
>> + %a = alloca i64
>> + %b = alloca i8
>> + %ptr = alloca i64*
>> +; CHECK-NOT: alloca
>> +
>> + %ptr.cast = bitcast i64** %ptr to i8**
>> + store i64 0, i64* %a
>> + store i8 1, i8* %b
>> + store i64* %a, i64** %ptr
>> + br i1 %flag, label %if.then, label %if.end
>> +
>> +if.then:
>> + store i8* %b, i8** %ptr.cast
>> + br label %if.end
>> +
>> +if.end:
>> + %tmp = load i64** %ptr
>> + %result = load i64* %tmp
>> +; CHECK-NOT: store
>> +; CHECK-NOT: load
>> +; CHECK: %[[result:.*]] = phi i64 [ undef, %if.then ], [ 0, %entry ]
>> +
>> + ret i64 %result
>> +; CHECK-NEXT: ret i64 %[[result]]
>> +}
>>
>>
>> _______________________________________________
>> 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