1260679b0SDávid Bolvanský; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 248c6b272SRoman Lebedev; RUN: opt -S -passes=loop-idiom < %s | FileCheck %s 3cee313d2SEric Christopher 4cee313d2SEric Christophertarget datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:4" 5cee313d2SEric Christophertarget triple = "x86_64-unknown-linux-gnu" 6cee313d2SEric Christopher 7de3cb954SPhilip Reames; LIR'ing stores of pointers with address space 3 is fine, since 8de3cb954SPhilip Reames; they're integral pointers. 9*055fb779SNikita Popovdefine void @f_0(ptr %ptr) { 10cee313d2SEric Christopher; CHECK-LABEL: @f_0( 11260679b0SDávid Bolvanský; CHECK-NEXT: entry: 12*055fb779SNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[PTR:%.*]], i8 0, i64 80000, i1 false) 13260679b0SDávid Bolvanský; CHECK-NEXT: br label [[FOR_BODY:%.*]] 14260679b0SDávid Bolvanský; CHECK: for.body: 15260679b0SDávid Bolvanský; CHECK-NEXT: [[INDVAR:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVAR_NEXT:%.*]], [[FOR_BODY]] ] 16*055fb779SNikita Popov; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr ptr addrspace(3), ptr [[PTR]], i64 [[INDVAR]] 17260679b0SDávid Bolvanský; CHECK-NEXT: [[INDVAR_NEXT]] = add i64 [[INDVAR]], 1 18260679b0SDávid Bolvanský; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i64 [[INDVAR_NEXT]], 10000 19260679b0SDávid Bolvanský; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]] 20260679b0SDávid Bolvanský; CHECK: for.end: 21260679b0SDávid Bolvanský; CHECK-NEXT: ret void 22260679b0SDávid Bolvanský; 23cee313d2SEric Christopher 24cee313d2SEric Christopherentry: 25cee313d2SEric Christopher br label %for.body 26cee313d2SEric Christopher 27cee313d2SEric Christopherfor.body: 28cee313d2SEric Christopher %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %for.body ] 29*055fb779SNikita Popov %arrayidx = getelementptr ptr addrspace(3), ptr %ptr, i64 %indvar 30*055fb779SNikita Popov store ptr addrspace(3) null, ptr %arrayidx, align 4 31cee313d2SEric Christopher %indvar.next = add i64 %indvar, 1 32cee313d2SEric Christopher %exitcond = icmp eq i64 %indvar.next, 10000 33cee313d2SEric Christopher br i1 %exitcond, label %for.end, label %for.body 34cee313d2SEric Christopher 35cee313d2SEric Christopherfor.end: 36cee313d2SEric Christopher ret void 37cee313d2SEric Christopher} 38cee313d2SEric Christopher 39de3cb954SPhilip Reames; LIR'ing stores of pointers with address space 4 is not ok, since 40de3cb954SPhilip Reames; they're non-integral pointers. NOTE: Zero is special value which 41de3cb954SPhilip Reames; can be converted, if we add said handling here, convert this test 42de3cb954SPhilip Reames; to use any non-null pointer. 43*055fb779SNikita Popovdefine void @f_1(ptr %ptr) { 44cee313d2SEric Christopher; CHECK-LABEL: @f_1( 45260679b0SDávid Bolvanský; CHECK-NEXT: entry: 46260679b0SDávid Bolvanský; CHECK-NEXT: br label [[FOR_BODY:%.*]] 47260679b0SDávid Bolvanský; CHECK: for.body: 48260679b0SDávid Bolvanský; CHECK-NEXT: [[INDVAR:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVAR_NEXT:%.*]], [[FOR_BODY]] ] 49*055fb779SNikita Popov; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr ptr addrspace(4), ptr [[PTR:%.*]], i64 [[INDVAR]] 50*055fb779SNikita Popov; CHECK-NEXT: store ptr addrspace(4) null, ptr [[ARRAYIDX]], align 4 51260679b0SDávid Bolvanský; CHECK-NEXT: [[INDVAR_NEXT]] = add i64 [[INDVAR]], 1 52260679b0SDávid Bolvanský; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i64 [[INDVAR_NEXT]], 10000 53260679b0SDávid Bolvanský; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]] 54260679b0SDávid Bolvanský; CHECK: for.end: 55260679b0SDávid Bolvanský; CHECK-NEXT: ret void 56260679b0SDávid Bolvanský; 57cee313d2SEric Christopher 58cee313d2SEric Christopherentry: 59cee313d2SEric Christopher br label %for.body 60cee313d2SEric Christopher 61cee313d2SEric Christopherfor.body: 62cee313d2SEric Christopher %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %for.body ] 63*055fb779SNikita Popov %arrayidx = getelementptr ptr addrspace(4), ptr %ptr, i64 %indvar 64*055fb779SNikita Popov store ptr addrspace(4) null, ptr %arrayidx, align 4 65cee313d2SEric Christopher %indvar.next = add i64 %indvar, 1 66cee313d2SEric Christopher %exitcond = icmp eq i64 %indvar.next, 10000 67cee313d2SEric Christopher br i1 %exitcond, label %for.end, label %for.body 68cee313d2SEric Christopher 69cee313d2SEric Christopherfor.end: 70cee313d2SEric Christopher ret void 71cee313d2SEric Christopher} 72de3cb954SPhilip Reames 73de3cb954SPhilip Reames; Same as previous case, but vector of non-integral pointers 74*055fb779SNikita Popovdefine void @f_2(ptr %ptr) { 75de3cb954SPhilip Reames; CHECK-LABEL: @f_2( 76260679b0SDávid Bolvanský; CHECK-NEXT: entry: 77260679b0SDávid Bolvanský; CHECK-NEXT: br label [[FOR_BODY:%.*]] 78260679b0SDávid Bolvanský; CHECK: for.body: 79260679b0SDávid Bolvanský; CHECK-NEXT: [[INDVAR:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVAR_NEXT:%.*]], [[FOR_BODY]] ] 80*055fb779SNikita Popov; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr ptr addrspace(4), ptr [[PTR:%.*]], i64 [[INDVAR]] 81*055fb779SNikita Popov; CHECK-NEXT: store <2 x ptr addrspace(4)> zeroinitializer, ptr [[ARRAYIDX]], align 8 82260679b0SDávid Bolvanský; CHECK-NEXT: [[INDVAR_NEXT]] = add i64 [[INDVAR]], 2 83260679b0SDávid Bolvanský; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i64 [[INDVAR_NEXT]], 10000 84260679b0SDávid Bolvanský; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]] 85260679b0SDávid Bolvanský; CHECK: for.end: 86260679b0SDávid Bolvanský; CHECK-NEXT: ret void 87260679b0SDávid Bolvanský; 88de3cb954SPhilip Reamesentry: 89de3cb954SPhilip Reames br label %for.body 90de3cb954SPhilip Reames 91de3cb954SPhilip Reamesfor.body: 92de3cb954SPhilip Reames %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %for.body ] 93*055fb779SNikita Popov %arrayidx = getelementptr ptr addrspace(4), ptr %ptr, i64 %indvar 94*055fb779SNikita Popov store <2 x ptr addrspace(4)> zeroinitializer, ptr %arrayidx, align 8 95de3cb954SPhilip Reames %indvar.next = add i64 %indvar, 2 96de3cb954SPhilip Reames %exitcond = icmp eq i64 %indvar.next, 10000 97de3cb954SPhilip Reames br i1 %exitcond, label %for.end, label %for.body 98de3cb954SPhilip Reames 99de3cb954SPhilip Reamesfor.end: 100de3cb954SPhilip Reames ret void 101de3cb954SPhilip Reames} 102