206 lines · cpp
1// REQUIRES: amdgpu-registered-target2// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -O2 -disable-llvm-passes | FileCheck %s --check-prefixes=CHECK,CHECK-NOOPT3// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -O2 | FileCheck %s --check-prefixes=CHECK,CHECK-OPT4// RUN: %clang_cc1 -emit-llvm %s -o - -triple=amdgcn-amd-amdhsa -O2 | FileCheck %s --check-prefixes=CHECK,CHECK-OPT5 6namespace {7 8static int ctorcalls;9static int dtorcalls;10 11struct A {12 A() : i(0) { ctorcalls++; }13 ~A() { dtorcalls++; }14 int i;15 16 friend const A& operator<<(const A& a, int n) {17 return a;18 }19};20 21void g(int) { }22void g(const A&) { }23 24void f1(bool b) {25 g(b ? A().i : 0);26 g(b || A().i);27 g(b && A().i);28 g(b ? A() << 1 : A() << 2);29}30 31struct Checker {32 Checker() {33 f1(true);34 f1(false);35 }36};37 38Checker c;39 40}41 42// CHECK-OPT-LABEL: define{{.*}} i32 @_Z12getCtorCallsv()43int getCtorCalls() {44 // CHECK-OPT: ret i32 545 return ctorcalls;46}47 48// CHECK-OPT-LABEL: define{{.*}} i32 @_Z12getDtorCallsv()49int getDtorCalls() {50 // CHECK-OPT: ret i32 551 return dtorcalls;52}53 54// CHECK-OPT-LABEL: define{{.*}} zeroext i1 @_Z7successv()55bool success() {56 // CHECK-OPT: ret i1 true57 return ctorcalls == dtorcalls;58}59 60struct X { ~X(); int f(); };61int g(int, int, int);62// CHECK-LABEL: @_Z16lifetime_nontriv63int lifetime_nontriv(bool cond) {64 // CHECK-NOOPT: store i1 false,65 // CHECK-NOOPT: store i1 false,66 // CHECK-NOOPT: store i1 false,67 // CHECK-NOOPT: store i1 false,68 // CHECK-NOOPT: store i1 false,69 // CHECK-NOOPT: store i1 false,70 // CHECK-NOOPT: br i171 //72 // CHECK-NOOPT: call void @llvm.lifetime.start73 // CHECK-NOOPT: store i1 true,74 // CHECK-NOOPT: store i1 true,75 // CHECK-NOOPT: call noundef i32 @_ZN1X1fEv(76 // CHECK-NOOPT: call void @llvm.lifetime.start77 // CHECK-NOOPT: store i1 true,78 // CHECK-NOOPT: store i1 true,79 // CHECK-NOOPT: call noundef i32 @_ZN1X1fEv(80 // CHECK-NOOPT: call void @llvm.lifetime.start81 // CHECK-NOOPT: store i1 true,82 // CHECK-NOOPT: store i1 true,83 // CHECK-NOOPT: call noundef i32 @_ZN1X1fEv(84 // CHECK-NOOPT: call noundef i32 @_Z1giii(85 // CHECK-NOOPT: br label86 //87 // CHECK-NOOPT: call noundef i32 @_Z1giii(i32 noundef 1, i32 noundef 2, i32 noundef 3)88 // CHECK-NOOPT: br label89 //90 // CHECK-NOOPT: load i1,91 // CHECK-NOOPT: br i192 // CHECK-NOOPT: call void @_ZN1XD1Ev(93 // CHECK-NOOPT: br label94 //95 // CHECK-NOOPT: load i1,96 // CHECK-NOOPT: br i197 // CHECK-NOOPT: call void @llvm.lifetime.end98 // CHECK-NOOPT: br label99 //100 // CHECK-NOOPT: load i1,101 // CHECK-NOOPT: br i1102 // CHECK-NOOPT: call void @_ZN1XD1Ev(103 // CHECK-NOOPT: br label104 //105 // CHECK-NOOPT: load i1,106 // CHECK-NOOPT: br i1107 // CHECK-NOOPT: call void @llvm.lifetime.end108 // CHECK-NOOPT: br label109 //110 // CHECK-NOOPT: load i1,111 // CHECK-NOOPT: br i1112 // CHECK-NOOPT: call void @_ZN1XD1Ev(113 // CHECK-NOOPT: br label114 //115 // CHECK-NOOPT: load i1,116 // CHECK-NOOPT: br i1117 // CHECK-NOOPT: call void @llvm.lifetime.end118 // CHECK-NOOPT: br label119 //120 // CHECK-NOOPT: ret121 122 // CHECK-OPT: br i1123 //124 // CHECK-OPT: call void @llvm.lifetime.start125 // CHECK-OPT: call noundef i32 @_ZN1X1fEv(126 // CHECK-OPT: call void @llvm.lifetime.start127 // CHECK-OPT: call noundef i32 @_ZN1X1fEv(128 // CHECK-OPT: call void @llvm.lifetime.start129 // CHECK-OPT: call noundef i32 @_ZN1X1fEv(130 // CHECK-OPT: call noundef i32 @_Z1giii(131 // CHECK-OPT: call void @_ZN1XD1Ev(132 // CHECK-OPT: call void @llvm.lifetime.end133 // CHECK-OPT: call void @_ZN1XD1Ev(134 // CHECK-OPT: call void @llvm.lifetime.end135 // CHECK-OPT: call void @_ZN1XD1Ev(136 // CHECK-OPT: call void @llvm.lifetime.end137 // CHECK-OPT: br label138 return cond ? g(X().f(), X().f(), X().f()) : g(1, 2, 3);139}140 141struct Y { int f(); };142int g(int, int, int);143// CHECK-LABEL: @_Z13lifetime_triv144int lifetime_triv(bool cond) {145 // CHECK-NOOPT: call void @llvm.lifetime.start146 // CHECK-NOOPT: call void @llvm.lifetime.start147 // CHECK-NOOPT: call void @llvm.lifetime.start148 // CHECK-NOOPT: br i1149 //150 // CHECK-NOOPT: call noundef i32 @_ZN1Y1fEv(151 // CHECK-NOOPT: call noundef i32 @_ZN1Y1fEv(152 // CHECK-NOOPT: call noundef i32 @_ZN1Y1fEv(153 // CHECK-NOOPT: call noundef i32 @_Z1giii(154 // CHECK-NOOPT: br label155 //156 // CHECK-NOOPT: call noundef i32 @_Z1giii(i32 noundef 1, i32 noundef 2, i32 noundef 3)157 // CHECK-NOOPT: br label158 //159 // CHECK-NOOPT: call void @llvm.lifetime.end160 // CHECK-NOOPT-NOT: br161 // CHECK-NOOPT: call void @llvm.lifetime.end162 // CHECK-NOOPT-NOT: br163 // CHECK-NOOPT: call void @llvm.lifetime.end164 //165 // CHECK-NOOPT: ret166 167 // FIXME: LLVM isn't smart enough to remove the lifetime markers from the168 // g(1, 2, 3) path here.169 170 // CHECK-OPT: call void @llvm.lifetime.start171 // CHECK-OPT: call void @llvm.lifetime.start172 // CHECK-OPT: call void @llvm.lifetime.start173 // CHECK-OPT: br i1174 //175 // CHECK-OPT: call noundef i32 @_ZN1Y1fEv(176 // CHECK-OPT: call noundef i32 @_ZN1Y1fEv(177 // CHECK-OPT: call noundef i32 @_ZN1Y1fEv(178 // CHECK-OPT: call noundef i32 @_Z1giii(179 // CHECK-OPT: br label180 //181 // CHECK-OPT: call void @llvm.lifetime.end182 // CHECK-OPT: call void @llvm.lifetime.end183 // CHECK-OPT: call void @llvm.lifetime.end184 return cond ? g(Y().f(), Y().f(), Y().f()) : g(1, 2, 3);185}186 187struct Z { ~Z() {} int f(); };188int g(int, int, int);189// CHECK-LABEL: @_Z22lifetime_nontriv_empty190int lifetime_nontriv_empty(bool cond) {191 // CHECK-OPT: br i1192 //193 // CHECK-OPT: call void @llvm.lifetime.start194 // CHECK-OPT: call noundef i32 @_ZN1Z1fEv(195 // CHECK-OPT: call void @llvm.lifetime.start196 // CHECK-OPT: call noundef i32 @_ZN1Z1fEv(197 // CHECK-OPT: call void @llvm.lifetime.start198 // CHECK-OPT: call noundef i32 @_ZN1Z1fEv(199 // CHECK-OPT: call noundef i32 @_Z1giii(200 // CHECK-OPT: call void @llvm.lifetime.end201 // CHECK-OPT: call void @llvm.lifetime.end202 // CHECK-OPT: call void @llvm.lifetime.end203 // CHECK-OPT: br label204 return cond ? g(Z().f(), Z().f(), Z().f()) : g(1, 2, 3);205}206