xref: /llvm-project/llvm/test/CodeGen/SPIRV/optimizations/add-check-overflow.ll (revision 2c13dec3284d019fdedf7913083ce82aa5cb97aa)
1a059b299SVyacheslav Levytskyy; This test aims to check ability to support "Arithmetic with Overflow" intrinsics
2a059b299SVyacheslav Levytskyy; in the special case when those intrinsics are being generated by the CodeGenPrepare;
3*2c13dec3SAlex Voicu; pass during translations with optimization (note -disable-lsr, to inhibit
4*2c13dec3SAlex Voicu; strength reduction pre-empting with a more preferable match for this pattern
5*2c13dec3SAlex Voicu; in llc arguments).
6a059b299SVyacheslav Levytskyy
7a059b299SVyacheslav Levytskyy; RUN: llc -O3 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s
8a059b299SVyacheslav Levytskyy; RUN: %if spirv-tools %{ llc -O3 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
9a059b299SVyacheslav Levytskyy
10a059b299SVyacheslav Levytskyy; RUN: llc -O3 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
11a059b299SVyacheslav Levytskyy; RUN: %if spirv-tools %{ llc -O3 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
12a059b299SVyacheslav Levytskyy
13*2c13dec3SAlex Voicu; RUN: llc -O3 -disable-lsr -mtriple=spirv32-unknown-unknown %s -o - | FileCheck --check-prefix=NOLSR %s
14*2c13dec3SAlex Voicu; RUN: %if spirv-tools %{ llc -O3 -disable-lsr -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
15*2c13dec3SAlex Voicu
16*2c13dec3SAlex Voicu; RUN: llc -O3 -disable-lsr -mtriple=spirv64-unknown-unknown %s -o - | FileCheck --check-prefix=NOLSR %s
17*2c13dec3SAlex Voicu; RUN: %if spirv-tools %{ llc -O3 -disable-lsr -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
18*2c13dec3SAlex Voicu
19*2c13dec3SAlex Voicu; CHECK-DAG: OpName %[[PhiRes:.*]] "lsr.iv"
20*2c13dec3SAlex Voicu; CHECK-DAG: OpName %[[IsOver:.*]] "fl"
21*2c13dec3SAlex Voicu; CHECK-DAG: OpName %[[Val:.*]] "lsr.iv.next"
22a059b299SVyacheslav Levytskyy; CHECK-DAG: %[[Int:.*]] = OpTypeInt 32 0
23a059b299SVyacheslav Levytskyy; CHECK-DAG: %[[Char:.*]] = OpTypeInt 8 0
24a059b299SVyacheslav Levytskyy; CHECK-DAG: %[[PtrChar:.*]] = OpTypePointer Generic %[[Char]]
25a059b299SVyacheslav Levytskyy; CHECK-DAG: %[[Bool:.*]] = OpTypeBool
26a059b299SVyacheslav Levytskyy; CHECK-DAG: %[[Const1:.*]] = OpConstant %[[Int]] 1
27*2c13dec3SAlex Voicu; CHECK-DAG: %[[Zero:.*]] = OpConstant %[[Int]] 0
28a059b299SVyacheslav Levytskyy; CHECK-DAG: %[[Const42:.*]] = OpConstant %[[Char]] 42
29a059b299SVyacheslav Levytskyy
30a059b299SVyacheslav Levytskyy; CHECK: OpFunction
31a059b299SVyacheslav Levytskyy; CHECK: %[[A:.*]] = OpFunctionParameter %[[Int]]
32a059b299SVyacheslav Levytskyy; CHECK: %[[Ptr:.*]] = OpFunctionParameter %[[PtrChar]]
33*2c13dec3SAlex Voicu; CHECK: %[[APlusOne:.*]] = OpIAdd %[[Int]] %[[A]] %[[Const1]]
34a059b299SVyacheslav Levytskyy;	CHECK: OpBranch %[[#]]
35*2c13dec3SAlex Voicu;	CHECK: [[#]] = OpLabel
36*2c13dec3SAlex Voicu;	CHECK: %[[PhiRes]] = OpPhi %[[Int]] %[[Val]] %[[#]] %[[APlusOne]] %[[#]]
37*2c13dec3SAlex Voicu;	CHECK: %[[IsOver]] = OpIEqual %[[Bool]] %[[#]] %[[#]]
38a059b299SVyacheslav Levytskyy;	CHECK: OpBranchConditional %[[IsOver]] %[[#]] %[[#]]
39*2c13dec3SAlex Voicu;	CHECK: [[#]] = OpLabel
40a059b299SVyacheslav Levytskyy;	CHECK: OpStore %[[Ptr]] %[[Const42]] Aligned 1
41*2c13dec3SAlex Voicu;	CHECK: [[Val]] = OpIAdd %[[Int]] %[[PhiRes]] %[[Const1]]
42a059b299SVyacheslav Levytskyy; CHECK: OpBranch %[[#]]
43*2c13dec3SAlex Voicu;	CHECK: [[#]] = OpLabel
44*2c13dec3SAlex Voicu;	OpReturnValue %[[PhiRes]]
45*2c13dec3SAlex Voicu
46*2c13dec3SAlex Voicu; NOLSR-DAG: OpName %[[Val:.*]] "math"
47*2c13dec3SAlex Voicu; NOLSR-DAG: OpName %[[IsOver:.*]] "ov"
48*2c13dec3SAlex Voicu; NOLSR-DAG: %[[Int:.*]] = OpTypeInt 32 0
49*2c13dec3SAlex Voicu; NOLSR-DAG: %[[Char:.*]] = OpTypeInt 8 0
50*2c13dec3SAlex Voicu; NOLSR-DAG: %[[PtrChar:.*]] = OpTypePointer Generic %[[Char]]
51*2c13dec3SAlex Voicu; NOLSR-DAG: %[[Bool:.*]] = OpTypeBool
52*2c13dec3SAlex Voicu; NOLSR-DAG: %[[Struct:.*]] = OpTypeStruct %[[Int]] %[[Int]]
53*2c13dec3SAlex Voicu; NOLSR-DAG: %[[Const1:.*]] = OpConstant %[[Int]] 1
54*2c13dec3SAlex Voicu; NOLSR-DAG: %[[Const42:.*]] = OpConstant %[[Char]] 42
55*2c13dec3SAlex Voicu; NOLSR-DAG: %[[Zero:.*]] = OpConstantNull %[[Int]]
56*2c13dec3SAlex Voicu
57*2c13dec3SAlex Voicu; NOLSR: OpFunction
58*2c13dec3SAlex Voicu; NOLSR: %[[A:.*]] = OpFunctionParameter %[[Int]]
59*2c13dec3SAlex Voicu; NOLSR: %[[Ptr:.*]] = OpFunctionParameter %[[PtrChar]]
60*2c13dec3SAlex Voicu; NOLSR: %[[#]] = OpLabel
61*2c13dec3SAlex Voicu; NOLSR: OpBranch %[[#]]
62*2c13dec3SAlex Voicu; NOLSR: %[[#]] = OpLabel
63*2c13dec3SAlex Voicu; NOLSR: %[[PhiRes:.*]] = OpPhi %[[Int]] %[[A]] %[[#]] %[[Val]] %[[#]]
64*2c13dec3SAlex Voicu; NOLSR: %[[AggRes:.*]] = OpIAddCarry %[[Struct]] %[[PhiRes]] %[[Const1]]
65*2c13dec3SAlex Voicu; NOLSR: %[[Val]] = OpCompositeExtract %[[Int]] %[[AggRes]] 0
66*2c13dec3SAlex Voicu; NOLSR: %[[Over:.*]] = OpCompositeExtract %[[Int]] %[[AggRes]] 1
67*2c13dec3SAlex Voicu; NOLSR: %[[IsOver]] = OpINotEqual %[[Bool:.*]] %[[Over]] %[[Zero]]
68*2c13dec3SAlex Voicu; NOLSR: OpBranchConditional %[[IsOver]] %[[#]] %[[#]]
69*2c13dec3SAlex Voicu; NOLSR: OpStore %[[Ptr]] %[[Const42]] Aligned 1
70*2c13dec3SAlex Voicu; NOLSR: OpBranch %[[#]]
71*2c13dec3SAlex Voicu; NOLSR: %[[#]] = OpLabel
72*2c13dec3SAlex Voicu; NOLSR: OpReturnValue %[[Val]]
73*2c13dec3SAlex Voicu; NOLSR: OpFunctionEnd
74a059b299SVyacheslav Levytskyy
75a059b299SVyacheslav Levytskyydefine spir_func i32 @foo(i32 %a, ptr addrspace(4) %p) {
76a059b299SVyacheslav Levytskyyentry:
77a059b299SVyacheslav Levytskyy  br label %l1
78a059b299SVyacheslav Levytskyy
79a059b299SVyacheslav Levytskyybody:
80a059b299SVyacheslav Levytskyy  store i8 42, ptr addrspace(4) %p
81a059b299SVyacheslav Levytskyy  br label %l1
82a059b299SVyacheslav Levytskyy
83a059b299SVyacheslav Levytskyyl1:
84a059b299SVyacheslav Levytskyy  %e = phi i32 [ %a, %entry ], [ %i, %body ]
85a059b299SVyacheslav Levytskyy  %i = add nsw i32 %e, 1
86a059b299SVyacheslav Levytskyy  %fl = icmp eq i32 %i, 0
87a059b299SVyacheslav Levytskyy  br i1 %fl, label %exit, label %body
88a059b299SVyacheslav Levytskyy
89a059b299SVyacheslav Levytskyyexit:
90a059b299SVyacheslav Levytskyy  ret i32 %i
91a059b299SVyacheslav Levytskyy}
92