brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.5 KiB · 51f2a36 Raw
183 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -O3 -S                                        | FileCheck %s3; RUN: opt < %s -passes="default<O3>" -S | FileCheck %s4 5; This is based on the following most basic C++ code:6;7; #include <array>8; void use(int);9; void foo(int cnt) {10;   std::array<int, 6> arr;11;   for(int& elt : arr)12;     elt = ++cnt;13;   for(int& elt : arr)14;     use(elt);15; }16;17; Not only should the loops be unrolled, no alloca's should be left there.18 19target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"20target triple = "x86_64-unknown-linux-gnu"21 22%"struct.std::array" = type { [6 x i32] }23 24define dso_local void @_Z3fooi(i32 %cnt) {25; CHECK-LABEL: @_Z3fooi(26; CHECK-NEXT:  entry:27; CHECK-NEXT:    [[INC:%.*]] = add nsw i32 [[CNT:%.*]], 128; CHECK-NEXT:    [[INC_1:%.*]] = add nsw i32 [[CNT]], 229; CHECK-NEXT:    [[INC_2:%.*]] = add nsw i32 [[CNT]], 330; CHECK-NEXT:    [[INC_3:%.*]] = add nsw i32 [[CNT]], 431; CHECK-NEXT:    [[INC_4:%.*]] = add nsw i32 [[CNT]], 532; CHECK-NEXT:    [[INC_5:%.*]] = add nsw i32 [[CNT]], 633; CHECK-NEXT:    call void @_Z3usei(i32 [[INC]])34; CHECK-NEXT:    call void @_Z3usei(i32 [[INC_1]])35; CHECK-NEXT:    call void @_Z3usei(i32 [[INC_2]])36; CHECK-NEXT:    call void @_Z3usei(i32 [[INC_3]])37; CHECK-NEXT:    call void @_Z3usei(i32 [[INC_4]])38; CHECK-NEXT:    call void @_Z3usei(i32 [[INC_5]])39; CHECK-NEXT:    ret void40;41entry:42  %cnt.addr = alloca i3243  %arr = alloca %"struct.std::array"44  %__range1 = alloca ptr45  %__begin1 = alloca ptr46  %__end1 = alloca ptr47  %elt = alloca ptr48  %__range12 = alloca ptr49  %__begin13 = alloca ptr50  %__end15 = alloca ptr51  %elt11 = alloca ptr52  store i32 %cnt, ptr %cnt.addr53  call void @llvm.lifetime.start.p0(ptr %arr)54  call void @llvm.lifetime.start.p0(ptr %__range1)55  store ptr %arr, ptr %__range156  call void @llvm.lifetime.start.p0(ptr %__begin1)57  %0 = load ptr, ptr %__range158  %call = call ptr @_ZNSt5arrayIiLm6EE5beginEv(ptr %0)59  store ptr %call, ptr %__begin160  call void @llvm.lifetime.start.p0(ptr %__end1)61  %1 = load ptr, ptr %__range162  %call1 = call ptr @_ZNSt5arrayIiLm6EE3endEv(ptr %1)63  store ptr %call1, ptr %__end164  br label %for.cond65 66for.cond:67  %2 = load ptr, ptr %__begin168  %3 = load ptr, ptr %__end169  %cmp = icmp ne ptr %2, %370  br i1 %cmp, label %for.body, label %for.cond.cleanup71 72for.cond.cleanup:73  call void @llvm.lifetime.end.p0(ptr %__end1)74  call void @llvm.lifetime.end.p0(ptr %__begin1)75  call void @llvm.lifetime.end.p0(ptr %__range1)76  br label %for.end77 78for.body:79  call void @llvm.lifetime.start.p0(ptr %elt)80  %4 = load ptr, ptr %__begin181  store ptr %4, ptr %elt82  %5 = load i32, ptr %cnt.addr83  %inc = add nsw i32 %5, 184  store i32 %inc, ptr %cnt.addr85  %6 = load ptr, ptr %elt86  store i32 %inc, ptr %687  call void @llvm.lifetime.end.p0(ptr %elt)88  br label %for.inc89 90for.inc:91  %7 = load ptr, ptr %__begin192  %incdec.ptr = getelementptr inbounds i32, ptr %7, i32 193  store ptr %incdec.ptr, ptr %__begin194  br label %for.cond95 96for.end:97  call void @llvm.lifetime.start.p0(ptr %__range12)98  store ptr %arr, ptr %__range1299  call void @llvm.lifetime.start.p0(ptr %__begin13)100  %8 = load ptr, ptr %__range12101  %call4 = call ptr @_ZNSt5arrayIiLm6EE5beginEv(ptr %8)102  store ptr %call4, ptr %__begin13103  call void @llvm.lifetime.start.p0(ptr %__end15)104  %9 = load ptr, ptr %__range12105  %call6 = call ptr @_ZNSt5arrayIiLm6EE3endEv(ptr %9)106  store ptr %call6, ptr %__end15107  br label %for.cond7108 109for.cond7:110  %10 = load ptr, ptr %__begin13111  %11 = load ptr, ptr %__end15112  %cmp8 = icmp ne ptr %10, %11113  br i1 %cmp8, label %for.body10, label %for.cond.cleanup9114 115for.cond.cleanup9:116  call void @llvm.lifetime.end.p0(ptr %__end15)117  call void @llvm.lifetime.end.p0(ptr %__begin13)118  call void @llvm.lifetime.end.p0(ptr %__range12)119  br label %for.end14120 121for.body10:122  call void @llvm.lifetime.start.p0(ptr %elt11)123  %12 = load ptr, ptr %__begin13124  store ptr %12, ptr %elt11125  %13 = load ptr, ptr %elt11126  %14 = load i32, ptr %13127  call void @_Z3usei(i32 %14)128  call void @llvm.lifetime.end.p0(ptr %elt11)129  br label %for.inc12130 131for.inc12:132  %15 = load ptr, ptr %__begin13133  %incdec.ptr13 = getelementptr inbounds i32, ptr %15, i32 1134  store ptr %incdec.ptr13, ptr %__begin13135  br label %for.cond7136 137for.end14:138  call void @llvm.lifetime.end.p0(ptr %arr)139  ret void140}141 142declare void @llvm.lifetime.start.p0(ptr nocapture)143 144define linkonce_odr dso_local ptr @_ZNSt5arrayIiLm6EE5beginEv(ptr %this) {145entry:146  %this.addr = alloca ptr147  store ptr %this, ptr %this.addr148  %this1 = load ptr, ptr %this.addr149  %call = call ptr @_ZNSt5arrayIiLm6EE4dataEv(ptr %this1)150  ret ptr %call151}152 153define linkonce_odr dso_local ptr @_ZNSt5arrayIiLm6EE3endEv(ptr %this) {154entry:155  %this.addr = alloca ptr156  store ptr %this, ptr %this.addr157  %this1 = load ptr, ptr %this.addr158  %call = call ptr @_ZNSt5arrayIiLm6EE4dataEv(ptr %this1)159  %add.ptr = getelementptr inbounds i32, ptr %call, i64 6160  ret ptr %add.ptr161}162 163declare void @llvm.lifetime.end.p0(ptr nocapture)164 165declare dso_local void @_Z3usei(i32)166 167define linkonce_odr dso_local ptr @_ZNSt5arrayIiLm6EE4dataEv(ptr %this) {168entry:169  %this.addr = alloca ptr170  store ptr %this, ptr %this.addr171  %this1 = load ptr, ptr %this.addr172  %call = call ptr @_ZNSt14__array_traitsIiLm6EE6_S_ptrERA6_Ki(ptr nonnull align 4 dereferenceable(24) %this1)173  ret ptr %call174}175 176define linkonce_odr dso_local ptr @_ZNSt14__array_traitsIiLm6EE6_S_ptrERA6_Ki(ptr nonnull align 4 dereferenceable(24) %__t) {177entry:178  %__t.addr = alloca ptr179  store ptr %__t, ptr %__t.addr180  %0 = load ptr, ptr %__t.addr181  ret ptr %0182}183