llvm.org GIT mirror llvm / aac32f3
Merging r251582: ------------------------------------------------------------------------ r251582 | hfinkel | 2015-10-28 19:43:00 -0400 (Wed, 28 Oct 2015) | 11 lines [PowerPC] Recurse through constants when looking for TLS globals We cannot form ctr-based loops around function calls, including calls to __tls_get_addr used for PIC TLS variables. References to such TLS variables, however, might be buried within constant expressions, and so we need to search the entire constant expression to be sure that no references to such TLS variables exist. Fixes PR25256, reported by Eric Schweitz. This is a slightly-modified version of the patch suggested by Eric in the bug report, and a test case I created. ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_37@253120 91177308-0d34-0410-b5e6-96231b3b80d8 Tom Stellard 3 years ago
2 changed file(s) with 50 addition(s) and 2 deletion(s). Raw diff Collapse all Expand all
196196 // Determining the address of a TLS variable results in a function call in
197197 // certain TLS models.
198198 static bool memAddrUsesCTR(const PPCTargetMachine *TM,
199 const llvm::Value *MemAddr) {
199 const Value *MemAddr) {
200200 const auto *GV = dyn_cast(MemAddr);
201 if (!GV)
201 if (!GV) {
202 // Recurse to check for constants that refer to TLS global variables.
203 if (const auto *CV = dyn_cast(MemAddr))
204 for (const auto &CO : CV->operands())
205 if (memAddrUsesCTR(TM, CO))
206 return true;
207
202208 return false;
209 }
210
203211 if (!GV->isThreadLocal())
204212 return false;
205213 if (!TM)
0 ; RUN: llc -mcpu=pwr7 -relocation-model=pic < %s | FileCheck %s
1 target datalayout = "E-m:e-i64:64-n32:64"
2 target triple = "powerpc64-unknown-linux-gnu"
3
4 @x = thread_local global [1600 x i32] zeroinitializer, align 4
5
6 ; Function Attrs: nounwind
7 define void @foo(i32 signext %v) #0 {
8 entry:
9 br label %vector.body
10
11 vector.body: ; preds = %vector.body, %entry
12 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]
13 %induction5 = or i64 %index, 1
14 %0 = getelementptr inbounds [1600 x i32], [1600 x i32]* @x, i64 0, i64 %index
15 %1 = getelementptr inbounds [1600 x i32], [1600 x i32]* @x, i64 0, i64 %induction5
16 %2 = load i32, i32* %0, align 4
17 %3 = load i32, i32* %1, align 4
18 %4 = add nsw i32 %2, %v
19 %5 = add nsw i32 %3, %v
20 store i32 %4, i32* %0, align 4
21 store i32 %5, i32* %1, align 4
22 %index.next = add i64 %index, 2
23 %6 = icmp eq i64 %index.next, 1600
24 br i1 %6, label %for.cond.cleanup, label %vector.body
25
26 for.cond.cleanup: ; preds = %vector.body
27 ret void
28 }
29
30 ; CHECK-LABEL: @foo
31 ; CHECK-NOT: mtctr
32 ; CHECK: __tls_get_addr
33
34 attributes #0 = { nounwind }
35
36 !llvm.module.flags = !{!0}
37
38 !0 = !{i32 1, !"PIC Level", i32 2}
39