; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -instcombine -S < %s | FileCheck %s
-; CHECK-LABEL: good1
-; CHECK: %[[INS:.*]] = insertelement <4 x float> undef, float %arg, i32 0
-; CHECK-NEXT: %[[BCAST:.*]] = shufflevector <4 x float> %[[INS]], <4 x float> undef, <4 x i32> zeroinitializer
-; CHECK-NEXT: ret <4 x float> %[[BCAST]]
define <4 x float> @good1(float %arg) {
+; CHECK-LABEL: @good1(
+; CHECK-NEXT: [[TMP:%.*]] = insertelement <4 x float> undef, float [[ARG:%.*]], i32 0
+; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <4 x float> [[TMP]], <4 x float> undef, <4 x i32> zeroinitializer
+; CHECK-NEXT: ret <4 x float> [[TMP6]]
+;
%tmp = insertelement <4 x float> undef, float %arg, i32 0
%tmp4 = insertelement <4 x float> %tmp, float %arg, i32 1
%tmp5 = insertelement <4 x float> %tmp4, float %arg, i32 2
ret <4 x float> %tmp6
}
-; CHECK-LABEL: good2
-; CHECK: %[[INS:.*]] = insertelement <4 x float> undef, float %arg, i32 0
-; CHECK-NEXT: %[[BCAST:.*]] = shufflevector <4 x float> %[[INS]], <4 x float> undef, <4 x i32> zeroinitializer
-; CHECK-NEXT: ret <4 x float> %[[BCAST]]
define <4 x float> @good2(float %arg) {
+; CHECK-LABEL: @good2(
+; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x float> undef, float [[ARG:%.*]], i32 0
+; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <4 x float> [[TMP1]], <4 x float> undef, <4 x i32> zeroinitializer
+; CHECK-NEXT: ret <4 x float> [[TMP6]]
+;
%tmp = insertelement <4 x float> undef, float %arg, i32 1
%tmp4 = insertelement <4 x float> %tmp, float %arg, i32 2
%tmp5 = insertelement <4 x float> %tmp4, float %arg, i32 0
ret <4 x float> %tmp6
}
-; CHECK-LABEL: good3
-; CHECK: %[[INS:.*]] = insertelement <4 x float> undef, float %arg, i32 0
-; CHECK-NEXT: %[[BCAST:.*]] = shufflevector <4 x float> %[[INS]], <4 x float> undef, <4 x i32> zeroinitializer
-; CHECK-NEXT: ret <4 x float> %[[BCAST]]
define <4 x float> @good3(float %arg) {
+; CHECK-LABEL: @good3(
+; CHECK-NEXT: [[TMP:%.*]] = insertelement <4 x float> undef, float [[ARG:%.*]], i32 0
+; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <4 x float> [[TMP]], <4 x float> undef, <4 x i32> zeroinitializer
+; CHECK-NEXT: ret <4 x float> [[TMP6]]
+;
%tmp = insertelement <4 x float> zeroinitializer, float %arg, i32 0
%tmp4 = insertelement <4 x float> %tmp, float %arg, i32 1
%tmp5 = insertelement <4 x float> %tmp4, float %arg, i32 2
ret <4 x float> %tmp6
}
-; CHECK-LABEL: good4
-; CHECK: %[[INS:.*]] = insertelement <4 x float> undef, float %arg, i32 0
-; CHECK-NEXT: %[[ADD:.*]] = fadd <4 x float> %[[INS]], %[[INS]]
-; CHECK-NEXT: %[[BCAST:.*]] = shufflevector <4 x float> %[[ADD]], <4 x float> undef, <4 x i32> zeroinitializer
-; CHECK-NEXT: ret <4 x float> %[[BCAST]]
define <4 x float> @good4(float %arg) {
+; CHECK-LABEL: @good4(
+; CHECK-NEXT: [[TMP:%.*]] = insertelement <4 x float> undef, float [[ARG:%.*]], i32 0
+; CHECK-NEXT: [[TMP1:%.*]] = fadd <4 x float> [[TMP]], [[TMP]]
+; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <4 x float> [[TMP1]], <4 x float> undef, <4 x i32> zeroinitializer
+; CHECK-NEXT: ret <4 x float> [[TMP7]]
+;
%tmp = insertelement <4 x float> zeroinitializer, float %arg, i32 0
%tmp4 = insertelement <4 x float> %tmp, float %arg, i32 1
%tmp5 = insertelement <4 x float> %tmp4, float %arg, i32 2
ret <4 x float> %tmp7
}
-; CHECK-LABEL: @good5(
-; CHECK-NEXT: %ins1 = insertelement <4 x float> undef, float %v, i32 0
-; CHECK-NEXT: %a1 = fadd <4 x float> %ins1, %ins1
-; CHECK-NEXT: %ins4 = shufflevector <4 x float> %ins1, <4 x float> undef, <4 x i32> zeroinitializer
-; CHECK-NEXT: %res = fadd <4 x float> %a1, %ins4
-; CHECK-NEXT: ret <4 x float> %res
define <4 x float> @good5(float %v) {
+; CHECK-LABEL: @good5(
+; CHECK-NEXT: [[INS1:%.*]] = insertelement <4 x float> undef, float [[V:%.*]], i32 0
+; CHECK-NEXT: [[A1:%.*]] = fadd <4 x float> [[INS1]], [[INS1]]
+; CHECK-NEXT: [[INS4:%.*]] = shufflevector <4 x float> [[INS1]], <4 x float> undef, <4 x i32> zeroinitializer
+; CHECK-NEXT: [[RES:%.*]] = fadd <4 x float> [[A1]], [[INS4]]
+; CHECK-NEXT: ret <4 x float> [[RES]]
+;
%ins1 = insertelement <4 x float> undef, float %v, i32 0
%a1 = fadd <4 x float> %ins1, %ins1
%ins2 = insertelement<4 x float> %ins1, float %v, i32 1
ret <4 x float> %res
}
-; CHECK-LABEL: bad1
-; CHECK-NOT: shufflevector
define <4 x float> @bad1(float %arg) {
+; CHECK-LABEL: @bad1(
+; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x float> undef, float [[ARG:%.*]], i32 1
+; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x float> [[TMP4]], float [[ARG]], i32 2
+; CHECK-NEXT: [[TMP6:%.*]] = insertelement <4 x float> [[TMP5]], float [[ARG]], i32 3
+; CHECK-NEXT: ret <4 x float> [[TMP6]]
+;
%tmp = insertelement <4 x float> undef, float %arg, i32 1
%tmp4 = insertelement <4 x float> %tmp, float %arg, i32 1
%tmp5 = insertelement <4 x float> %tmp4, float %arg, i32 2
ret <4 x float> %tmp6
}
-; CHECK-LABEL: bad2
-; CHECK-NOT: shufflevector
define <4 x float> @bad2(float %arg) {
+; CHECK-LABEL: @bad2(
+; CHECK-NEXT: [[TMP:%.*]] = insertelement <4 x float> undef, float [[ARG:%.*]], i32 0
+; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x float> [[TMP]], float [[ARG]], i32 2
+; CHECK-NEXT: [[TMP6:%.*]] = insertelement <4 x float> [[TMP5]], float [[ARG]], i32 3
+; CHECK-NEXT: ret <4 x float> [[TMP6]]
+;
%tmp = insertelement <4 x float> undef, float %arg, i32 0
%tmp5 = insertelement <4 x float> %tmp, float %arg, i32 2
%tmp6 = insertelement <4 x float> %tmp5, float %arg, i32 3
ret <4 x float> %tmp6
}
-; CHECK-LABEL: bad3
-; CHECK-NOT: shufflevector
define <4 x float> @bad3(float %arg, float %arg2) {
+; CHECK-LABEL: @bad3(
+; CHECK-NEXT: [[TMP:%.*]] = insertelement <4 x float> undef, float [[ARG:%.*]], i32 0
+; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x float> [[TMP]], float [[ARG2:%.*]], i32 1
+; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x float> [[TMP4]], float [[ARG]], i32 2
+; CHECK-NEXT: [[TMP6:%.*]] = insertelement <4 x float> [[TMP5]], float [[ARG]], i32 3
+; CHECK-NEXT: ret <4 x float> [[TMP6]]
+;
%tmp = insertelement <4 x float> undef, float %arg, i32 0
%tmp4 = insertelement <4 x float> %tmp, float %arg2, i32 1
%tmp5 = insertelement <4 x float> %tmp4, float %arg, i32 2
ret <4 x float> %tmp6
}
-; CHECK-LABEL: bad4
-; CHECK-NOT: shufflevector
define <1 x float> @bad4(float %arg) {
+; CHECK-LABEL: @bad4(
+; CHECK-NEXT: [[TMP:%.*]] = insertelement <1 x float> undef, float [[ARG:%.*]], i32 0
+; CHECK-NEXT: ret <1 x float> [[TMP]]
+;
%tmp = insertelement <1 x float> undef, float %arg, i32 0
ret <1 x float> %tmp
}
-; CHECK-LABEL: bad5
-; CHECK-NOT: shufflevector
define <4 x float> @bad5(float %arg) {
+; CHECK-LABEL: @bad5(
+; CHECK-NEXT: [[TMP:%.*]] = insertelement <4 x float> undef, float [[ARG:%.*]], i32 0
+; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x float> [[TMP]], float [[ARG]], i32 1
+; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x float> [[TMP4]], float [[ARG]], i32 2
+; CHECK-NEXT: [[TMP6:%.*]] = insertelement <4 x float> [[TMP5]], float [[ARG]], i32 3
+; CHECK-NEXT: [[TMP7:%.*]] = fadd <4 x float> [[TMP6]], [[TMP4]]
+; CHECK-NEXT: ret <4 x float> [[TMP7]]
+;
%tmp = insertelement <4 x float> undef, float %arg, i32 0
%tmp4 = insertelement <4 x float> %tmp, float %arg, i32 1
%tmp5 = insertelement <4 x float> %tmp4, float %arg, i32 2
ret <4 x float> %tmp7
}
-; CHECK-LABEL: bad6
-; CHECK-NOT: shufflevector
define <4 x float> @bad6(float %arg, i32 %k) {
+; CHECK-LABEL: @bad6(
+; CHECK-NEXT: [[TMP:%.*]] = insertelement <4 x float> undef, float [[ARG:%.*]], i32 0
+; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x float> [[TMP]], float [[ARG]], i32 1
+; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x float> [[TMP4]], float [[ARG]], i32 [[K:%.*]]
+; CHECK-NEXT: [[TMP6:%.*]] = insertelement <4 x float> [[TMP5]], float [[ARG]], i32 3
+; CHECK-NEXT: ret <4 x float> [[TMP6]]
+;
%tmp = insertelement <4 x float> undef, float %arg, i32 0
%tmp4 = insertelement <4 x float> %tmp, float %arg, i32 1
%tmp5 = insertelement <4 x float> %tmp4, float %arg, i32 %k
ret <4 x float> %tmp6
}
-; CHECK-LABEL: @bad7(
-; CHECK-NOT: shufflevector
define <4 x float> @bad7(float %v) {
+; CHECK-LABEL: @bad7(
+; CHECK-NEXT: [[INS1:%.*]] = insertelement <4 x float> undef, float [[V:%.*]], i32 1
+; CHECK-NEXT: [[A1:%.*]] = fadd <4 x float> [[INS1]], [[INS1]]
+; CHECK-NEXT: [[INS2:%.*]] = insertelement <4 x float> [[INS1]], float [[V]], i32 2
+; CHECK-NEXT: [[INS3:%.*]] = insertelement <4 x float> [[INS2]], float [[V]], i32 3
+; CHECK-NEXT: [[INS4:%.*]] = insertelement <4 x float> [[INS3]], float [[V]], i32 0
+; CHECK-NEXT: [[RES:%.*]] = fadd <4 x float> [[A1]], [[INS4]]
+; CHECK-NEXT: ret <4 x float> [[RES]]
+;
%ins1 = insertelement <4 x float> undef, float %v, i32 1
%a1 = fadd <4 x float> %ins1, %ins1
%ins2 = insertelement<4 x float> %ins1, float %v, i32 2