Skip to content

Commit 8d928bc

Browse files
committed
Don't try to sink addresses that we can't recreate
1 parent b7f4b17 commit 8d928bc

File tree

3 files changed

+50
-37
lines changed

3 files changed

+50
-37
lines changed

llvm/lib/CodeGen/CodeGenPrepare.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5790,8 +5790,7 @@ static BasicBlock::iterator findInsertPos(Value *Addr, Instruction *MemoryInst,
57905790
// instruction after it.
57915791
if (SunkAddr) {
57925792
if (Instruction *AddrInst = dyn_cast<Instruction>(SunkAddr))
5793-
return AddrInst->isTerminator() ? MemoryInst->getIterator()
5794-
: std::next(AddrInst->getIterator());
5793+
return std::next(AddrInst->getIterator());
57955794
}
57965795

57975796
// Find the first user of Addr in current BB.
@@ -6100,6 +6099,13 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
61006099
}
61016100

61026101
if (!ResultIndex) {
6102+
auto PtrInst = dyn_cast<Instruction>(ResultPtr);
6103+
// Here we know that we have just a pointer without any offsets. If
6104+
// this pointer comes from a different from the current basic block we
6105+
// need to know how to recreate it in another basic block.
6106+
// Currently we don't support recreation of any of instruction.
6107+
if (PtrInst && PtrInst->getParent() != MemoryInst->getParent())
6108+
return Modified;
61036109
SunkAddr = ResultPtr;
61046110
} else {
61056111
if (ResultPtr->getType() != I8PtrTy)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S -p 'require<profile-summary>,codegenprepare' -cgpp-huge-func=0 < %s | FileCheck %s
3+
4+
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"
5+
target triple = "x86_64-grtev4-linux-gnu"
6+
7+
; Test a scenario when the address cannot be recreated in the current basic block
8+
9+
declare ptr @get_ptr(i64)
10+
define void @address_terminator() personality ptr null {
11+
; CHECK-LABEL: define void @address_terminator() personality ptr null {
12+
; CHECK-NEXT: [[ENTRY:.*:]]
13+
; CHECK-NEXT: [[PTR:%.*]] = invoke ptr @get_ptr(i64 0)
14+
; CHECK-NEXT: to label %[[BODY_1:.*]] unwind label %[[EHCLEANUP:.*]]
15+
; CHECK: [[EHCLEANUP]]:
16+
; CHECK-NEXT: [[PAD:%.*]] = cleanuppad within none []
17+
; CHECK-NEXT: cleanupret from [[PAD]] unwind to caller
18+
; CHECK: [[BODY_1]]:
19+
; CHECK-NEXT: [[GEP1:%.*]] = bitcast ptr [[PTR]] to ptr
20+
; CHECK-NEXT: store <4 x i32> zeroinitializer, ptr [[GEP1]], align 4
21+
; CHECK-NEXT: [[TMP0:%.*]] = bitcast ptr [[PTR]] to ptr
22+
; CHECK-NEXT: [[UNUSED:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4
23+
; CHECK-NEXT: store <4 x i32> zeroinitializer, ptr [[TMP0]], align 4
24+
; CHECK-NEXT: ret void
25+
;
26+
entry:
27+
%ptr = invoke ptr @get_ptr(i64 0) to label %body.1 unwind label %ehcleanup
28+
29+
body.2:
30+
%unused = load <4 x i32>, ptr %gep, align 4
31+
store <4 x i32> zeroinitializer, ptr %gep, align 4
32+
ret void
33+
34+
ehcleanup:
35+
%pad = cleanuppad within none []
36+
cleanupret from %pad unwind to caller
37+
38+
body.1:
39+
%gep = getelementptr { i32 }, ptr %ptr, i64 0, i32 0
40+
store <4 x i32> zeroinitializer, ptr %gep, align 4
41+
br label %body.2
42+
}

llvm/test/Transforms/CodeGenPrepare/X86/sink-addr-reuse.ll

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -42,38 +42,3 @@ bb3:
4242
bb7:
4343
ret void
4444
}
45-
46-
; Test a scenario when the address is the last instruction in the basic block.
47-
48-
define void @adress_terminator() personality ptr null {
49-
; CHECK-LABEL: define void @adress_terminator() personality ptr null {
50-
; CHECK-NEXT: [[ENTRY:.*:]]
51-
; CHECK-NEXT: [[PTR:%.*]] = invoke ptr null(i64 0)
52-
; CHECK-NEXT: to label %[[BODY_1:.*]] unwind label %[[EHCLEANUP:.*]]
53-
; CHECK: [[EHCLEANUP]]:
54-
; CHECK-NEXT: [[TMP0:%.*]] = cleanuppad within none []
55-
; CHECK-NEXT: cleanupret from [[TMP0]] unwind to caller
56-
; CHECK: [[BODY_1]]:
57-
; CHECK-NEXT: [[TMP1:%.*]] = bitcast ptr [[PTR]] to ptr
58-
; CHECK-NEXT: store <4 x i32> zeroinitializer, ptr [[TMP1]], align 4
59-
; CHECK-NEXT: [[V0:%.*]] = load <4 x i32>, ptr [[PTR]], align 4
60-
; CHECK-NEXT: store <4 x i32> zeroinitializer, ptr [[PTR]], align 4
61-
; CHECK-NEXT: ret void
62-
;
63-
entry:
64-
%ptr = invoke ptr null(i64 0) to label %body.1 unwind label %ehcleanup
65-
66-
body.2:
67-
%v0 = load <4 x i32>, ptr %2, align 4
68-
store <4 x i32> zeroinitializer, ptr %2, align 4
69-
ret void
70-
71-
ehcleanup:
72-
%1 = cleanuppad within none []
73-
cleanupret from %1 unwind to caller
74-
75-
body.1:
76-
%2 = getelementptr { i32 }, ptr %ptr, i64 0, i32 0
77-
store <4 x i32> zeroinitializer, ptr %2, align 4
78-
br label %body.2
79-
}

0 commit comments

Comments
 (0)