brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.8 KiB · beac2d1 Raw
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