[llvm-commits] [llvm] r164866 - in /llvm/trunk: lib/Transforms/Scalar/CodeGenPrepare.cpp test/CodeGen/X86/2012-09-28-CGPBug.ll
Evan Cheng
evan.cheng at apple.com
Sun Oct 7 11:06:03 PDT 2012
In global JT, he addresses of other blocks are used. If they are merged into other blocks, then you end up with invalid values like this:
_JT:
.long Ltmp2-Ltmp0
.long Ltmp1-Ltmp0
.long 1-Ltmp2
.long 1-Ltmp1
Evan
On Oct 5, 2012, at 1:05 PM, Rafael EspĂndola <rafael.espindola at gmail.com> wrote:
> Sorry, what was the problem? The indirectbr in the testcase can only
> jump to label %17 and label %18, so it should be fine to remove the
> other basic blocks.
>
> On 28 September 2012 19:58, Evan Cheng <evan.cheng at apple.com> wrote:
>> Author: evancheng
>> Date: Fri Sep 28 18:58:57 2012
>> New Revision: 164866
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=164866&view=rev
>> Log:
>> Do not delete BBs if their addresses are taken. rdar://12396696
>>
>> Added:
>> llvm/trunk/test/CodeGen/X86/2012-09-28-CGPBug.ll
>> Modified:
>> llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp
>>
>> Modified: llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp?rev=164866&r1=164865&r2=164866&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Scalar/CodeGenPrepare.cpp Fri Sep 28 18:58:57 2012
>> @@ -226,7 +226,8 @@
>> // edge, just collapse it.
>> BasicBlock *SinglePred = BB->getSinglePredecessor();
>>
>> - if (!SinglePred || SinglePred == BB) continue;
>> + // Don't merge if BB's address is taken.
>> + if (!SinglePred || SinglePred == BB || BB->hasAddressTaken()) continue;
>>
>> BranchInst *Term = dyn_cast<BranchInst>(SinglePred->getTerminator());
>> if (Term && !Term->isConditional()) {
>> @@ -788,7 +789,7 @@
>> }
>>
>> // If we eliminated all predecessors of the block, delete the block now.
>> - if (Changed && pred_begin(BB) == pred_end(BB))
>> + if (Changed && !BB->hasAddressTaken() && pred_begin(BB) == pred_end(BB))
>> BB->eraseFromParent();
>>
>> return Changed;
>>
>> Added: llvm/trunk/test/CodeGen/X86/2012-09-28-CGPBug.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2012-09-28-CGPBug.ll?rev=164866&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/CodeGen/X86/2012-09-28-CGPBug.ll (added)
>> +++ llvm/trunk/test/CodeGen/X86/2012-09-28-CGPBug.ll Fri Sep 28 18:58:57 2012
>> @@ -0,0 +1,53 @@
>> +; RUN: llc -mtriple=i386-apple-macosx < %s | FileCheck %s
>> +; rdar://12396696
>> +
>> + at JT = global [4 x i32] [i32 sub (i32 ptrtoint (i8* blockaddress(@h, %18) to i32), i32 ptrtoint (i8* blockaddress(@h, %11) to i32)), i32 sub (i32 ptrtoint (i8* blockaddress(@h, %17) to i32), i32 ptrtoint (i8* blockaddress(@h, %11) to i32)), i32 sub (i32 ptrtoint (i8* blockaddress(@h, %22) to i32), i32 ptrtoint (i8* blockaddress(@h, %18) to i32)), i32 sub (i32 ptrtoint (i8* blockaddress(@h, %22) to i32), i32 ptrtoint (i8* blockaddress(@h, %17) to i32))]
>> + at gGlobalLock = external global i8*
>> + at .str40 = external global [35 x i8]
>> +
>> +; CHECK: _JT:
>> +; CHECK-NOT: .long Ltmp{{[0-9]+}}-1
>> +; CHECK-NOT: .long 1-Ltmp{{[0-9]+}}
>> +; CHECK: .long Ltmp{{[0-9]+}}-Ltmp{{[0-9]+}}
>> +; CHECK: .long Ltmp{{[0-9]+}}-Ltmp{{[0-9]+}}
>> +; CHECK: .long Ltmp{{[0-9]+}}-Ltmp{{[0-9]+}}
>> +; CHECK: .long Ltmp{{[0-9]+}}-Ltmp{{[0-9]+}}
>> +
>> +define void @h(i8*) nounwind ssp {
>> + %2 = alloca i8*
>> + store i8* %0, i8** %2
>> + %3 = load i8** %2
>> + %4 = bitcast i8* %3 to { i32, i32 }*
>> + %5 = getelementptr { i32, i32 }* %4, i32 0, i32 0
>> + %6 = load i32* %5
>> + %7 = srem i32 %6, 2
>> + %8 = icmp slt i32 %6, 2
>> + %9 = select i1 %8, i32 %6, i32 %7
>> + %10 = icmp eq i32 %9, 0
>> + br label %11
>> +
>> +; <label>:11 ; preds = %1
>> + %12 = zext i1 %10 to i32
>> + %13 = getelementptr [4 x i32]* @JT, i32 0, i32 %12
>> + %14 = load i32* %13
>> + %15 = add i32 %14, ptrtoint (i8* blockaddress(@h, %11) to i32)
>> + %16 = inttoptr i32 %15 to i8*
>> + indirectbr i8* %16, [label %17, label %18]
>> +
>> +; <label>:17 ; preds = %11
>> + tail call void (i8*, ...)* @g(i8* getelementptr inbounds ([35 x i8]* @.str40, i32 0, i32 0))
>> + br label %22
>> +
>> +; <label>:18 ; preds = %11
>> + %19 = call i32 @f(i32 -1037694186) nounwind
>> + %20 = inttoptr i32 %19 to i32 (i8**)*
>> + %21 = tail call i32 %20(i8** @gGlobalLock)
>> + br label %22
>> +
>> +; <label>:22 ; preds = %18, %17
>> + ret void
>> +}
>> +
>> +declare i32 @f(i32)
>> +
>> +declare void @g(i8*, ...)
>>
>>
>> _______________________________________________
>> 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