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