Skip to content

Commit a8649a2

Browse files
committed
[InstSimplify] Add tests with extractvalue (umul_with_overflow)
1 parent afa0e70 commit a8649a2

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

llvm/test/Transforms/InstSimplify/fold-intrinsics.ll

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)