Issue 149776
Summary [LoopInterchange] Can only replace phis iff the uses are in the loop nest exit
Labels new issue
Assignees
Reporter sjoerdmeijer
    For the reproducers, see also: https://godbolt.org/z/3W6eMxsMh

For this input:

```
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32"
target triple = "aarch64-unknown-linux-gnu"

define void @_Z1fisPi() {
entry:
 br label %for.body

for.cond.for.cond.cleanup_crit_edge.split.loopexit:
 ret void

for.body:
  %.us-phi495254 = phi i16 [ %.sroa.speculated, %for.cond1.for.cond.cleanup2_crit_edge.split ], [ 0, %entry ]
  br label %for.body3

for.cond1.for.cond.cleanup2_crit_edge.split:
  br i1 false, label %for.body, label %for.cond.for.cond.cleanup_crit_edge.split.loopexit

for.body3:
  %m.047 = phi i32 [ 0, %for.body ], [ %add20, %for.cond.cleanup15.split ]
  %0 = phi i16 [ %.us-phi495254, %for.body ], [ %.sroa.speculated, %for.cond.cleanup15.split ]
  br label %for.body16

for.cond.cleanup15.split:
  %.sroa.speculated = tail call i16 @llvm.umax.i16(i16 %0, i16 0)
  %add20 = add i32 %m.047, 1
  br i1 true, label %for.cond1.for.cond.cleanup2_crit_edge.split, label %for.body3

for.body16:
  br i1 false, label %for.body16, label %for.cond.cleanup15.split

; uselistorder directives
  uselistorder i16 %.sroa.speculated, { 1, 0 }
}

declare i16 @llvm.umax.i16(i16, i16) #0

attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
```

Compile with:

```
-S -passes=loop-interchange --disable-output -loop-interchange-profitabilities=ignore
```

to run into this assert:

```
opt: /root/llvm-project/llvm/lib/Transforms/Scalar/LoopInterchange.cpp:1711: void moveLCSSAPhis(llvm::BasicBlock*, llvm::BasicBlock*, llvm::BasicBlock*, llvm::BasicBlock*, llvm::BasicBlock*, llvm::BasicBlock*, llvm::Loop*, llvm::LoopInfo*): Assertion `all_of(P.users(), [OuterHeader, OuterExit, IncI, InnerHeader](User *U) { return (cast<PHINode>(U)->getParent() == OuterHeader && IncI->getParent() == InnerHeader) || cast<PHINode>(U)->getParent() == OuterExit; }) && "Can only replace phis iff the uses are in the loop nest exit or " "the incoming value is defined in the inner header (it will " "dominate all loop blocks after interchanging)"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.	Program arguments: /opt/compiler-explorer/clang-assertions-trunk/bin/opt -o /app/output.s -S -S -passes=loop-interchange --disable-output -loop-interchange-profitabilities=ignore <source>
1.	Running pass "function(loop(loop-interchange))" on module "<source>"
2.	Running pass "loop(loop-interchange)" on function "_Z1fisPi"
```

The stack trace:

```
 #0 0x0000aaaaae8e9074 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /llvm-project/llvm/lib/Support/Unix/Signals.inc:834:11
 #1 0x0000aaaaae8e9594 PrintStackTraceSignalHandler(void*) /llvm-project/llvm/lib/Support/Unix/Signals.inc:918:1
 #2 0x0000aaaaae8e7634 llvm::sys::RunSignalHandlers() /llvm-project/llvm/lib/Support/Signals.cpp:104:5
 #3 0x0000aaaaae8e9d5c SignalHandler(int, siginfo_t*, void*) /llvm-project/llvm/lib/Support/Unix/Signals.inc:426:38
 #4 0x0000fffff7fb09d0 (linux-vdso.so.1+0x9d0)
 #5 0x0000fffff7a1f200 __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #6 0x0000fffff79da67c gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #7 0x0000fffff79c7130 abort ./stdlib/abort.c:81:7
 #8 0x0000fffff79d3fd0 __assert_fail_base ./assert/assert.c:89:7
 #9 0x0000fffff79d4040 __assert_perror_fail ./assert/assert-perr.c:31:1
#10 0x0000aaaab0fc0e24 moveLCSSAPhis(llvm::BasicBlock*, llvm::BasicBlock*, llvm::BasicBlock*, llvm::BasicBlock*, llvm::BasicBlock*, llvm::BasicBlock*, llvm::Loop*, llvm::LoopInfo*) /llvm-project/llvm/lib/Transforms/Scalar/LoopInterchange.cpp:1639:5
#11 0x0000aaaab0fc0094 (anonymous namespace)::LoopInterchangeTransform::adjustLoopBranches() /llvm-project/llvm/lib/Transforms/Scalar/LoopInterchange.cpp:1808:3
#12 0x0000aaaab0fbfa70 (anonymous namespace)::LoopInterchangeTransform::adjustLoopLinks() /llvm-project/llvm/lib/Transforms/Scalar/LoopInterchange.cpp:1856:18
#13 0x0000aaaab0fb91f4 (anonymous namespace)::LoopInterchangeTransform::transform() /llvm-project/llvm/lib/Transforms/Scalar/LoopInterchange.cpp:1542:18
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to