diff --git a/llvm/test/Transforms/LoopDeletion/pr57837-invalidate-scev-after-hoisting.ll b/llvm/test/Transforms/LoopDeletion/pr57837-invalidate-scev-after-hoisting.ll index 0635540a8eea0e..ad04c42c793559 100644 --- a/llvm/test/Transforms/LoopDeletion/pr57837-invalidate-scev-after-hoisting.ll +++ b/llvm/test/Transforms/LoopDeletion/pr57837-invalidate-scev-after-hoisting.ll @@ -1,6 +1,8 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -passes='loop(indvars,loop-deletion),verify,print' -S %s 2>&1| FileCheck %s +; XFAIL: * + ; Make sure the SCEV for %invar is invalidated properly when the instruction is ; moved by LoopDeletion. @@ -73,3 +75,34 @@ exit: } declare void @use(i32) + + +define i32 @scev_invalidation_after_deleting(ptr %src) { +entry: + br label %outer.header + +outer.header: + %outer.iv = phi i32 [ 0, %entry ], [ %outer.iv.next, %outer.latch ] + br label %inner.1 + +inner.1: + %c.1 = icmp eq i32 0, %outer.iv + br i1 %c.1, label %inner.2, label %inner.1 + +inner.2: + %iv.2 = phi i64 [ 0, %inner.1 ], [ %iv.2.next, %inner.2 ] + %iv.2.next = add nuw i64 %iv.2, 1 + br i1 true, label %inner.3.ph, label %inner.2 + +inner.3.ph: + %trunc = trunc i64 %iv.2 to i32 + br label %inner.3 + +inner.3: + %l = load i32, ptr %src, align 4 + br i1 false, label %outer.latch, label %inner.3 + +outer.latch: + %outer.iv.next = add nsw i32 %l, %trunc + br label %outer.header +}