
As defined in LangRef, branching on `undef` is undefined behavior. This PR aims to remove undefined behavior from tests. As UB tests break Alive2 and may be the root cause of breaking future optimizations. Here's an Alive2 proof for one of the examples: https://alive2.llvm.org/ce/z/TncxhP
27 lines
800 B
LLVM
27 lines
800 B
LLVM
; RUN: opt -passes='print<memoryssa>' -disable-output %s 2>&1 | FileCheck %s
|
|
|
|
; Note: if @foo is modelled as a MemoryDef, this test will assert with -loop-rotate, due to MemorySSA not
|
|
; being preserved when moving instructions that may not read from or write to memory.
|
|
|
|
; CHECK-LABEL: @main
|
|
; CHECK-NOT: MemoryDef
|
|
define void @main(i1 %arg) {
|
|
entry:
|
|
br label %for.cond120
|
|
|
|
for.cond120: ; preds = %for.body127, %entry
|
|
call void @foo(i1 %arg)
|
|
br i1 %arg, label %for.body127, label %for.cond.cleanup126
|
|
|
|
for.cond.cleanup126: ; preds = %for.cond120
|
|
unreachable
|
|
|
|
for.body127: ; preds = %for.cond120
|
|
%0 = load ptr, ptr undef, align 1
|
|
br label %for.cond120
|
|
}
|
|
|
|
declare void @foo() readnone
|
|
|
|
|