[llvm-commits] [llvm] r167912 - in /llvm/trunk: lib/CodeGen/SelectionDAG/DAGCombiner.cpp test/CodeGen/X86/pr14333.ll

Duncan Sands baldrick at free.fr
Wed Nov 14 05:36:43 PST 2012


Hi Rafael,

On 14/11/12 14:09, Rafael EspĂ­ndola wrote:
> Can we include this in 3.2?

maybe RAUW itself should loop like this?  After all, who expects a RAUW to leave
uses around?

Ciao, Duncan.

>
> On 14 November 2012 00:08, Rafael Espindola <rafael.espindola at gmail.com> wrote:
>> Author: rafael
>> Date: Tue Nov 13 23:08:56 2012
>> New Revision: 167912
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=167912&view=rev
>> Log:
>> Handle DAG CSE adding new uses during ReplaceAllUsesWith. Fixes PR14333.
>>
>> Added:
>>      llvm/trunk/test/CodeGen/X86/pr14333.ll
>> Modified:
>>      llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
>>
>> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=167912&r1=167911&r2=167912&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Tue Nov 13 23:08:56 2012
>> @@ -7728,7 +7728,18 @@
>>         if (StoreNodes[i].MemNode == EarliestOp)
>>           continue;
>>         StoreSDNode *St = cast<StoreSDNode>(StoreNodes[i].MemNode);
>> -      DAG.ReplaceAllUsesOfValueWith(SDValue(St, 0), St->getChain());
>> +      // ReplaceAllUsesWith will replace all uses that existed when it was
>> +      // called, but graph optimizations may cause new ones to appear. For
>> +      // example, the case in pr14333 looks like
>> +      //
>> +      //  St's chain -> St -> another store -> X
>> +      //
>> +      // And the only difference from St to the other store is the chain.
>> +      // When we change it's chain to be St's chain they become identical,
>> +      // get CSEed and the net result is that X is now a use of St.
>> +      // Since we know that St is redundant, just iterate.
>> +      while (!St->use_empty())
>> +        DAG.ReplaceAllUsesWith(SDValue(St, 0), St->getChain());
>>         removeFromWorkList(St);
>>         DAG.DeleteNode(St);
>>       }
>>
>> Added: llvm/trunk/test/CodeGen/X86/pr14333.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/pr14333.ll?rev=167912&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/CodeGen/X86/pr14333.ll (added)
>> +++ llvm/trunk/test/CodeGen/X86/pr14333.ll Tue Nov 13 23:08:56 2012
>> @@ -0,0 +1,12 @@
>> +; RUN: llc -mtriple=x86_64-unknown-unknown < %s
>> +%foo = type { i64, i64 }
>> +define void @bar(%foo* %zed) {
>> +  %tmp = getelementptr inbounds %foo* %zed, i64 0, i32 0
>> +  store i64 0, i64* %tmp, align 8
>> +  %tmp2 = getelementptr inbounds %foo* %zed, i64 0, i32 1
>> +  store i64 0, i64* %tmp2, align 8
>> +  %tmp3 = bitcast %foo* %zed to i8*
>> +  call void @llvm.memset.p0i8.i64(i8* %tmp3, i8 0, i64 16, i32 8, i1 false)
>> +  ret void
>> +}
>> +declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind
>>
>>
>> _______________________________________________
>> 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