
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
52 lines
1.9 KiB
LLVM
52 lines
1.9 KiB
LLVM
; RUN: opt -verify-memoryssa -passes='loop-mssa(loop-rotate)' -S %s | FileCheck %s
|
|
; REQUIRES: asserts
|
|
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-grtev4-linux-gnu"
|
|
|
|
; Check verification passes after loop rotate, when adding phis in blocks
|
|
; receiving incoming edges and adding phis in IDF blocks.
|
|
; CHECK-LABEL: @f
|
|
define void @f(i1 %arg) align 32 {
|
|
entry:
|
|
br label %while.cond.outer
|
|
|
|
while.cond80.while.cond.loopexit_crit_edge: ; preds = %if.else99
|
|
br label %while.cond.outer
|
|
|
|
while.cond.outer: ; preds = %while.cond80.while.cond.loopexit_crit_edge, %entry
|
|
br i1 %arg, label %while.cond.outer.return.loopexit2_crit_edge, label %while.body.lr.ph
|
|
|
|
while.body.lr.ph: ; preds = %while.cond.outer
|
|
br label %while.body
|
|
|
|
while.body: ; preds = %while.body.lr.ph
|
|
br i1 %arg, label %if.then42, label %if.end61
|
|
|
|
if.then42: ; preds = %while.body
|
|
br label %return.loopexit2
|
|
|
|
if.end61: ; preds = %while.body
|
|
br label %while.body82
|
|
|
|
while.body82: ; preds = %if.end61
|
|
br i1 %arg, label %return.loopexit, label %if.else99
|
|
|
|
if.else99: ; preds = %while.body82
|
|
store i32 0, ptr inttoptr (i64 44 to ptr), align 4
|
|
br label %while.cond80.while.cond.loopexit_crit_edge
|
|
|
|
return.loopexit: ; preds = %while.body82
|
|
br label %return
|
|
|
|
while.cond.outer.return.loopexit2_crit_edge: ; preds = %while.cond.outer
|
|
br label %return.loopexit2
|
|
|
|
return.loopexit2: ; preds = %while.cond.outer.return.loopexit2_crit_edge, %if.then42
|
|
br label %return
|
|
|
|
return: ; preds = %return.loopexit2, %return.loopexit
|
|
ret void
|
|
}
|
|
|