xref: /llvm-project/llvm/test/Transforms/InstCombine/insert-ext.ll (revision acdc419c897f8a9414c7a00c8908ac32312afee2)
13cb5aa86SSanjay Patel; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*acdc419cSBjorn Pettersson; RUN: opt < %s -passes=instcombine -S | FileCheck %s
33cb5aa86SSanjay Patel
43cb5aa86SSanjay Pateldeclare void @use(i32)
53cb5aa86SSanjay Pateldeclare void @usevec(<2 x i32>)
63cb5aa86SSanjay Patel
73cb5aa86SSanjay Pateldefine <2 x double> @fpext_fpext(<2 x half> %x, half %y, i32 %index) {
83cb5aa86SSanjay Patel; CHECK-LABEL: @fpext_fpext(
9e5a32d72SSanjay Patel; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x half> [[X:%.*]], half [[Y:%.*]], i32 [[INDEX:%.*]]
10e5a32d72SSanjay Patel; CHECK-NEXT:    [[I:%.*]] = fpext <2 x half> [[TMP1]] to <2 x double>
113cb5aa86SSanjay Patel; CHECK-NEXT:    ret <2 x double> [[I]]
123cb5aa86SSanjay Patel;
133cb5aa86SSanjay Patel  %v = fpext <2 x half> %x to <2 x double>
143cb5aa86SSanjay Patel  %s = fpext half %y to double
153cb5aa86SSanjay Patel  %i = insertelement <2 x double> %v, double %s, i32 %index
163cb5aa86SSanjay Patel  ret <2 x double> %i
173cb5aa86SSanjay Patel}
183cb5aa86SSanjay Patel
193cb5aa86SSanjay Pateldefine <2 x i32> @sext_sext(<2 x i8> %x, i8 %y, i32 %index) {
203cb5aa86SSanjay Patel; CHECK-LABEL: @sext_sext(
21e5a32d72SSanjay Patel; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x i8> [[X:%.*]], i8 [[Y:%.*]], i32 [[INDEX:%.*]]
22e5a32d72SSanjay Patel; CHECK-NEXT:    [[I:%.*]] = sext <2 x i8> [[TMP1]] to <2 x i32>
233cb5aa86SSanjay Patel; CHECK-NEXT:    ret <2 x i32> [[I]]
243cb5aa86SSanjay Patel;
253cb5aa86SSanjay Patel  %v = sext <2 x i8> %x to <2 x i32>
263cb5aa86SSanjay Patel  %s = sext i8 %y to i32
273cb5aa86SSanjay Patel  %i = insertelement <2 x i32> %v, i32 %s, i32 %index
283cb5aa86SSanjay Patel  ret <2 x i32> %i
293cb5aa86SSanjay Patel}
303cb5aa86SSanjay Patel
313cb5aa86SSanjay Pateldefine <2 x i12> @zext_zext(<2 x i8> %x, i8 %y, i32 %index) {
323cb5aa86SSanjay Patel; CHECK-LABEL: @zext_zext(
33e5a32d72SSanjay Patel; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x i8> [[X:%.*]], i8 [[Y:%.*]], i32 [[INDEX:%.*]]
34e5a32d72SSanjay Patel; CHECK-NEXT:    [[I:%.*]] = zext <2 x i8> [[TMP1]] to <2 x i12>
353cb5aa86SSanjay Patel; CHECK-NEXT:    ret <2 x i12> [[I]]
363cb5aa86SSanjay Patel;
373cb5aa86SSanjay Patel  %v = zext <2 x i8> %x to <2 x i12>
383cb5aa86SSanjay Patel  %s = zext i8 %y to i12
393cb5aa86SSanjay Patel  %i = insertelement <2 x i12> %v, i12 %s, i32 %index
403cb5aa86SSanjay Patel  ret <2 x i12> %i
413cb5aa86SSanjay Patel}
423cb5aa86SSanjay Patel
43e5a32d72SSanjay Patel; negative test - need same source type
44e5a32d72SSanjay Patel
453cb5aa86SSanjay Pateldefine <2 x double> @fpext_fpext_types(<2 x half> %x, float %y, i32 %index) {
463cb5aa86SSanjay Patel; CHECK-LABEL: @fpext_fpext_types(
473cb5aa86SSanjay Patel; CHECK-NEXT:    [[V:%.*]] = fpext <2 x half> [[X:%.*]] to <2 x double>
483cb5aa86SSanjay Patel; CHECK-NEXT:    [[S:%.*]] = fpext float [[Y:%.*]] to double
493cb5aa86SSanjay Patel; CHECK-NEXT:    [[I:%.*]] = insertelement <2 x double> [[V]], double [[S]], i32 [[INDEX:%.*]]
503cb5aa86SSanjay Patel; CHECK-NEXT:    ret <2 x double> [[I]]
513cb5aa86SSanjay Patel;
523cb5aa86SSanjay Patel  %v = fpext <2 x half> %x to <2 x double>
533cb5aa86SSanjay Patel  %s = fpext float %y to double
543cb5aa86SSanjay Patel  %i = insertelement <2 x double> %v, double %s, i32 %index
553cb5aa86SSanjay Patel  ret <2 x double> %i
563cb5aa86SSanjay Patel}
573cb5aa86SSanjay Patel
58e5a32d72SSanjay Patel; negative test - need same source type
59e5a32d72SSanjay Patel
603cb5aa86SSanjay Pateldefine <2 x i32> @sext_sext_types(<2 x i16> %x, i8 %y, i32 %index) {
613cb5aa86SSanjay Patel; CHECK-LABEL: @sext_sext_types(
623cb5aa86SSanjay Patel; CHECK-NEXT:    [[V:%.*]] = sext <2 x i16> [[X:%.*]] to <2 x i32>
633cb5aa86SSanjay Patel; CHECK-NEXT:    [[S:%.*]] = sext i8 [[Y:%.*]] to i32
643cb5aa86SSanjay Patel; CHECK-NEXT:    [[I:%.*]] = insertelement <2 x i32> [[V]], i32 [[S]], i32 [[INDEX:%.*]]
653cb5aa86SSanjay Patel; CHECK-NEXT:    ret <2 x i32> [[I]]
663cb5aa86SSanjay Patel;
673cb5aa86SSanjay Patel  %v = sext <2 x i16> %x to <2 x i32>
683cb5aa86SSanjay Patel  %s = sext i8 %y to i32
693cb5aa86SSanjay Patel  %i = insertelement <2 x i32> %v, i32 %s, i32 %index
703cb5aa86SSanjay Patel  ret <2 x i32> %i
713cb5aa86SSanjay Patel}
723cb5aa86SSanjay Patel
73e5a32d72SSanjay Patel; negative test - need same extend opcode
74e5a32d72SSanjay Patel
753cb5aa86SSanjay Pateldefine <2 x i12> @sext_zext(<2 x i8> %x, i8 %y, i32 %index) {
763cb5aa86SSanjay Patel; CHECK-LABEL: @sext_zext(
773cb5aa86SSanjay Patel; CHECK-NEXT:    [[V:%.*]] = sext <2 x i8> [[X:%.*]] to <2 x i12>
783cb5aa86SSanjay Patel; CHECK-NEXT:    [[S:%.*]] = zext i8 [[Y:%.*]] to i12
793cb5aa86SSanjay Patel; CHECK-NEXT:    [[I:%.*]] = insertelement <2 x i12> [[V]], i12 [[S]], i32 [[INDEX:%.*]]
803cb5aa86SSanjay Patel; CHECK-NEXT:    ret <2 x i12> [[I]]
813cb5aa86SSanjay Patel;
823cb5aa86SSanjay Patel  %v = sext <2 x i8> %x to <2 x i12>
833cb5aa86SSanjay Patel  %s = zext i8 %y to i12
843cb5aa86SSanjay Patel  %i = insertelement <2 x i12> %v, i12 %s, i32 %index
853cb5aa86SSanjay Patel  ret <2 x i12> %i
863cb5aa86SSanjay Patel}
873cb5aa86SSanjay Patel
88e5a32d72SSanjay Patel; negative test - don't trade scalar extend for vector extend
89e5a32d72SSanjay Patel
903cb5aa86SSanjay Pateldefine <2 x i32> @sext_sext_use1(<2 x i8> %x, i8 %y, i32 %index) {
913cb5aa86SSanjay Patel; CHECK-LABEL: @sext_sext_use1(
923cb5aa86SSanjay Patel; CHECK-NEXT:    [[V:%.*]] = sext <2 x i8> [[X:%.*]] to <2 x i32>
933cb5aa86SSanjay Patel; CHECK-NEXT:    call void @usevec(<2 x i32> [[V]])
943cb5aa86SSanjay Patel; CHECK-NEXT:    [[S:%.*]] = sext i8 [[Y:%.*]] to i32
953cb5aa86SSanjay Patel; CHECK-NEXT:    [[I:%.*]] = insertelement <2 x i32> [[V]], i32 [[S]], i32 [[INDEX:%.*]]
963cb5aa86SSanjay Patel; CHECK-NEXT:    ret <2 x i32> [[I]]
973cb5aa86SSanjay Patel;
983cb5aa86SSanjay Patel  %v = sext <2 x i8> %x to <2 x i32>
993cb5aa86SSanjay Patel  call void @usevec(<2 x i32> %v)
1003cb5aa86SSanjay Patel  %s = sext i8 %y to i32
1013cb5aa86SSanjay Patel  %i = insertelement <2 x i32> %v, i32 %s, i32 %index
1023cb5aa86SSanjay Patel  ret <2 x i32> %i
1033cb5aa86SSanjay Patel}
1043cb5aa86SSanjay Patel
1053cb5aa86SSanjay Pateldefine <2 x i32> @zext_zext_use2(<2 x i8> %x, i8 %y, i32 %index) {
1063cb5aa86SSanjay Patel; CHECK-LABEL: @zext_zext_use2(
1073cb5aa86SSanjay Patel; CHECK-NEXT:    [[S:%.*]] = zext i8 [[Y:%.*]] to i32
1083cb5aa86SSanjay Patel; CHECK-NEXT:    call void @use(i32 [[S]])
109e5a32d72SSanjay Patel; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x i8> [[X:%.*]], i8 [[Y]], i32 [[INDEX:%.*]]
110e5a32d72SSanjay Patel; CHECK-NEXT:    [[I:%.*]] = zext <2 x i8> [[TMP1]] to <2 x i32>
1113cb5aa86SSanjay Patel; CHECK-NEXT:    ret <2 x i32> [[I]]
1123cb5aa86SSanjay Patel;
1133cb5aa86SSanjay Patel  %v = zext <2 x i8> %x to <2 x i32>
1143cb5aa86SSanjay Patel  %s = zext i8 %y to i32
1153cb5aa86SSanjay Patel  call void @use(i32 %s)
1163cb5aa86SSanjay Patel  %i = insertelement <2 x i32> %v, i32 %s, i32 %index
1173cb5aa86SSanjay Patel  ret <2 x i32> %i
1183cb5aa86SSanjay Patel}
1193cb5aa86SSanjay Patel
120e5a32d72SSanjay Patel; negative test - don't create an extra extend
121e5a32d72SSanjay Patel
1223cb5aa86SSanjay Pateldefine <2 x i32> @zext_zext_use3(<2 x i8> %x, i8 %y, i32 %index) {
1233cb5aa86SSanjay Patel; CHECK-LABEL: @zext_zext_use3(
1243cb5aa86SSanjay Patel; CHECK-NEXT:    [[V:%.*]] = zext <2 x i8> [[X:%.*]] to <2 x i32>
1253cb5aa86SSanjay Patel; CHECK-NEXT:    call void @usevec(<2 x i32> [[V]])
1263cb5aa86SSanjay Patel; CHECK-NEXT:    [[S:%.*]] = zext i8 [[Y:%.*]] to i32
1273cb5aa86SSanjay Patel; CHECK-NEXT:    call void @use(i32 [[S]])
1283cb5aa86SSanjay Patel; CHECK-NEXT:    [[I:%.*]] = insertelement <2 x i32> [[V]], i32 [[S]], i32 [[INDEX:%.*]]
1293cb5aa86SSanjay Patel; CHECK-NEXT:    ret <2 x i32> [[I]]
1303cb5aa86SSanjay Patel;
1313cb5aa86SSanjay Patel  %v = zext <2 x i8> %x to <2 x i32>
1323cb5aa86SSanjay Patel  call void @usevec(<2 x i32> %v)
1333cb5aa86SSanjay Patel  %s = zext i8 %y to i32
1343cb5aa86SSanjay Patel  call void @use(i32 %s)
1353cb5aa86SSanjay Patel  %i = insertelement <2 x i32> %v, i32 %s, i32 %index
1363cb5aa86SSanjay Patel  ret <2 x i32> %i
1373cb5aa86SSanjay Patel}
138