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