[llvm] r339417 - [NFC] Add tests that demonstrate that MustExecute is fundamentally broken

Max Kazantsev via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 10 02:20:46 PDT 2018


Author: mkazantsev
Date: Fri Aug 10 02:20:46 2018
New Revision: 339417

URL: http://llvm.org/viewvc/llvm-project?rev=339417&view=rev
Log:
[NFC] Add tests that demonstrate that MustExecute is fundamentally broken

Added:
    llvm/trunk/test/Analysis/MustExecute/infinite_loops.ll
    llvm/trunk/test/Transforms/LICM/infinite_loops.ll

Added: llvm/trunk/test/Analysis/MustExecute/infinite_loops.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/MustExecute/infinite_loops.ll?rev=339417&view=auto
==============================================================================
--- llvm/trunk/test/Analysis/MustExecute/infinite_loops.ll (added)
+++ llvm/trunk/test/Analysis/MustExecute/infinite_loops.ll Fri Aug 10 02:20:46 2018
@@ -0,0 +1,118 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -disable-output -print-mustexecute %s 2>&1 | FileCheck %s
+
+; Infinite loop.
+; TODO: backedge is provably mustexecute, but the analysis does not know this.
+define void @test_no_exit_block(i1 %cond, i32 %a, i32 %b) {
+; CHECK-LABEL: @test_no_exit_block(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br label [[LOOP:%.*]]
+; CHECK:       loop:
+; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ] ; (mustexec in: loop)
+; CHECK-NEXT:    br i1 [[COND:%.*]], label [[MAYBE_TAKEN:%.*]], label [[BACKEDGE]] ; (mustexec in: loop)
+
+; FIXME: Should be mustexec in backedge. The current analysis does not handle
+; loops without exit blocks at all.
+; CHECK-NOT:   ; (mustexec in: loop)
+
+; CHECK:       maybe_taken:
+; CHECK-NEXT:    [[DIV:%.*]] = sdiv i32 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    br label [[BACKEDGE]]
+; CHECK:       backedge:
+; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1
+; CHECK-NEXT:    br label [[LOOP]]
+;
+entry:
+  br label %loop
+
+loop:
+  %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
+  br i1 %cond, label %maybe_taken, label %backedge
+
+maybe_taken:
+  %div = sdiv i32 %a, %b
+  br label %backedge
+
+backedge:
+  %iv.next = add i32 %iv, 1
+  br label %loop
+}
+
+; Unlike the test before, we can say that backedge is mustexec, which is the
+; correct behavior.
+define void @test_impossible_exit_on_latch(i1 %cond, i32 %a, i32 %b) {
+; CHECK-LABEL: @test_impossible_exit_on_latch(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br label [[LOOP:%.*]]
+; CHECK:       loop:
+; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ] ; (mustexec in: loop)
+; CHECK-NEXT:    br i1 [[COND:%.*]], label [[MAYBE_TAKEN:%.*]], label [[BACKEDGE]] ; (mustexec in: loop)
+; CHECK:       maybe_taken:
+; CHECK-NEXT:    [[DIV:%.*]] = sdiv i32 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    br label [[BACKEDGE]]
+; CHECK:       backedge:
+; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1 ; (mustexec in: loop)
+; CHECK-NEXT:    br i1 true, label [[LOOP]], label [[EXIT:%.*]] ; (mustexec in: loop)
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+entry:
+  br label %loop
+
+loop:
+  %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
+  br i1 %cond, label %maybe_taken, label %backedge
+
+maybe_taken:
+  %div = sdiv i32 %a, %b
+  br label %backedge
+
+backedge:
+  %iv.next = add i32 %iv, 1
+  br i1 true, label %loop, label %exit
+
+exit:
+  ret void
+}
+
+; FIXME: This code demonstrates a bug. %div should not be mustexec.
+define void @test_impossible_exit_in_untaken_block(i1 %cond, i32 %a, i32 %b, i32* %p) {
+; CHECK-LABEL: @test_impossible_exit_in_untaken_block(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br label [[LOOP:%.*]]
+; CHECK:       loop:
+; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ] ; (mustexec in: loop)
+; CHECK-NEXT:    br i1 [[COND:%.*]], label [[MAYBE_TAKEN:%.*]], label [[BACKEDGE]] ; (mustexec in: loop)
+; CHECK:       maybe_taken:
+
+; FIXME: The block below is NOT always taken!!! Current this example demonstrates a
+;        bug in current mustexecute analysis.
+
+; CHECK-NEXT:    [[DIV:%.*]] = sdiv i32 [[A:%.*]], [[B:%.*]] ; (mustexec in: loop)
+; CHECK-NEXT:    store i32 [[DIV]], i32* [[P:%.*]] ; (mustexec in: loop)
+; CHECK-NEXT:    br i1 true, label [[BACKEDGE]], label [[EXIT:%.*]] ; (mustexec in: loop)
+; CHECK:       backedge:
+; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1 ; (mustexec in: loop)
+; CHECK-NEXT:    br label [[LOOP]] ; (mustexec in: loop)
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+entry:
+  br label %loop
+
+loop:
+  %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
+  br i1 %cond, label %maybe_taken, label %backedge
+
+maybe_taken:
+  %div = sdiv i32 %a, %b
+  store i32 %div, i32* %p
+  br i1 true, label %backedge, label %exit
+
+backedge:
+  %iv.next = add i32 %iv, 1
+  br label %loop
+
+exit:
+  ret void
+}

Added: llvm/trunk/test/Transforms/LICM/infinite_loops.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LICM/infinite_loops.ll?rev=339417&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/LICM/infinite_loops.ll (added)
+++ llvm/trunk/test/Transforms/LICM/infinite_loops.ll Fri Aug 10 02:20:46 2018
@@ -0,0 +1,42 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -basicaa -licm < %s | FileCheck %s
+; RUN: opt -aa-pipeline=basic-aa -passes='require<opt-remark-emit>,loop(licm)' -S %s | FileCheck %s
+
+; FIXME: This test demonstrates a bug in MustExecute analysis. We hoist sdiv
+;        which can be a division by zero from a block which is never taken.
+define void @test_impossible_exit_in_untaken_block(i32 %a, i32 %b, i32* %p) {
+; CHECK-LABEL: @test_impossible_exit_in_untaken_block(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[DIV:%.*]] = sdiv i32 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    br label [[LOOP:%.*]]
+; CHECK:       loop:
+; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
+; CHECK-NEXT:    br i1 false, label [[NEVER_TAKEN:%.*]], label [[BACKEDGE]]
+; CHECK:       never_taken:
+; CHECK-NEXT:    br i1 true, label [[BACKEDGE]], label [[EXIT:%.*]]
+; CHECK:       backedge:
+; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1
+; CHECK-NEXT:    br label [[LOOP]]
+; CHECK:       exit:
+; CHECK-NEXT:    store i32 [[DIV]], i32* [[P:%.*]], align 4
+; CHECK-NEXT:    ret void
+;
+entry:
+  br label %loop
+
+loop:
+  %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
+  br i1 false, label %never_taken, label %backedge
+
+never_taken:
+  %div = sdiv i32 %a, %b
+  store i32 %div, i32* %p
+  br i1 true, label %backedge, label %exit
+
+backedge:
+  %iv.next = add i32 %iv, 1
+  br label %loop
+
+exit:
+  ret void
+}




More information about the llvm-commits mailing list