Bill Schmidt | 82f1c77 | 2015-02-10 19:09:05 +0000 | [diff] [blame] | 1 | ; RUN: llc -march=ppc64 -mcpu=pwr7 -O2 -relocation-model=pic < %s | FileCheck %s |
| 2 | ; RUN: llc -march=ppc64 -mcpu=pwr7 -O2 -relocation-model=pic < %s | grep "__tls_get_addr" | count 1 |
| 3 | |
| 4 | ; This test was derived from LLVM's own |
| 5 | ; PrettyStackTraceEntry::~PrettyStackTraceEntry(). It demonstrates an |
| 6 | ; opportunity for CSE of calls to __tls_get_addr(). |
| 7 | |
| 8 | target datalayout = "e-m:e-i64:64-n32:64" |
| 9 | target triple = "powerpc64le-unknown-linux-gnu" |
| 10 | |
| 11 | %"class.llvm::PrettyStackTraceEntry" = type { i32 (...)**, %"class.llvm::PrettyStackTraceEntry"* } |
| 12 | |
| 13 | @_ZTVN4llvm21PrettyStackTraceEntryE = unnamed_addr constant [5 x i8*] [i8* null, i8* null, i8* bitcast (void (%"class.llvm::PrettyStackTraceEntry"*)* @_ZN4llvm21PrettyStackTraceEntryD2Ev to i8*), i8* bitcast (void (%"class.llvm::PrettyStackTraceEntry"*)* @_ZN4llvm21PrettyStackTraceEntryD0Ev to i8*), i8* bitcast (void ()* @__cxa_pure_virtual to i8*)], align 8 |
| 14 | @_ZL20PrettyStackTraceHead = internal thread_local unnamed_addr global %"class.llvm::PrettyStackTraceEntry"* null, align 8 |
| 15 | @.str = private unnamed_addr constant [87 x i8] c"PrettyStackTraceHead == this && \22Pretty stack trace entry destruction is out of order\22\00", align 1 |
| 16 | @.str1 = private unnamed_addr constant [64 x i8] c"/home/wschmidt/llvm/llvm-test2/lib/Support/PrettyStackTrace.cpp\00", align 1 |
| 17 | @__PRETTY_FUNCTION__._ZN4llvm21PrettyStackTraceEntryD2Ev = private unnamed_addr constant [62 x i8] c"virtual llvm::PrettyStackTraceEntry::~PrettyStackTraceEntry()\00", align 1 |
| 18 | |
| 19 | declare void @_ZN4llvm21PrettyStackTraceEntryD2Ev(%"class.llvm::PrettyStackTraceEntry"* %this) unnamed_addr |
| 20 | declare void @__cxa_pure_virtual() |
| 21 | declare void @__assert_fail(i8*, i8*, i32 zeroext, i8*) |
| 22 | declare void @_ZdlPv(i8*) |
| 23 | |
| 24 | define void @_ZN4llvm21PrettyStackTraceEntryD0Ev(%"class.llvm::PrettyStackTraceEntry"* %this) unnamed_addr align 2 { |
| 25 | entry: |
David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 26 | %0 = getelementptr inbounds %"class.llvm::PrettyStackTraceEntry", %"class.llvm::PrettyStackTraceEntry"* %this, i64 0, i32 0 |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame^] | 27 | store i32 (...)** bitcast (i8** getelementptr inbounds ([5 x i8*], [5 x i8*]* @_ZTVN4llvm21PrettyStackTraceEntryE, i64 0, i64 2) to i32 (...)**), i32 (...)*** %0, align 8 |
David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 28 | %1 = load %"class.llvm::PrettyStackTraceEntry"*, %"class.llvm::PrettyStackTraceEntry"** @_ZL20PrettyStackTraceHead, align 8 |
Bill Schmidt | 82f1c77 | 2015-02-10 19:09:05 +0000 | [diff] [blame] | 29 | %cmp.i = icmp eq %"class.llvm::PrettyStackTraceEntry"* %1, %this |
| 30 | br i1 %cmp.i, label %_ZN4llvm21PrettyStackTraceEntryD2Ev.exit, label %cond.false.i |
| 31 | |
| 32 | cond.false.i: ; preds = %entry |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame^] | 33 | tail call void @__assert_fail(i8* getelementptr inbounds ([87 x i8], [87 x i8]* @.str, i64 0, i64 0), i8* getelementptr inbounds ([64 x i8], [64 x i8]* @.str1, i64 0, i64 0), i32 zeroext 119, i8* getelementptr inbounds ([62 x i8], [62 x i8]* @__PRETTY_FUNCTION__._ZN4llvm21PrettyStackTraceEntryD2Ev, i64 0, i64 0)) |
Bill Schmidt | 82f1c77 | 2015-02-10 19:09:05 +0000 | [diff] [blame] | 34 | unreachable |
| 35 | |
| 36 | _ZN4llvm21PrettyStackTraceEntryD2Ev.exit: ; preds = %entry |
David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 37 | %NextEntry.i.i = getelementptr inbounds %"class.llvm::PrettyStackTraceEntry", %"class.llvm::PrettyStackTraceEntry"* %this, i64 0, i32 1 |
Bill Schmidt | 82f1c77 | 2015-02-10 19:09:05 +0000 | [diff] [blame] | 38 | %2 = bitcast %"class.llvm::PrettyStackTraceEntry"** %NextEntry.i.i to i64* |
David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 39 | %3 = load i64, i64* %2, align 8 |
Bill Schmidt | 82f1c77 | 2015-02-10 19:09:05 +0000 | [diff] [blame] | 40 | store i64 %3, i64* bitcast (%"class.llvm::PrettyStackTraceEntry"** @_ZL20PrettyStackTraceHead to i64*), align 8 |
| 41 | %4 = bitcast %"class.llvm::PrettyStackTraceEntry"* %this to i8* |
| 42 | tail call void @_ZdlPv(i8* %4) |
| 43 | ret void |
| 44 | } |
| 45 | |
| 46 | ; CHECK-LABEL: _ZN4llvm21PrettyStackTraceEntryD0Ev: |
| 47 | ; CHECK: addis [[REG1:[0-9]+]], 2, _ZL20PrettyStackTraceHead@got@tlsld@ha |
| 48 | ; CHECK: addi 3, [[REG1]], _ZL20PrettyStackTraceHead@got@tlsld@l |
| 49 | ; CHECK: bl __tls_get_addr(_ZL20PrettyStackTraceHead@tlsld) |
| 50 | ; CHECK: addis 3, 3, _ZL20PrettyStackTraceHead@dtprel@ha |
| 51 | ; CHECK: ld {{[0-9]+}}, _ZL20PrettyStackTraceHead@dtprel@l(3) |
| 52 | ; CHECK: std {{[0-9]+}}, _ZL20PrettyStackTraceHead@dtprel@l(3) |