1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=ppc64 -mcpu=pwr7 -O2 -relocation-model=pic < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=ppc64 -mcpu=pwr7 -O2 -relocation-model=pic < %s | grep "__tls_get_addr" | count 1 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; This test was derived from LLVM's own 5*9880d681SAndroid Build Coastguard Worker; PrettyStackTraceEntry::~PrettyStackTraceEntry(). It demonstrates an 6*9880d681SAndroid Build Coastguard Worker; opportunity for CSE of calls to __tls_get_addr(). 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-i64:64-n32:64" 9*9880d681SAndroid Build Coastguard Workertarget triple = "powerpc64le-unknown-linux-gnu" 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker%"class.llvm::PrettyStackTraceEntry" = type { i32 (...)**, %"class.llvm::PrettyStackTraceEntry"* } 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker@_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*9880d681SAndroid Build Coastguard Worker@_ZL20PrettyStackTraceHead = internal thread_local unnamed_addr global %"class.llvm::PrettyStackTraceEntry"* null, align 8 15*9880d681SAndroid Build Coastguard Worker@.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*9880d681SAndroid Build Coastguard Worker@.str1 = private unnamed_addr constant [64 x i8] c"/home/wschmidt/llvm/llvm-test2/lib/Support/PrettyStackTrace.cpp\00", align 1 17*9880d681SAndroid Build Coastguard Worker@__PRETTY_FUNCTION__._ZN4llvm21PrettyStackTraceEntryD2Ev = private unnamed_addr constant [62 x i8] c"virtual llvm::PrettyStackTraceEntry::~PrettyStackTraceEntry()\00", align 1 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdeclare void @_ZN4llvm21PrettyStackTraceEntryD2Ev(%"class.llvm::PrettyStackTraceEntry"* %this) unnamed_addr 20*9880d681SAndroid Build Coastguard Workerdeclare void @__cxa_pure_virtual() 21*9880d681SAndroid Build Coastguard Workerdeclare void @__assert_fail(i8*, i8*, i32 zeroext, i8*) 22*9880d681SAndroid Build Coastguard Workerdeclare void @_ZdlPv(i8*) 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine void @_ZN4llvm21PrettyStackTraceEntryD0Ev(%"class.llvm::PrettyStackTraceEntry"* %this) unnamed_addr align 2 { 25*9880d681SAndroid Build Coastguard Workerentry: 26*9880d681SAndroid Build Coastguard Worker %0 = getelementptr inbounds %"class.llvm::PrettyStackTraceEntry", %"class.llvm::PrettyStackTraceEntry"* %this, i64 0, i32 0 27*9880d681SAndroid Build Coastguard Worker store i32 (...)** bitcast (i8** getelementptr inbounds ([5 x i8*], [5 x i8*]* @_ZTVN4llvm21PrettyStackTraceEntryE, i64 0, i64 2) to i32 (...)**), i32 (...)*** %0, align 8 28*9880d681SAndroid Build Coastguard Worker %1 = load %"class.llvm::PrettyStackTraceEntry"*, %"class.llvm::PrettyStackTraceEntry"** @_ZL20PrettyStackTraceHead, align 8 29*9880d681SAndroid Build Coastguard Worker %cmp.i = icmp eq %"class.llvm::PrettyStackTraceEntry"* %1, %this 30*9880d681SAndroid Build Coastguard Worker br i1 %cmp.i, label %_ZN4llvm21PrettyStackTraceEntryD2Ev.exit, label %cond.false.i 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workercond.false.i: ; preds = %entry 33*9880d681SAndroid Build Coastguard Worker 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)) 34*9880d681SAndroid Build Coastguard Worker unreachable 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker_ZN4llvm21PrettyStackTraceEntryD2Ev.exit: ; preds = %entry 37*9880d681SAndroid Build Coastguard Worker %NextEntry.i.i = getelementptr inbounds %"class.llvm::PrettyStackTraceEntry", %"class.llvm::PrettyStackTraceEntry"* %this, i64 0, i32 1 38*9880d681SAndroid Build Coastguard Worker %2 = bitcast %"class.llvm::PrettyStackTraceEntry"** %NextEntry.i.i to i64* 39*9880d681SAndroid Build Coastguard Worker %3 = load i64, i64* %2, align 8 40*9880d681SAndroid Build Coastguard Worker store i64 %3, i64* bitcast (%"class.llvm::PrettyStackTraceEntry"** @_ZL20PrettyStackTraceHead to i64*), align 8 41*9880d681SAndroid Build Coastguard Worker %4 = bitcast %"class.llvm::PrettyStackTraceEntry"* %this to i8* 42*9880d681SAndroid Build Coastguard Worker tail call void @_ZdlPv(i8* %4) 43*9880d681SAndroid Build Coastguard Worker ret void 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _ZN4llvm21PrettyStackTraceEntryD0Ev: 47*9880d681SAndroid Build Coastguard Worker; CHECK: addis [[REG1:[0-9]+]], 2, _ZL20PrettyStackTraceHead@got@tlsld@ha 48*9880d681SAndroid Build Coastguard Worker; CHECK: addi 3, [[REG1]], _ZL20PrettyStackTraceHead@got@tlsld@l 49*9880d681SAndroid Build Coastguard Worker; CHECK: bl __tls_get_addr(_ZL20PrettyStackTraceHead@tlsld) 50*9880d681SAndroid Build Coastguard Worker; CHECK: addis 3, 3, _ZL20PrettyStackTraceHead@dtprel@ha 51*9880d681SAndroid Build Coastguard Worker; CHECK: ld {{[0-9]+}}, _ZL20PrettyStackTraceHead@dtprel@l(3) 52*9880d681SAndroid Build Coastguard Worker; CHECK: std {{[0-9]+}}, _ZL20PrettyStackTraceHead@dtprel@l(3) 53