2012-07-03 02:37:59 +08:00
|
|
|
; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s
|
2012-06-02 03:24:57 +08:00
|
|
|
|
|
|
|
define i32 @f1(i32 %x) {
|
|
|
|
%y = add i32 %z, 1
|
|
|
|
%z = add i32 %x, 1
|
|
|
|
ret i32 %y
|
|
|
|
; CHECK: Instruction does not dominate all uses!
|
|
|
|
; CHECK-NEXT: %z = add i32 %x, 1
|
|
|
|
; CHECK-NEXT: %y = add i32 %z, 1
|
|
|
|
}
|
|
|
|
|
|
|
|
declare i32 @g()
|
2015-06-18 04:52:32 +08:00
|
|
|
define void @f2(i32 %x) personality i32 ()* @g {
|
2012-06-02 03:24:57 +08:00
|
|
|
bb0:
|
|
|
|
%y1 = invoke i32 @g() to label %bb1 unwind label %bb2
|
|
|
|
bb1:
|
|
|
|
ret void
|
|
|
|
bb2:
|
|
|
|
%y2 = phi i32 [%y1, %bb0]
|
2015-06-18 04:52:32 +08:00
|
|
|
%y3 = landingpad i32
|
2012-06-02 03:24:57 +08:00
|
|
|
cleanup
|
|
|
|
ret void
|
2012-06-02 05:56:26 +08:00
|
|
|
; CHECK: Instruction does not dominate all uses!
|
2012-06-02 03:24:57 +08:00
|
|
|
; CHECK-NEXT: %y1 = invoke i32 @g()
|
|
|
|
; CHECK-NEXT: to label %bb1 unwind label %bb2
|
|
|
|
; CHECK-NEXT: %y2 = phi i32 [ %y1, %bb0 ]
|
|
|
|
}
|
|
|
|
|
2015-06-18 04:52:32 +08:00
|
|
|
define void @f3(i32 %x) personality i32 ()* @g {
|
2012-06-02 03:24:57 +08:00
|
|
|
bb0:
|
|
|
|
%y1 = invoke i32 @g() to label %bb1 unwind label %bb2
|
|
|
|
bb1:
|
|
|
|
ret void
|
|
|
|
bb2:
|
2015-06-18 04:52:32 +08:00
|
|
|
%y2 = landingpad i32
|
2012-06-02 03:24:57 +08:00
|
|
|
cleanup
|
|
|
|
br label %bb3
|
|
|
|
bb3:
|
|
|
|
%y3 = phi i32 [%y1, %bb2]
|
|
|
|
ret void
|
2012-06-02 05:56:26 +08:00
|
|
|
; CHECK: Instruction does not dominate all uses!
|
2012-06-02 03:24:57 +08:00
|
|
|
; CHECK-NEXT: %y1 = invoke i32 @g()
|
|
|
|
; CHECK-NEXT: to label %bb1 unwind label %bb2
|
|
|
|
; CHECK-NEXT: %y3 = phi i32 [ %y1, %bb2 ]
|
|
|
|
}
|
|
|
|
|
|
|
|
define void @f4(i32 %x) {
|
|
|
|
bb0:
|
|
|
|
br label %bb1
|
|
|
|
bb1:
|
|
|
|
%y3 = phi i32 [%y1, %bb0]
|
|
|
|
%y1 = add i32 %x, 1
|
|
|
|
ret void
|
|
|
|
; CHECK: Instruction does not dominate all uses!
|
|
|
|
; CHECK-NEXT: %y1 = add i32 %x, 1
|
|
|
|
; CHECK-NEXT: %y3 = phi i32 [ %y1, %bb0 ]
|
|
|
|
}
|
[Verifier] Reject PHIs using defs from own block.
Reject the following IR as malformed (assuming that %entry, %next are
not in a loop):
next:
%y = phi i32 [ 0, %entry ]
%x = phi i32 [ %y, %entry ]
Such PHI nodes came up in PR26718. While there was no consensus on
whether or not this is valid IR, most opinions on that bug and in a
discussion on the llvm-dev mailing list tended towards a
"strict interpretation" (term by Joseph Tremoulet) of PHI node uses.
Also, the language reference explicitly states that "the use of each
incoming value is deemed to occur on the edge from the corresponding
predecessor block to the current block" and
`DominatorTree::dominates(Instruction*, Use&)` uses this definition as
well.
For the code mentioned in PR15384, clang does not compile to such PHIs
(anymore?). The test case still hangs when replacing `%tmp6` with `%tmp`
in revisions before r176366 (where PR15384 has been fixed). The
occurrence of %tmp6 therefore was probably unintentional. Its value is
not used except in other PHIs.
Reviewers: majnemer, reames, JosephTremoulet, bkramer, grosser, jdoerfert, kparzysz, sanjoy
Differential Revision: http://reviews.llvm.org/D18443
llvm-svn: 264528
2016-03-27 07:32:57 +08:00
|
|
|
|
|
|
|
define void @f5() {
|
|
|
|
entry:
|
|
|
|
br label %next
|
|
|
|
|
|
|
|
next:
|
|
|
|
%y = phi i32 [ 0, %entry ]
|
|
|
|
%x = phi i32 [ %y, %entry ]
|
|
|
|
ret void
|
|
|
|
; CHECK: Instruction does not dominate all uses!
|
|
|
|
; CHECK-NEXT: %y = phi i32 [ 0, %entry ]
|
|
|
|
; CHECK-NEXT: %x = phi i32 [ %y, %entry ]
|
|
|
|
}
|
2020-04-17 10:14:21 +08:00
|
|
|
|
|
|
|
define i32 @f6(i32 %x) {
|
|
|
|
bb0:
|
|
|
|
%y1 = callbr i32 asm "", "=r"() to label %bb1 [label %bb2]
|
|
|
|
bb1:
|
|
|
|
ret i32 0
|
|
|
|
bb2:
|
|
|
|
ret i32 %y1
|
|
|
|
; CHECK: Instruction does not dominate all uses!
|
|
|
|
; CHECK-NEXT: %y1 = callbr i32 asm "", "=r"()
|
|
|
|
; CHECK-NEXT: to label %bb1 [label %bb2]
|
|
|
|
; CHECK-NEXT: ret i32 %y1
|
|
|
|
}
|