1
- ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2
1
; RUN: opt -S -scalarizer -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s
3
2
4
3
; CHECK: %dx.types.i32c = type { i32, i1 }
5
4
6
5
define noundef i32 @test_UAddc (i32 noundef %a , i32 noundef %b ) {
7
6
; CHECK-LABEL: define noundef i32 @test_UAddc(
8
7
; CHECK-SAME: i32 noundef [[A:%.*]], i32 noundef [[B:%.*]]) {
9
- ; CHECK-NEXT: [[UADDC1 :%.*]] = call [[DX_TYPES_I32C:%dx\.types\.i32c]] @dx.op.binaryWithCarryOrBorrow.i32(i32 44, i32 [[A]], i32 [[B]]) #[[ATTR0:[0-9]+]]
10
- ; CHECK-NEXT: [[CARRY:%.*]] = extractvalue [[DX_TYPES_I32C]] [[UADDC1 ]], 1
11
- ; CHECK-NEXT: [[SUM:%.*]] = extractvalue [[DX_TYPES_I32C]] [[UADDC1 ]], 0
8
+ ; CHECK-NEXT: [[UADDC :%.*]] = call [[DX_TYPES_I32C:%dx\.types\.i32c]] @dx.op.binaryWithCarryOrBorrow.i32(i32 44, i32 [[A]], i32 [[B]]) #[[ATTR0:[0-9]+]]
9
+ ; CHECK-NEXT: [[CARRY:%.*]] = extractvalue [[DX_TYPES_I32C]] [[UADDC ]], 1
10
+ ; CHECK-NEXT: [[SUM:%.*]] = extractvalue [[DX_TYPES_I32C]] [[UADDC ]], 0
12
11
; CHECK-NEXT: [[CARRY_ZEXT:%.*]] = zext i1 [[CARRY]] to i32
13
12
; CHECK-NEXT: [[RESULT:%.*]] = add i32 [[SUM]], [[CARRY_ZEXT]]
14
13
; CHECK-NEXT: ret i32 [[RESULT]]
@@ -26,22 +25,22 @@ define noundef <2 x i32> @test_UAddc_vec2(<2 x i32> noundef %a, <2 x i32> nounde
26
25
; CHECK-SAME: <2 x i32> noundef [[A:%.*]], <2 x i32> noundef [[B:%.*]]) {
27
26
; CHECK-NEXT: [[A_I0:%.*]] = extractelement <2 x i32> [[A]], i64 0
28
27
; CHECK-NEXT: [[B_I0:%.*]] = extractelement <2 x i32> [[B]], i64 0
29
- ; CHECK-NEXT: [[UADDC_I09 :%.*]] = call [[DX_TYPES_I32C:%dx\.types\.i32c]] @dx.op.binaryWithCarryOrBorrow.i32(i32 44, i32 [[A_I0]], i32 [[B_I0]]) #[[ATTR0]]
28
+ ; CHECK-NEXT: [[UADDC_I0 :%.*]] = call [[DX_TYPES_I32C:%dx\.types\.i32c]] @dx.op.binaryWithCarryOrBorrow.i32(i32 44, i32 [[A_I0]], i32 [[B_I0]]) #[[ATTR0]]
30
29
; CHECK-NEXT: [[A_I1:%.*]] = extractelement <2 x i32> [[A]], i64 1
31
30
; CHECK-NEXT: [[B_I1:%.*]] = extractelement <2 x i32> [[B]], i64 1
32
- ; CHECK-NEXT: [[UADDC_I18 :%.*]] = call [[DX_TYPES_I32C]] @dx.op.binaryWithCarryOrBorrow.i32(i32 44, i32 [[A_I1]], i32 [[B_I1]]) #[[ATTR0]]
33
- ; CHECK-NEXT: [[CARRY_ELEM1 :%.*]] = extractvalue [[DX_TYPES_I32C]] [[UADDC_I09 ]], 1
34
- ; CHECK-NEXT: [[CARRY_ELEM11 :%.*]] = extractvalue [[DX_TYPES_I32C]] [[UADDC_I18 ]], 1
35
- ; CHECK-NEXT: [[CARRY_UPTO0:%.*]] = insertelement <2 x i1> poison, i1 [[CARRY_ELEM1 ]], i64 0
36
- ; CHECK-NEXT: [[CARRY:%.*]] = insertelement <2 x i1> [[CARRY_UPTO0]], i1 [[CARRY_ELEM11 ]], i64 1
31
+ ; CHECK-NEXT: [[UADDC_I1 :%.*]] = call [[DX_TYPES_I32C]] @dx.op.binaryWithCarryOrBorrow.i32(i32 44, i32 [[A_I1]], i32 [[B_I1]]) #[[ATTR0]]
32
+ ; CHECK-NEXT: [[CARRY_ELEM0 :%.*]] = extractvalue [[DX_TYPES_I32C]] [[UADDC_I0 ]], 1
33
+ ; CHECK-NEXT: [[CARRY_ELEM1 :%.*]] = extractvalue [[DX_TYPES_I32C]] [[UADDC_I1 ]], 1
34
+ ; CHECK-NEXT: [[CARRY_UPTO0:%.*]] = insertelement <2 x i1> poison, i1 [[CARRY_ELEM0 ]], i64 0
35
+ ; CHECK-NEXT: [[CARRY:%.*]] = insertelement <2 x i1> [[CARRY_UPTO0]], i1 [[CARRY_ELEM1 ]], i64 1
37
36
; CHECK-NEXT: [[CARRY_I0:%.*]] = extractelement <2 x i1> [[CARRY]], i64 0
38
37
; CHECK-NEXT: [[CARRY_I1:%.*]] = extractelement <2 x i1> [[CARRY]], i64 1
39
- ; CHECK-NEXT: [[SUM_ELEM0:%.*]] = extractvalue [[DX_TYPES_I32C]] [[UADDC_I09 ]], 0
40
- ; CHECK-NEXT: [[SUM_ELEM02 :%.*]] = extractvalue [[DX_TYPES_I32C]] [[UADDC_I18 ]], 0
38
+ ; CHECK-NEXT: [[SUM_ELEM0:%.*]] = extractvalue [[DX_TYPES_I32C]] [[UADDC_I0 ]], 0
39
+ ; CHECK-NEXT: [[SUM_ELEM1 :%.*]] = extractvalue [[DX_TYPES_I32C]] [[UADDC_I1 ]], 0
41
40
; CHECK-NEXT: [[CARRY_ZEXT_I0:%.*]] = zext i1 [[CARRY_I0]] to i32
42
41
; CHECK-NEXT: [[CARRY_ZEXT_I1:%.*]] = zext i1 [[CARRY_I1]] to i32
43
42
; CHECK-NEXT: [[RESULT_I0:%.*]] = add i32 [[SUM_ELEM0]], [[CARRY_ZEXT_I0]]
44
- ; CHECK-NEXT: [[RESULT_I1:%.*]] = add i32 [[SUM_ELEM02 ]], [[CARRY_ZEXT_I1]]
43
+ ; CHECK-NEXT: [[RESULT_I1:%.*]] = add i32 [[SUM_ELEM1 ]], [[CARRY_ZEXT_I1]]
45
44
; CHECK-NEXT: [[RESULT_UPTO0:%.*]] = insertelement <2 x i32> poison, i32 [[RESULT_I0]], i64 0
46
45
; CHECK-NEXT: [[RESULT:%.*]] = insertelement <2 x i32> [[RESULT_UPTO0]], i32 [[RESULT_I1]], i64 1
47
46
; CHECK-NEXT: ret <2 x i32> [[RESULT]]
@@ -57,9 +56,9 @@ define noundef <2 x i32> @test_UAddc_vec2(<2 x i32> noundef %a, <2 x i32> nounde
57
56
define noundef i32 @test_UAddc_insert (i32 noundef %a , i32 noundef %b ) {
58
57
; CHECK-LABEL: define noundef i32 @test_UAddc_insert(
59
58
; CHECK-SAME: i32 noundef [[A:%.*]], i32 noundef [[B:%.*]]) {
60
- ; CHECK-NEXT: [[UADDC1 :%.*]] = call [[DX_TYPES_I32C:%dx\.types\.i32c]] @dx.op.binaryWithCarryOrBorrow.i32(i32 44, i32 [[A]], i32 [[B]]) #[[ATTR0]]
61
- ; CHECK-NEXT: [[TMP1 :%.*]] = insertvalue [[DX_TYPES_I32C]] [[UADDC1 ]], i32 [[A]], 0
62
- ; CHECK-NEXT: [[RESULT:%.*]] = extractvalue [[DX_TYPES_I32C]] [[UADDC1 ]], 0
59
+ ; CHECK-NEXT: [[UADDC :%.*]] = call [[DX_TYPES_I32C:%dx\.types\.i32c]] @dx.op.binaryWithCarryOrBorrow.i32(i32 44, i32 [[A]], i32 [[B]]) #[[ATTR0]]
60
+ ; CHECK-NEXT: [[UNUSED :%.*]] = insertvalue [[DX_TYPES_I32C]] [[UADDC ]], i32 [[A]], 0
61
+ ; CHECK-NEXT: [[RESULT:%.*]] = extractvalue [[DX_TYPES_I32C]] [[UADDC ]], 0
63
62
; CHECK-NEXT: ret i32 [[RESULT]]
64
63
;
65
64
%uaddc = call { i32 , i1 } @llvm.uadd.with.overflow.i32 (i32 %a , i32 %b )
0 commit comments