1- ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
21; RUN: opt -S -scalarizer -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s
32
43; CHECK: %dx.types.i32c = type { i32, i1 }
54
65define noundef i32 @test_UAddc (i32 noundef %a , i32 noundef %b ) {
76; CHECK-LABEL: define noundef i32 @test_UAddc(
87; 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
1211; CHECK-NEXT: [[CARRY_ZEXT:%.*]] = zext i1 [[CARRY]] to i32
1312; CHECK-NEXT: [[RESULT:%.*]] = add i32 [[SUM]], [[CARRY_ZEXT]]
1413; 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
2625; CHECK-SAME: <2 x i32> noundef [[A:%.*]], <2 x i32> noundef [[B:%.*]]) {
2726; CHECK-NEXT: [[A_I0:%.*]] = extractelement <2 x i32> [[A]], i64 0
2827; 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]]
3029; CHECK-NEXT: [[A_I1:%.*]] = extractelement <2 x i32> [[A]], i64 1
3130; 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
3736; CHECK-NEXT: [[CARRY_I0:%.*]] = extractelement <2 x i1> [[CARRY]], i64 0
3837; 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
4140; CHECK-NEXT: [[CARRY_ZEXT_I0:%.*]] = zext i1 [[CARRY_I0]] to i32
4241; CHECK-NEXT: [[CARRY_ZEXT_I1:%.*]] = zext i1 [[CARRY_I1]] to i32
4342; 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]]
4544; CHECK-NEXT: [[RESULT_UPTO0:%.*]] = insertelement <2 x i32> poison, i32 [[RESULT_I0]], i64 0
4645; CHECK-NEXT: [[RESULT:%.*]] = insertelement <2 x i32> [[RESULT_UPTO0]], i32 [[RESULT_I1]], i64 1
4746; 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
5756define noundef i32 @test_UAddc_insert (i32 noundef %a , i32 noundef %b ) {
5857; CHECK-LABEL: define noundef i32 @test_UAddc_insert(
5958; 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
6362; CHECK-NEXT: ret i32 [[RESULT]]
6463;
6564 %uaddc = call { i32 , i1 } @llvm.uadd.with.overflow.i32 (i32 %a , i32 %b )
0 commit comments