
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
30 lines
606 B
LLVM
30 lines
606 B
LLVM
; RUN: opt -verify-memoryssa -passes=loop-rotate %s -S | FileCheck %s
|
|
; REQUIRES: asserts
|
|
|
|
; CHECK-LABEL: @test(i1 %arg)
|
|
define dso_local void @test(i1 %arg) {
|
|
entry:
|
|
br label %preheader
|
|
|
|
preheader:
|
|
br label %l39
|
|
|
|
l39:
|
|
%v40 = phi ptr [ @foo, %preheader ], [ %v43, %crit_edge ]
|
|
%v41 = call float %v40(float undef)
|
|
%v42 = load i32, ptr undef, align 8
|
|
br i1 %arg, label %crit_edge, label %loopexit
|
|
|
|
crit_edge:
|
|
%v43 = load ptr, ptr undef, align 8
|
|
br label %l39
|
|
|
|
loopexit:
|
|
unreachable
|
|
}
|
|
|
|
; Function Attrs: readnone
|
|
declare dso_local float @foo(float) #0 align 32
|
|
|
|
attributes #0 = { readnone }
|