[llvm] r279104 - AArch64: Don't call getIterator() on iterators

Duncan P. N. Exon Smith via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 18 19:29:20 PDT 2016


> On 2016-Aug-18, at 10:58, Duncan P. N. Exon Smith via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> Author: dexonsmith
> Date: Thu Aug 18 12:58:09 2016
> New Revision: 279104
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=279104&view=rev
> Log:
> AArch64: Don't call getIterator() on iterators
> 
> Remove an unnecessary round-trip:
> 
>    iterator => operator->() => getIterator()
> 
> In some cases, the iterator is end(), so the dereference of operator->
> is invalid (UB).
> 
> The testcase only crashes with r278974 (currently reverted to
> investigate this), which adds an assertion for invalid dereferences of
> ilist nodes.
> 
> Fixes PR29035.
> 
> Added:
>    llvm/trunk/test/CodeGen/AArch64/redundant-copy-elim-empty-mbb.ll
> Modified:
>    llvm/trunk/lib/Target/AArch64/AArch64RedundantCopyElimination.cpp
> 
> Modified: llvm/trunk/lib/Target/AArch64/AArch64RedundantCopyElimination.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64RedundantCopyElimination.cpp?rev=279104&r1=279103&r2=279104&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/AArch64/AArch64RedundantCopyElimination.cpp (original)
> +++ llvm/trunk/lib/Target/AArch64/AArch64RedundantCopyElimination.cpp Thu Aug 18 12:58:09 2016
> @@ -156,8 +156,7 @@ bool AArch64RedundantCopyElimination::op
>     MBB->addLiveIn(TargetReg);
> 
>   // Clear any kills of TargetReg between CompBr and the last removed COPY.
> -  for (MachineInstr &MMI :
> -       make_range(MBB->begin()->getIterator(), LastChange->getIterator()))
> +  for (MachineInstr &MMI : make_range(MBB->begin(), LastChange))

After-thought: does this do the right thing for bundled instructions?

I.e., should this code be, instead:

    for (MachineInstr &MMI : make_range(MBB->begin().getInstrIterator(),
                                        LastChange.getInstrIterator()))

This matches the old semantics (in the case where there wasn't UB).

>     MMI.clearRegisterKills(SmallestDef, TRI);
> 
>   return true;
> 
> Added: llvm/trunk/test/CodeGen/AArch64/redundant-copy-elim-empty-mbb.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/redundant-copy-elim-empty-mbb.ll?rev=279104&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/AArch64/redundant-copy-elim-empty-mbb.ll (added)
> +++ llvm/trunk/test/CodeGen/AArch64/redundant-copy-elim-empty-mbb.ll Thu Aug 18 12:58:09 2016
> @@ -0,0 +1,29 @@
> +; RUN: llc < %s | FileCheck %s
> +; Make sure we don't crash in AArch64RedundantCopyElimination when a
> +; MachineBasicBlock is empty.  PR29035.
> +
> +target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
> +target triple = "aarch64-unknown-linux-gnu"
> +
> +declare i8* @bar()
> +
> +; CHECK-LABEL: foo:
> +; CHECK: tbz
> +; CHECK: orr
> +; CHECK: ret
> +; CHECK: bl bar
> +; CHECK: cbnz
> +; CHECK: ret
> +define i1 @foo(i1 %start) {
> +entry:
> +  br i1 %start, label %cleanup, label %if.end
> +
> +if.end:                                           ; preds = %if.end, %entry
> +  %call = tail call i8* @bar()
> +  %cmp = icmp eq i8* %call, null
> +  br i1 %cmp, label %cleanup, label %if.end
> +
> +cleanup:                                          ; preds = %if.end, %entry
> +  %retval.0 = phi i1 [ true, %entry ], [ false, %if.end ]
> +  ret i1 %retval.0
> +}
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list