281 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=slp-vectorizer -mtriple=aarch64 < %s | FileCheck %s3 4target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"5 6define void @lround_i32f32(ptr %x, ptr %y, i32 %n) {7; CHECK-LABEL: @lround_i32f32(8; CHECK-NEXT: entry:9; CHECK-NEXT: [[L0:%.*]] = load float, ptr [[X:%.*]], align 410; CHECK-NEXT: [[ARRAYIDX_1:%.*]] = getelementptr inbounds float, ptr [[X]], i64 111; CHECK-NEXT: [[L2:%.*]] = load float, ptr [[ARRAYIDX_1]], align 412; CHECK-NEXT: [[ARRAYIDX_2:%.*]] = getelementptr inbounds float, ptr [[X]], i64 213; CHECK-NEXT: [[L4:%.*]] = load float, ptr [[ARRAYIDX_2]], align 414; CHECK-NEXT: [[ARRAYIDX_3:%.*]] = getelementptr inbounds float, ptr [[X]], i64 315; CHECK-NEXT: [[L6:%.*]] = load float, ptr [[ARRAYIDX_3]], align 416; CHECK-NEXT: [[L1:%.*]] = tail call i32 @llvm.lround.i32.f32(float [[L0]])17; CHECK-NEXT: [[L3:%.*]] = tail call i32 @llvm.lround.i32.f32(float [[L2]])18; CHECK-NEXT: [[L5:%.*]] = tail call i32 @llvm.lround.i32.f32(float [[L4]])19; CHECK-NEXT: [[L7:%.*]] = tail call i32 @llvm.lround.i32.f32(float [[L6]])20; CHECK-NEXT: store i32 [[L1]], ptr [[Y:%.*]], align 421; CHECK-NEXT: [[ARRAYIDX2_1:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 122; CHECK-NEXT: store i32 [[L3]], ptr [[ARRAYIDX2_1]], align 423; CHECK-NEXT: [[ARRAYIDX2_2:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 224; CHECK-NEXT: store i32 [[L5]], ptr [[ARRAYIDX2_2]], align 425; CHECK-NEXT: [[ARRAYIDX2_3:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 326; CHECK-NEXT: store i32 [[L7]], ptr [[ARRAYIDX2_3]], align 427; CHECK-NEXT: ret void28;29entry:30 %l0 = load float, ptr %x, align 431 %arrayidx.1 = getelementptr inbounds float, ptr %x, i64 132 %l2 = load float, ptr %arrayidx.1, align 433 %arrayidx.2 = getelementptr inbounds float, ptr %x, i64 234 %l4 = load float, ptr %arrayidx.2, align 435 %arrayidx.3 = getelementptr inbounds float, ptr %x, i64 336 %l6 = load float, ptr %arrayidx.3, align 437 %l1 = tail call i32 @llvm.lround.i32.f32(float %l0)38 %l3 = tail call i32 @llvm.lround.i32.f32(float %l2)39 %l5 = tail call i32 @llvm.lround.i32.f32(float %l4)40 %l7 = tail call i32 @llvm.lround.i32.f32(float %l6)41 store i32 %l1, ptr %y, align 442 %arrayidx2.1 = getelementptr inbounds i32, ptr %y, i64 143 store i32 %l3, ptr %arrayidx2.1, align 444 %arrayidx2.2 = getelementptr inbounds i32, ptr %y, i64 245 store i32 %l5, ptr %arrayidx2.2, align 446 %arrayidx2.3 = getelementptr inbounds i32, ptr %y, i64 347 store i32 %l7, ptr %arrayidx2.3, align 448 ret void49}50 51define void @lround_i32f64(ptr %x, ptr %y, i32 %n) {52; CHECK-LABEL: @lround_i32f64(53; CHECK-NEXT: entry:54; CHECK-NEXT: [[L0:%.*]] = load double, ptr [[X:%.*]], align 455; CHECK-NEXT: [[ARRAYIDX_1:%.*]] = getelementptr inbounds double, ptr [[X]], i64 156; CHECK-NEXT: [[L2:%.*]] = load double, ptr [[ARRAYIDX_1]], align 457; CHECK-NEXT: [[ARRAYIDX_2:%.*]] = getelementptr inbounds double, ptr [[X]], i64 258; CHECK-NEXT: [[L4:%.*]] = load double, ptr [[ARRAYIDX_2]], align 459; CHECK-NEXT: [[ARRAYIDX_3:%.*]] = getelementptr inbounds double, ptr [[X]], i64 360; CHECK-NEXT: [[L6:%.*]] = load double, ptr [[ARRAYIDX_3]], align 461; CHECK-NEXT: [[L1:%.*]] = tail call i32 @llvm.lround.i32.f64(double [[L0]])62; CHECK-NEXT: [[L3:%.*]] = tail call i32 @llvm.lround.i32.f64(double [[L2]])63; CHECK-NEXT: [[L5:%.*]] = tail call i32 @llvm.lround.i32.f64(double [[L4]])64; CHECK-NEXT: [[L7:%.*]] = tail call i32 @llvm.lround.i32.f64(double [[L6]])65; CHECK-NEXT: store i32 [[L1]], ptr [[Y:%.*]], align 466; CHECK-NEXT: [[ARRAYIDX2_1:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 167; CHECK-NEXT: store i32 [[L3]], ptr [[ARRAYIDX2_1]], align 468; CHECK-NEXT: [[ARRAYIDX2_2:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 269; CHECK-NEXT: store i32 [[L5]], ptr [[ARRAYIDX2_2]], align 470; CHECK-NEXT: [[ARRAYIDX2_3:%.*]] = getelementptr inbounds i32, ptr [[Y]], i64 371; CHECK-NEXT: store i32 [[L7]], ptr [[ARRAYIDX2_3]], align 472; CHECK-NEXT: ret void73;74entry:75 %l0 = load double, ptr %x, align 476 %arrayidx.1 = getelementptr inbounds double, ptr %x, i64 177 %l2 = load double, ptr %arrayidx.1, align 478 %arrayidx.2 = getelementptr inbounds double, ptr %x, i64 279 %l4 = load double, ptr %arrayidx.2, align 480 %arrayidx.3 = getelementptr inbounds double, ptr %x, i64 381 %l6 = load double, ptr %arrayidx.3, align 482 %l1 = tail call i32 @llvm.lround.i32.f64(double %l0)83 %l3 = tail call i32 @llvm.lround.i32.f64(double %l2)84 %l5 = tail call i32 @llvm.lround.i32.f64(double %l4)85 %l7 = tail call i32 @llvm.lround.i32.f64(double %l6)86 store i32 %l1, ptr %y, align 487 %arrayidx2.1 = getelementptr inbounds i32, ptr %y, i64 188 store i32 %l3, ptr %arrayidx2.1, align 489 %arrayidx2.2 = getelementptr inbounds i32, ptr %y, i64 290 store i32 %l5, ptr %arrayidx2.2, align 491 %arrayidx2.3 = getelementptr inbounds i32, ptr %y, i64 392 store i32 %l7, ptr %arrayidx2.3, align 493 ret void94}95 96define void @lround_i64f32(ptr %x, ptr %y, i64 %n) {97; CHECK-LABEL: @lround_i64f32(98; CHECK-NEXT: entry:99; CHECK-NEXT: [[L0:%.*]] = load float, ptr [[X:%.*]], align 4100; CHECK-NEXT: [[ARRAYIDX_1:%.*]] = getelementptr inbounds float, ptr [[X]], i64 1101; CHECK-NEXT: [[L2:%.*]] = load float, ptr [[ARRAYIDX_1]], align 4102; CHECK-NEXT: [[ARRAYIDX_2:%.*]] = getelementptr inbounds float, ptr [[X]], i64 2103; CHECK-NEXT: [[L4:%.*]] = load float, ptr [[ARRAYIDX_2]], align 4104; CHECK-NEXT: [[ARRAYIDX_3:%.*]] = getelementptr inbounds float, ptr [[X]], i64 3105; CHECK-NEXT: [[L6:%.*]] = load float, ptr [[ARRAYIDX_3]], align 4106; CHECK-NEXT: [[L1:%.*]] = tail call i64 @llvm.lround.i64.f32(float [[L0]])107; CHECK-NEXT: [[L3:%.*]] = tail call i64 @llvm.lround.i64.f32(float [[L2]])108; CHECK-NEXT: [[L5:%.*]] = tail call i64 @llvm.lround.i64.f32(float [[L4]])109; CHECK-NEXT: [[L7:%.*]] = tail call i64 @llvm.lround.i64.f32(float [[L6]])110; CHECK-NEXT: store i64 [[L1]], ptr [[Y:%.*]], align 4111; CHECK-NEXT: [[ARRAYIDX2_1:%.*]] = getelementptr inbounds i64, ptr [[Y]], i64 1112; CHECK-NEXT: store i64 [[L3]], ptr [[ARRAYIDX2_1]], align 4113; CHECK-NEXT: [[ARRAYIDX2_2:%.*]] = getelementptr inbounds i64, ptr [[Y]], i64 2114; CHECK-NEXT: store i64 [[L5]], ptr [[ARRAYIDX2_2]], align 4115; CHECK-NEXT: [[ARRAYIDX2_3:%.*]] = getelementptr inbounds i64, ptr [[Y]], i64 3116; CHECK-NEXT: store i64 [[L7]], ptr [[ARRAYIDX2_3]], align 4117; CHECK-NEXT: ret void118;119entry:120 %l0 = load float, ptr %x, align 4121 %arrayidx.1 = getelementptr inbounds float, ptr %x, i64 1122 %l2 = load float, ptr %arrayidx.1, align 4123 %arrayidx.2 = getelementptr inbounds float, ptr %x, i64 2124 %l4 = load float, ptr %arrayidx.2, align 4125 %arrayidx.3 = getelementptr inbounds float, ptr %x, i64 3126 %l6 = load float, ptr %arrayidx.3, align 4127 %l1 = tail call i64 @llvm.lround.i64.f32(float %l0)128 %l3 = tail call i64 @llvm.lround.i64.f32(float %l2)129 %l5 = tail call i64 @llvm.lround.i64.f32(float %l4)130 %l7 = tail call i64 @llvm.lround.i64.f32(float %l6)131 store i64 %l1, ptr %y, align 4132 %arrayidx2.1 = getelementptr inbounds i64, ptr %y, i64 1133 store i64 %l3, ptr %arrayidx2.1, align 4134 %arrayidx2.2 = getelementptr inbounds i64, ptr %y, i64 2135 store i64 %l5, ptr %arrayidx2.2, align 4136 %arrayidx2.3 = getelementptr inbounds i64, ptr %y, i64 3137 store i64 %l7, ptr %arrayidx2.3, align 4138 ret void139}140 141define void @lround_i64f64(ptr %x, ptr %y, i64 %n) {142; CHECK-LABEL: @lround_i64f64(143; CHECK-NEXT: entry:144; CHECK-NEXT: [[L0:%.*]] = load double, ptr [[X:%.*]], align 4145; CHECK-NEXT: [[ARRAYIDX_1:%.*]] = getelementptr inbounds double, ptr [[X]], i64 1146; CHECK-NEXT: [[L2:%.*]] = load double, ptr [[ARRAYIDX_1]], align 4147; CHECK-NEXT: [[ARRAYIDX_2:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2148; CHECK-NEXT: [[L4:%.*]] = load double, ptr [[ARRAYIDX_2]], align 4149; CHECK-NEXT: [[ARRAYIDX_3:%.*]] = getelementptr inbounds double, ptr [[X]], i64 3150; CHECK-NEXT: [[L6:%.*]] = load double, ptr [[ARRAYIDX_3]], align 4151; CHECK-NEXT: [[L1:%.*]] = tail call i64 @llvm.lround.i64.f64(double [[L0]])152; CHECK-NEXT: [[L3:%.*]] = tail call i64 @llvm.lround.i64.f64(double [[L2]])153; CHECK-NEXT: [[L5:%.*]] = tail call i64 @llvm.lround.i64.f64(double [[L4]])154; CHECK-NEXT: [[L7:%.*]] = tail call i64 @llvm.lround.i64.f64(double [[L6]])155; CHECK-NEXT: store i64 [[L1]], ptr [[Y:%.*]], align 4156; CHECK-NEXT: [[ARRAYIDX2_1:%.*]] = getelementptr inbounds i64, ptr [[Y]], i64 1157; CHECK-NEXT: store i64 [[L3]], ptr [[ARRAYIDX2_1]], align 4158; CHECK-NEXT: [[ARRAYIDX2_2:%.*]] = getelementptr inbounds i64, ptr [[Y]], i64 2159; CHECK-NEXT: store i64 [[L5]], ptr [[ARRAYIDX2_2]], align 4160; CHECK-NEXT: [[ARRAYIDX2_3:%.*]] = getelementptr inbounds i64, ptr [[Y]], i64 3161; CHECK-NEXT: store i64 [[L7]], ptr [[ARRAYIDX2_3]], align 4162; CHECK-NEXT: ret void163;164entry:165 %l0 = load double, ptr %x, align 4166 %arrayidx.1 = getelementptr inbounds double, ptr %x, i64 1167 %l2 = load double, ptr %arrayidx.1, align 4168 %arrayidx.2 = getelementptr inbounds double, ptr %x, i64 2169 %l4 = load double, ptr %arrayidx.2, align 4170 %arrayidx.3 = getelementptr inbounds double, ptr %x, i64 3171 %l6 = load double, ptr %arrayidx.3, align 4172 %l1 = tail call i64 @llvm.lround.i64.f64(double %l0)173 %l3 = tail call i64 @llvm.lround.i64.f64(double %l2)174 %l5 = tail call i64 @llvm.lround.i64.f64(double %l4)175 %l7 = tail call i64 @llvm.lround.i64.f64(double %l6)176 store i64 %l1, ptr %y, align 4177 %arrayidx2.1 = getelementptr inbounds i64, ptr %y, i64 1178 store i64 %l3, ptr %arrayidx2.1, align 4179 %arrayidx2.2 = getelementptr inbounds i64, ptr %y, i64 2180 store i64 %l5, ptr %arrayidx2.2, align 4181 %arrayidx2.3 = getelementptr inbounds i64, ptr %y, i64 3182 store i64 %l7, ptr %arrayidx2.3, align 4183 ret void184}185 186define void @llround_i64f32(ptr %x, ptr %y, i64 %n) {187; CHECK-LABEL: @llround_i64f32(188; CHECK-NEXT: entry:189; CHECK-NEXT: [[L0:%.*]] = load float, ptr [[X:%.*]], align 4190; CHECK-NEXT: [[ARRAYIDX_1:%.*]] = getelementptr inbounds float, ptr [[X]], i64 1191; CHECK-NEXT: [[L2:%.*]] = load float, ptr [[ARRAYIDX_1]], align 4192; CHECK-NEXT: [[ARRAYIDX_2:%.*]] = getelementptr inbounds float, ptr [[X]], i64 2193; CHECK-NEXT: [[L4:%.*]] = load float, ptr [[ARRAYIDX_2]], align 4194; CHECK-NEXT: [[ARRAYIDX_3:%.*]] = getelementptr inbounds float, ptr [[X]], i64 3195; CHECK-NEXT: [[L6:%.*]] = load float, ptr [[ARRAYIDX_3]], align 4196; CHECK-NEXT: [[L1:%.*]] = tail call i64 @llvm.llround.i64.f32(float [[L0]])197; CHECK-NEXT: [[L3:%.*]] = tail call i64 @llvm.llround.i64.f32(float [[L2]])198; CHECK-NEXT: [[L5:%.*]] = tail call i64 @llvm.llround.i64.f32(float [[L4]])199; CHECK-NEXT: [[L7:%.*]] = tail call i64 @llvm.llround.i64.f32(float [[L6]])200; CHECK-NEXT: store i64 [[L1]], ptr [[Y:%.*]], align 4201; CHECK-NEXT: [[ARRAYIDX2_1:%.*]] = getelementptr inbounds i64, ptr [[Y]], i64 1202; CHECK-NEXT: store i64 [[L3]], ptr [[ARRAYIDX2_1]], align 4203; CHECK-NEXT: [[ARRAYIDX2_2:%.*]] = getelementptr inbounds i64, ptr [[Y]], i64 2204; CHECK-NEXT: store i64 [[L5]], ptr [[ARRAYIDX2_2]], align 4205; CHECK-NEXT: [[ARRAYIDX2_3:%.*]] = getelementptr inbounds i64, ptr [[Y]], i64 3206; CHECK-NEXT: store i64 [[L7]], ptr [[ARRAYIDX2_3]], align 4207; CHECK-NEXT: ret void208;209entry:210 %l0 = load float, ptr %x, align 4211 %arrayidx.1 = getelementptr inbounds float, ptr %x, i64 1212 %l2 = load float, ptr %arrayidx.1, align 4213 %arrayidx.2 = getelementptr inbounds float, ptr %x, i64 2214 %l4 = load float, ptr %arrayidx.2, align 4215 %arrayidx.3 = getelementptr inbounds float, ptr %x, i64 3216 %l6 = load float, ptr %arrayidx.3, align 4217 %l1 = tail call i64 @llvm.llround.i64.f32(float %l0)218 %l3 = tail call i64 @llvm.llround.i64.f32(float %l2)219 %l5 = tail call i64 @llvm.llround.i64.f32(float %l4)220 %l7 = tail call i64 @llvm.llround.i64.f32(float %l6)221 store i64 %l1, ptr %y, align 4222 %arrayidx2.1 = getelementptr inbounds i64, ptr %y, i64 1223 store i64 %l3, ptr %arrayidx2.1, align 4224 %arrayidx2.2 = getelementptr inbounds i64, ptr %y, i64 2225 store i64 %l5, ptr %arrayidx2.2, align 4226 %arrayidx2.3 = getelementptr inbounds i64, ptr %y, i64 3227 store i64 %l7, ptr %arrayidx2.3, align 4228 ret void229}230 231define void @llround_i64f64(ptr %x, ptr %y, i64 %n) {232; CHECK-LABEL: @llround_i64f64(233; CHECK-NEXT: entry:234; CHECK-NEXT: [[L0:%.*]] = load double, ptr [[X:%.*]], align 4235; CHECK-NEXT: [[ARRAYIDX_1:%.*]] = getelementptr inbounds double, ptr [[X]], i64 1236; CHECK-NEXT: [[L2:%.*]] = load double, ptr [[ARRAYIDX_1]], align 4237; CHECK-NEXT: [[ARRAYIDX_2:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2238; CHECK-NEXT: [[L4:%.*]] = load double, ptr [[ARRAYIDX_2]], align 4239; CHECK-NEXT: [[ARRAYIDX_3:%.*]] = getelementptr inbounds double, ptr [[X]], i64 3240; CHECK-NEXT: [[L6:%.*]] = load double, ptr [[ARRAYIDX_3]], align 4241; CHECK-NEXT: [[L1:%.*]] = tail call i64 @llvm.llround.i64.f64(double [[L0]])242; CHECK-NEXT: [[L3:%.*]] = tail call i64 @llvm.llround.i64.f64(double [[L2]])243; CHECK-NEXT: [[L5:%.*]] = tail call i64 @llvm.llround.i64.f64(double [[L4]])244; CHECK-NEXT: [[L7:%.*]] = tail call i64 @llvm.llround.i64.f64(double [[L6]])245; CHECK-NEXT: store i64 [[L1]], ptr [[Y:%.*]], align 4246; CHECK-NEXT: [[ARRAYIDX2_1:%.*]] = getelementptr inbounds i64, ptr [[Y]], i64 1247; CHECK-NEXT: store i64 [[L3]], ptr [[ARRAYIDX2_1]], align 4248; CHECK-NEXT: [[ARRAYIDX2_2:%.*]] = getelementptr inbounds i64, ptr [[Y]], i64 2249; CHECK-NEXT: store i64 [[L5]], ptr [[ARRAYIDX2_2]], align 4250; CHECK-NEXT: [[ARRAYIDX2_3:%.*]] = getelementptr inbounds i64, ptr [[Y]], i64 3251; CHECK-NEXT: store i64 [[L7]], ptr [[ARRAYIDX2_3]], align 4252; CHECK-NEXT: ret void253;254entry:255 %l0 = load double, ptr %x, align 4256 %arrayidx.1 = getelementptr inbounds double, ptr %x, i64 1257 %l2 = load double, ptr %arrayidx.1, align 4258 %arrayidx.2 = getelementptr inbounds double, ptr %x, i64 2259 %l4 = load double, ptr %arrayidx.2, align 4260 %arrayidx.3 = getelementptr inbounds double, ptr %x, i64 3261 %l6 = load double, ptr %arrayidx.3, align 4262 %l1 = tail call i64 @llvm.llround.i64.f64(double %l0)263 %l3 = tail call i64 @llvm.llround.i64.f64(double %l2)264 %l5 = tail call i64 @llvm.llround.i64.f64(double %l4)265 %l7 = tail call i64 @llvm.llround.i64.f64(double %l6)266 store i64 %l1, ptr %y, align 4267 %arrayidx2.1 = getelementptr inbounds i64, ptr %y, i64 1268 store i64 %l3, ptr %arrayidx2.1, align 4269 %arrayidx2.2 = getelementptr inbounds i64, ptr %y, i64 2270 store i64 %l5, ptr %arrayidx2.2, align 4271 %arrayidx2.3 = getelementptr inbounds i64, ptr %y, i64 3272 store i64 %l7, ptr %arrayidx2.3, align 4273 ret void274}275 276declare i32 @llvm.lround.i32.f32(float)277declare i64 @llvm.lround.i64.f32(float)278declare i64 @llvm.lround.i64.f64(double)279declare i64 @llvm.llround.i64.f32(float)280declare i64 @llvm.llround.i64.f64(double)281