180 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=instcombine -S < %s | FileCheck %s3 4define <4 x float> @good1(float %arg) {5; CHECK-LABEL: @good1(6; CHECK-NEXT: [[T:%.*]] = insertelement <4 x float> poison, float [[ARG:%.*]], i64 07; CHECK-NEXT: [[T6:%.*]] = shufflevector <4 x float> [[T]], <4 x float> poison, <4 x i32> zeroinitializer8; CHECK-NEXT: ret <4 x float> [[T6]]9;10 %t = insertelement <4 x float> poison, float %arg, i32 011 %t4 = insertelement <4 x float> %t, float %arg, i32 112 %t5 = insertelement <4 x float> %t4, float %arg, i32 213 %t6 = insertelement <4 x float> %t5, float %arg, i32 314 ret <4 x float> %t615}16 17define <4 x float> @good2(float %arg) {18; CHECK-LABEL: @good2(19; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[ARG:%.*]], i64 020; CHECK-NEXT: [[T6:%.*]] = shufflevector <4 x float> [[TMP1]], <4 x float> poison, <4 x i32> zeroinitializer21; CHECK-NEXT: ret <4 x float> [[T6]]22;23 %t = insertelement <4 x float> poison, float %arg, i32 124 %t4 = insertelement <4 x float> %t, float %arg, i32 225 %t5 = insertelement <4 x float> %t4, float %arg, i32 026 %t6 = insertelement <4 x float> %t5, float %arg, i32 327 ret <4 x float> %t628}29 30define <4 x float> @good3(float %arg) {31; CHECK-LABEL: @good3(32; CHECK-NEXT: [[T:%.*]] = insertelement <4 x float> poison, float [[ARG:%.*]], i64 033; CHECK-NEXT: [[T6:%.*]] = shufflevector <4 x float> [[T]], <4 x float> poison, <4 x i32> zeroinitializer34; CHECK-NEXT: ret <4 x float> [[T6]]35;36 %t = insertelement <4 x float> zeroinitializer, float %arg, i32 037 %t4 = insertelement <4 x float> %t, float %arg, i32 138 %t5 = insertelement <4 x float> %t4, float %arg, i32 239 %t6 = insertelement <4 x float> %t5, float %arg, i32 340 ret <4 x float> %t641}42 43define <4 x float> @good4(float %arg) {44; CHECK-LABEL: @good4(45; CHECK-NEXT: [[T:%.*]] = insertelement <4 x float> poison, float [[ARG:%.*]], i64 046; CHECK-NEXT: [[TMP1:%.*]] = fadd <4 x float> [[T]], [[T]]47; CHECK-NEXT: [[T7:%.*]] = shufflevector <4 x float> [[TMP1]], <4 x float> poison, <4 x i32> zeroinitializer48; CHECK-NEXT: ret <4 x float> [[T7]]49;50 %t = insertelement <4 x float> zeroinitializer, float %arg, i32 051 %t4 = insertelement <4 x float> %t, float %arg, i32 152 %t5 = insertelement <4 x float> %t4, float %arg, i32 253 %t6 = insertelement <4 x float> %t5, float %arg, i32 354 %t7 = fadd <4 x float> %t6, %t655 ret <4 x float> %t756}57 58define <4 x float> @good5(float %v) {59; CHECK-LABEL: @good5(60; CHECK-NEXT: [[INS1:%.*]] = insertelement <4 x float> poison, float [[V:%.*]], i64 061; CHECK-NEXT: [[A1:%.*]] = fadd <4 x float> [[INS1]], [[INS1]]62; CHECK-NEXT: [[INS4:%.*]] = shufflevector <4 x float> [[INS1]], <4 x float> poison, <4 x i32> zeroinitializer63; CHECK-NEXT: [[RES:%.*]] = fadd <4 x float> [[A1]], [[INS4]]64; CHECK-NEXT: ret <4 x float> [[RES]]65;66 %ins1 = insertelement <4 x float> poison, float %v, i32 067 %a1 = fadd <4 x float> %ins1, %ins168 %ins2 = insertelement<4 x float> %ins1, float %v, i32 169 %ins3 = insertelement<4 x float> %ins2, float %v, i32 270 %ins4 = insertelement<4 x float> %ins3, float %v, i32 371 %res = fadd <4 x float> %a1, %ins472 ret <4 x float> %res73}74 75; The insert is changed to allow the canonical shuffle-splat pattern from element 0.76 77define <4 x float> @splat_undef1(float %arg) {78; CHECK-LABEL: @splat_undef1(79; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> poison, float [[ARG:%.*]], i64 080; CHECK-NEXT: [[T6:%.*]] = shufflevector <4 x float> [[TMP1]], <4 x float> poison, <4 x i32> <i32 poison, i32 0, i32 0, i32 0>81; CHECK-NEXT: ret <4 x float> [[T6]]82;83 %t = insertelement <4 x float> poison, float %arg, i32 184 %t4 = insertelement <4 x float> %t, float %arg, i32 185 %t5 = insertelement <4 x float> %t4, float %arg, i32 286 %t6 = insertelement <4 x float> %t5, float %arg, i32 387 ret <4 x float> %t688}89 90; Re-uses the existing first insertelement.91 92define <4 x float> @splat_undef2(float %arg) {93; CHECK-LABEL: @splat_undef2(94; CHECK-NEXT: [[T:%.*]] = insertelement <4 x float> poison, float [[ARG:%.*]], i64 095; CHECK-NEXT: [[T6:%.*]] = shufflevector <4 x float> [[T]], <4 x float> poison, <4 x i32> <i32 0, i32 poison, i32 0, i32 0>96; CHECK-NEXT: ret <4 x float> [[T6]]97;98 %t = insertelement <4 x float> poison, float %arg, i32 099 %t5 = insertelement <4 x float> %t, float %arg, i32 2100 %t6 = insertelement <4 x float> %t5, float %arg, i32 3101 ret <4 x float> %t6102}103 104define <4 x float> @bad3(float %arg, float %arg2) {105; CHECK-LABEL: @bad3(106; CHECK-NEXT: [[T:%.*]] = insertelement <4 x float> poison, float [[ARG:%.*]], i64 0107; CHECK-NEXT: [[T4:%.*]] = insertelement <4 x float> [[T]], float [[ARG2:%.*]], i64 1108; CHECK-NEXT: [[T5:%.*]] = insertelement <4 x float> [[T4]], float [[ARG]], i64 2109; CHECK-NEXT: [[T6:%.*]] = insertelement <4 x float> [[T5]], float [[ARG]], i64 3110; CHECK-NEXT: ret <4 x float> [[T6]]111;112 %t = insertelement <4 x float> poison, float %arg, i32 0113 %t4 = insertelement <4 x float> %t, float %arg2, i32 1114 %t5 = insertelement <4 x float> %t4, float %arg, i32 2115 %t6 = insertelement <4 x float> %t5, float %arg, i32 3116 ret <4 x float> %t6117}118 119define <1 x float> @bad4(float %arg) {120; CHECK-LABEL: @bad4(121; CHECK-NEXT: [[T:%.*]] = insertelement <1 x float> poison, float [[ARG:%.*]], i64 0122; CHECK-NEXT: ret <1 x float> [[T]]123;124 %t = insertelement <1 x float> poison, float %arg, i32 0125 ret <1 x float> %t126}127 128; Multiple undef elements are ok.129; TODO: Multiple uses triggers the transform at %t4, but we should sink/scalarize/CSE the splats?130 131define <4 x float> @splat_undef3(float %arg) {132; CHECK-LABEL: @splat_undef3(133; CHECK-NEXT: [[T:%.*]] = insertelement <4 x float> poison, float [[ARG:%.*]], i64 0134; CHECK-NEXT: [[T4:%.*]] = shufflevector <4 x float> [[T]], <4 x float> poison, <4 x i32> <i32 0, i32 0, i32 poison, i32 poison>135; CHECK-NEXT: [[T6:%.*]] = shufflevector <4 x float> [[T]], <4 x float> poison, <4 x i32> zeroinitializer136; CHECK-NEXT: [[T7:%.*]] = fadd <4 x float> [[T6]], [[T4]]137; CHECK-NEXT: ret <4 x float> [[T7]]138;139 %t = insertelement <4 x float> poison, float %arg, i32 0140 %t4 = insertelement <4 x float> %t, float %arg, i32 1141 %t5 = insertelement <4 x float> %t4, float %arg, i32 2142 %t6 = insertelement <4 x float> %t5, float %arg, i32 3143 %t7 = fadd <4 x float> %t6, %t4144 ret <4 x float> %t7145}146 147define <4 x float> @bad6(float %arg, i32 %k) {148; CHECK-LABEL: @bad6(149; CHECK-NEXT: [[T:%.*]] = insertelement <4 x float> poison, float [[ARG:%.*]], i64 0150; CHECK-NEXT: [[T4:%.*]] = insertelement <4 x float> [[T]], float [[ARG]], i64 1151; CHECK-NEXT: [[T5:%.*]] = insertelement <4 x float> [[T4]], float [[ARG]], i32 [[K:%.*]]152; CHECK-NEXT: [[T6:%.*]] = insertelement <4 x float> [[T5]], float [[ARG]], i64 3153; CHECK-NEXT: ret <4 x float> [[T6]]154;155 %t = insertelement <4 x float> poison, float %arg, i32 0156 %t4 = insertelement <4 x float> %t, float %arg, i32 1157 %t5 = insertelement <4 x float> %t4, float %arg, i32 %k158 %t6 = insertelement <4 x float> %t5, float %arg, i32 3159 ret <4 x float> %t6160}161 162define <4 x float> @bad7(float %v) {163; CHECK-LABEL: @bad7(164; CHECK-NEXT: [[INS1:%.*]] = insertelement <4 x float> poison, float [[V:%.*]], i64 1165; CHECK-NEXT: [[A1:%.*]] = fadd <4 x float> [[INS1]], [[INS1]]166; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> [[INS1]], float [[V]], i64 0167; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x float> [[TMP1]], float [[V]], i64 2168; CHECK-NEXT: [[INS4:%.*]] = insertelement <4 x float> [[TMP2]], float [[V]], i64 3169; CHECK-NEXT: [[RES:%.*]] = fadd <4 x float> [[A1]], [[INS4]]170; CHECK-NEXT: ret <4 x float> [[RES]]171;172 %ins1 = insertelement <4 x float> poison, float %v, i32 1173 %a1 = fadd <4 x float> %ins1, %ins1174 %ins2 = insertelement<4 x float> %ins1, float %v, i32 2175 %ins3 = insertelement<4 x float> %ins2, float %v, i32 3176 %ins4 = insertelement<4 x float> %ins3, float %v, i32 0177 %res = fadd <4 x float> %a1, %ins4178 ret <4 x float> %res179}180