
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
43 lines
1.2 KiB
LLVM
43 lines
1.2 KiB
LLVM
; RUN: llvm-dis < %s.bc | FileCheck %s
|
|
|
|
define void @loop_nesting(i1 %arg) convergent {
|
|
A:
|
|
; CHECK-LABEL: A:
|
|
; CHECK: [[A:%.*]] = call token @llvm.experimental.convergence.entry()
|
|
;
|
|
%a = call token @llvm.experimental.convergence.entry()
|
|
br label %B
|
|
|
|
B:
|
|
; CHECK-LABEL: B:
|
|
; CHECK: [[B:%.*]] = call token @llvm.experimental.convergence.anchor()
|
|
;
|
|
%b = call token @llvm.experimental.convergence.anchor()
|
|
br i1 %arg, label %C, label %D
|
|
|
|
C:
|
|
; CHECK-LABEL: C:
|
|
; CHECK: [[C:%.*]] = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token [[B]]) ]
|
|
; CHEC K: call void @f() [ "convergencectrl"(token [[C]]) ]
|
|
;
|
|
%c = call token @llvm.experimental.convergence.loop() [ "convergencectrl"(token %b) ]
|
|
call void @f() [ "convergencectrl"(token %c) ]
|
|
br label %B
|
|
|
|
D:
|
|
; CHECK-LABEL: D:
|
|
; CHECK: call void @f() [ "convergencectrl"(token [[B]]) ]
|
|
;
|
|
call void @f() [ "convergencectrl"(token %b) ]
|
|
br i1 %arg, label %B, label %E
|
|
|
|
E:
|
|
ret void
|
|
}
|
|
|
|
declare void @f() convergent
|
|
|
|
declare token @llvm.experimental.convergence.entry()
|
|
declare token @llvm.experimental.convergence.anchor()
|
|
declare token @llvm.experimental.convergence.loop()
|