@@ -610,3 +610,75 @@ define void @umul_fix_sat_poison(ptr %P) {
610610
611611 ret void
612612}
613+
614+ declare void @use.i32 (i32 , i1 )
615+
616+ define void @umul_extractvalue (ptr %P , i32 %x ) {
617+ ; CHECK-LABEL: @umul_extractvalue(
618+ ; CHECK-NEXT: [[UMUL_1:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[X:%.*]], i32 1)
619+ ; CHECK-NEXT: [[R_1:%.*]] = extractvalue { i32, i1 } [[UMUL_1]], 0
620+ ; CHECK-NEXT: [[OV_1:%.*]] = extractvalue { i32, i1 } [[UMUL_1]], 1
621+ ; CHECK-NEXT: call void @use.i32(i32 [[R_1]], i1 [[OV_1]])
622+ ; CHECK-NEXT: [[UMUL_2:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 1, i32 [[X]])
623+ ; CHECK-NEXT: [[R_2:%.*]] = extractvalue { i32, i1 } [[UMUL_2]], 0
624+ ; CHECK-NEXT: [[OV_2:%.*]] = extractvalue { i32, i1 } [[UMUL_2]], 1
625+ ; CHECK-NEXT: call void @use.i32(i32 [[R_2]], i1 [[OV_2]])
626+ ; CHECK-NEXT: [[UMUL_3:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 2, i32 [[X]])
627+ ; CHECK-NEXT: [[R_3:%.*]] = extractvalue { i32, i1 } [[UMUL_3]], 0
628+ ; CHECK-NEXT: [[OV_3:%.*]] = extractvalue { i32, i1 } [[UMUL_3]], 1
629+ ; CHECK-NEXT: call void @use.i32(i32 [[R_3]], i1 [[OV_3]])
630+ ; CHECK-NEXT: ret void
631+ ;
632+ %umul.1 = call {i32 , i1 } @llvm.umul.with.overflow (i32 %x , i32 1 )
633+ %r.1 = extractvalue {i32 , i1 } %umul.1 , 0
634+ %ov.1 = extractvalue {i32 , i1 } %umul.1 , 1
635+ call void @use.i32 (i32 %r.1 , i1 %ov.1 )
636+
637+ %umul.2 = call {i32 , i1 } @llvm.umul.with.overflow (i32 1 , i32 %x )
638+ %r.2 = extractvalue {i32 , i1 } %umul.2 , 0
639+ %ov.2 = extractvalue {i32 , i1 } %umul.2 , 1
640+ call void @use.i32 (i32 %r.2 , i1 %ov.2 )
641+
642+ %umul.3 = call {i32 , i1 } @llvm.umul.with.overflow (i32 2 , i32 %x )
643+ %r.3 = extractvalue {i32 , i1 } %umul.3 , 0
644+ %ov.3 = extractvalue {i32 , i1 } %umul.3 , 1
645+ call void @use.i32 (i32 %r.3 , i1 %ov.3 )
646+
647+ ret void
648+ }
649+
650+ declare void @use.4xi32 (<4 x i32 >, <4 x i1 >)
651+
652+ define void @umul_extractvalue_vec (ptr %P , <4 x i32 > %x ) {
653+ ; CHECK-LABEL: @umul_extractvalue_vec(
654+ ; CHECK-NEXT: [[UMUL_1:%.*]] = call { <4 x i32>, <4 x i1> } @llvm.umul.with.overflow.v4i32(<4 x i32> [[X:%.*]], <4 x i32> splat (i32 1))
655+ ; CHECK-NEXT: [[R_1:%.*]] = extractvalue { <4 x i32>, <4 x i1> } [[UMUL_1]], 0
656+ ; CHECK-NEXT: [[OV_1:%.*]] = extractvalue { <4 x i32>, <4 x i1> } [[UMUL_1]], 1
657+ ; CHECK-NEXT: call void @use.4xi32(<4 x i32> [[R_1]], <4 x i1> [[OV_1]])
658+ ; CHECK-NEXT: [[UMUL_2:%.*]] = call { <4 x i32>, <4 x i1> } @llvm.umul.with.overflow.v4i32(<4 x i32> splat (i32 1), <4 x i32> [[X]])
659+ ; CHECK-NEXT: [[R_2:%.*]] = extractvalue { <4 x i32>, <4 x i1> } [[UMUL_2]], 0
660+ ; CHECK-NEXT: [[OV_2:%.*]] = extractvalue { <4 x i32>, <4 x i1> } [[UMUL_2]], 1
661+ ; CHECK-NEXT: call void @use.4xi32(<4 x i32> [[R_2]], <4 x i1> [[OV_2]])
662+ ; CHECK-NEXT: [[UMUL_3:%.*]] = call { <4 x i32>, <4 x i1> } @llvm.umul.with.overflow.v4i32(<4 x i32> splat (i32 2), <4 x i32> [[X]])
663+ ; CHECK-NEXT: [[R_3:%.*]] = extractvalue { <4 x i32>, <4 x i1> } [[UMUL_3]], 0
664+ ; CHECK-NEXT: [[OV_3:%.*]] = extractvalue { <4 x i32>, <4 x i1> } [[UMUL_3]], 1
665+ ; CHECK-NEXT: call void @use.4xi32(<4 x i32> [[R_3]], <4 x i1> [[OV_3]])
666+ ; CHECK-NEXT: ret void
667+ ;
668+ %umul.1 = call {<4 x i32 >, <4 x i1 >} @llvm.umul.with.overflow.v4i32 (<4 x i32 > %x , <4 x i32 > <i32 1 , i32 1 , i32 1 , i32 1 >)
669+ %r.1 = extractvalue {<4 x i32 >, <4 x i1 >} %umul.1 , 0
670+ %ov.1 = extractvalue {<4 x i32 >, <4 x i1 >} %umul.1 , 1
671+ call void @use.4xi32 (<4 x i32 > %r.1 , <4 x i1 > %ov.1 )
672+
673+ %umul.2 = call {<4 x i32 >, <4 x i1 >} @llvm.umul.with.overflow.v4i32 (<4 x i32 > <i32 1 , i32 1 , i32 1 , i32 1 >, <4 x i32 > %x )
674+ %r.2 = extractvalue {<4 x i32 >, <4 x i1 >} %umul.2 , 0
675+ %ov.2 = extractvalue {<4 x i32 >, <4 x i1 >} %umul.2 , 1
676+ call void @use.4xi32 (<4 x i32 > %r.2 , <4 x i1 > %ov.2 )
677+
678+ %umul.3 = call {<4 x i32 >, <4 x i1 >} @llvm.umul.with.overflow.v4i32 (<4 x i32 > <i32 2 , i32 2 , i32 2 , i32 2 >, <4 x i32 > %x )
679+ %r.3 = extractvalue {<4 x i32 >, <4 x i1 >} %umul.3 , 0
680+ %ov.3 = extractvalue {<4 x i32 >, <4 x i1 >} %umul.3 , 1
681+ call void @use.4xi32 (<4 x i32 > %r.3 , <4 x i1 > %ov.3 )
682+
683+ ret void
684+ }
0 commit comments