[llvm-commits] [llvm] r156896 - in /llvm/trunk: lib/Target/X86/X86ISelDAGToDAG.cpp test/CodeGen/X86/rd-mod-wr-eflags.ll
Evan Cheng
evan.cheng at apple.com
Tue May 15 19:04:16 PDT 2012
That would be PR12565.
Evan
On May 15, 2012, at 6:54 PM, Evan Cheng wrote:
> Author: evancheng
> Date: Tue May 15 20:54:27 2012
> New Revision: 156896
>
> URL: http://llvm.org/viewvc/llvm-project?rev=156896&view=rev
> Log:
> Avoid creating a cycle when folding load / op with flag / store. PR11451474. rdar://11451474
>
> Modified:
> llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp
> llvm/trunk/test/CodeGen/X86/rd-mod-wr-eflags.ll
>
> Modified: llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp?rev=156896&r1=156895&r2=156896&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp Tue May 15 20:54:27 2012
> @@ -1905,6 +1905,20 @@
> ChainCheck = true;
> continue;
> }
> +
> + // Make sure using Op as part of the chain would not cause a cycle here.
> + // In theory, we could check whether the chain node is a predecessor of
> + // the load. But that can be very expensive. Instead visit the uses and
> + // make sure they all have smaller node id than the load.
> + int LoadId = LoadNode->getNodeId();
> + for (SDNode::use_iterator UI = Op.getNode()->use_begin(),
> + UE = UI->use_end(); UI != UE; ++UI) {
> + if (UI.getUse().getResNo() != 0)
> + continue;
> + if (UI->getNodeId() > LoadId)
> + return false;
> + }
> +
> ChainOps.push_back(Op);
> }
>
>
> Modified: llvm/trunk/test/CodeGen/X86/rd-mod-wr-eflags.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/rd-mod-wr-eflags.ll?rev=156896&r1=156895&r2=156896&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/rd-mod-wr-eflags.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/rd-mod-wr-eflags.ll Tue May 15 20:54:27 2012
> @@ -177,3 +177,49 @@
> return:
> ret void
> }
> +
> +; Deal with TokenFactor chain
> +; rdar://11236106
> + at foo = external global i64*, align 8
> +
> +define void @test3() nounwind ssp {
> +entry:
> +; CHECK: test3:
> +; CHECK: decq 16(%rax)
> + %0 = load i64** @foo, align 8
> + %arrayidx = getelementptr inbounds i64* %0, i64 2
> + %1 = load i64* %arrayidx, align 8
> + %dec = add i64 %1, -1
> + store i64 %dec, i64* %arrayidx, align 8
> + %cmp = icmp eq i64 %dec, 0
> + br i1 %cmp, label %if.then, label %if.end
> +
> +if.then:
> + tail call void @baz() nounwind
> + br label %if.end
> +
> +if.end:
> + ret void
> +}
> +
> +declare void @baz()
> +
> +; Avoid creating a cycle in the DAG which would trigger an assert in the
> +; scheduler.
> +; PR12565
> +; rdar://11451474
> + at x = external global i32, align 4
> + at y = external global i32, align 4
> + at z = external global i32, align 4
> +
> +define void @test4() nounwind uwtable ssp {
> +entry:
> + %0 = load i32* @x, align 4
> + %1 = load i32* @y, align 4
> + %dec = add nsw i32 %1, -1
> + store i32 %dec, i32* @y, align 4
> + %tobool.i = icmp ne i32 %dec, 0
> + %cond.i = select i1 %tobool.i, i32 %0, i32 0
> + store i32 %cond.i, i32* @z, align 4
> + ret void
> +}
>
>
> _______________________________________________
> 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