brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.6 KiB · 07a3fe7 Raw
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