Skip to content

Commit 0b67fe8

Browse files
author
git apple-llvm automerger
committed
Merge commit 'af68927a831c' from llvm.org/main into next
2 parents 7fea5f5 + af68927 commit 0b67fe8

File tree

2 files changed

+68
-4
lines changed

2 files changed

+68
-4
lines changed

llvm/lib/IR/Instruction.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,10 +1233,7 @@ Instruction::getNextNonDebugInstruction(bool SkipPseudoOp) const {
12331233
const Instruction *
12341234
Instruction::getPrevNonDebugInstruction(bool SkipPseudoOp) const {
12351235
for (const Instruction *I = getPrevNode(); I; I = I->getPrevNode())
1236-
if (!isa<DbgInfoIntrinsic>(I) &&
1237-
!(SkipPseudoOp && isa<PseudoProbeInst>(I)) &&
1238-
!(isa<IntrinsicInst>(I) &&
1239-
cast<IntrinsicInst>(I)->getIntrinsicID() == Intrinsic::fake_use))
1236+
if (!isa<DbgInfoIntrinsic>(I) && !(SkipPseudoOp && isa<PseudoProbeInst>(I)))
12401237
return I;
12411238
return nullptr;
12421239
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -p="simplifycfg<sink-common-insts>" -S < %s | FileCheck %s
3+
4+
;; Verify that fake uses are not ignored when sinking instructions in
5+
;; SimplifyCFG; when a fake use appears in only one incoming block they prevent
6+
;; further sinking, and when identical fake uses appear on both sides they
7+
;; are sunk normally.
8+
9+
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
10+
target triple = "x86_64-unknown-linux-gnu"
11+
12+
define void @foo(i1 %bool, ptr %p) {
13+
; CHECK-LABEL: define void @foo(
14+
; CHECK-SAME: i1 [[BOOL:%.*]], ptr [[P:%.*]]) {
15+
; CHECK-NEXT: [[ENTRY:.*:]]
16+
; CHECK-NEXT: br i1 [[BOOL]], label %[[IF_ELSE:.*]], label %[[IF_THEN:.*]]
17+
; CHECK: [[COMMON_RET:.*]]:
18+
; CHECK-NEXT: ret void
19+
; CHECK: [[IF_THEN]]:
20+
; CHECK-NEXT: store ptr [[P]], ptr [[P]], align 8
21+
; CHECK-NEXT: br label %[[COMMON_RET]]
22+
; CHECK: [[IF_ELSE]]:
23+
; CHECK-NEXT: store ptr [[P]], ptr [[P]], align 8
24+
; CHECK-NEXT: notail call void (...) @llvm.fake.use(ptr [[P]])
25+
; CHECK-NEXT: br label %[[COMMON_RET]]
26+
;
27+
entry:
28+
br i1 %bool, label %if.else, label %if.then
29+
30+
common.ret: ; preds = %if.else, %if.then
31+
ret void
32+
33+
if.then: ; preds = %entry
34+
store ptr %p, ptr %p, align 8
35+
br label %common.ret
36+
37+
if.else: ; preds = %entry
38+
store ptr %p, ptr %p, align 8
39+
notail call void (...) @llvm.fake.use(ptr %p)
40+
br label %common.ret
41+
}
42+
43+
define void @bar(i1 %bool, ptr %p) {
44+
; CHECK-LABEL: define void @bar(
45+
; CHECK-SAME: i1 [[BOOL:%.*]], ptr [[P:%.*]]) {
46+
; CHECK-NEXT: [[ENTRY:.*:]]
47+
; CHECK-NEXT: store ptr [[P]], ptr [[P]], align 8
48+
; CHECK-NEXT: notail call void (...) @llvm.fake.use(ptr [[P]])
49+
; CHECK-NEXT: ret void
50+
;
51+
entry:
52+
br i1 %bool, label %if.else, label %if.then
53+
54+
common.ret: ; preds = %if.else, %if.then
55+
ret void
56+
57+
if.then: ; preds = %entry
58+
store ptr %p, ptr %p, align 8
59+
notail call void (...) @llvm.fake.use(ptr %p)
60+
br label %common.ret
61+
62+
if.else: ; preds = %entry
63+
store ptr %p, ptr %p, align 8
64+
notail call void (...) @llvm.fake.use(ptr %p)
65+
br label %common.ret
66+
}
67+

0 commit comments

Comments
 (0)