-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[clang][llvm][SPIR-V] Explicitly encode native integer widths for SPIR-V #110695
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
758fb6e
ccbff3c
f1c8446
9863f1d
c552d99
04cdc23
d07b46f
a2d6159
a5e183b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,41 +1,76 @@ | ||
; This test aims to check ability to support "Arithmetic with Overflow" intrinsics | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not sure what the problem is with this test, but it's already covered by another? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This relies on There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This one is testing codegenprepare as part of the normal codegen pipeline, so this one is fine. The other case was a full optimization pipeline + codegen, which are more far removed There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Right but it's relying on a non-guaranteed maybe-optimisation firing, as far as I can tell. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @AlexVlx I'm strongly against deleting this test case. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The main objection is that the code base should switch from one stable state to another, without losing current coverage, stability, etc. When any of us is adding a feature that alters translation behavior it looks fair to expect that the same contributor is responsible for updating all impacted existing components. Applying this principle to the PR, I'd rather expect that you update existing test case (if it's required by the change), but not remove it. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @AlexVlx I am not sure I follow the reasoning here. The idea behind those various tests in I do agree that we should not expect specific optimizations (or even more sets of optimizations) to do specific things when writing a test for an independent component. Hence, after some thinking, I believe the test could be improved by already containing a specific pattern that would be coming from the optimization. However, by the same principle, we should not expect that the issue will be "optimized away" by another optimization. I would also oppose removing existing test cases. Any improvements, strengthening, or necessary changes are (of course) desirable. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
The point is to test the optimization does work. The codegen pipeline is a bunch of intertwined IR passes on top of core codegen, and they need to cooperate. Testing what the behavior is is also always important, regardless of whether the result is what you want it to be or not There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @michalpaszkowski @VyacheslavLevytskyy I've restored the test, and retained the apparent intention of triggering combining in CodeGenPrepare. I do think there's a bit of an impedance mismatch in the conversation, but that might be just me: on one hand, there's nothing special about the pattern that results, and we already test for the correct generation of the intrinsics themselves. On the other, LSR does a better job here so it's not quite a case of a problem going away, but rather a more profitable optimisation becoming viable. Perhaps we could extend the test to cover this by way of, essentially, looking for the overflow intrinsics if LSR is off, and checking their absence when it's on, albeit that might introduce some added brittleness. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The codegen prepare behavior is still backend code to be tested. You can just run codegenprepare as a standalone pass too (usually would have separate llc and opt run lines in such a test) |
||
; in the special case when those intrinsics are being generated by the CodeGenPrepare; | ||
; pass during translations with optimization (note -O3 in llc arguments). | ||
; pass during translations with optimization (note -disable-lsr, to inhibit | ||
; strength reduction pre-empting with a more preferable match for this pattern | ||
; in llc arguments). | ||
|
||
; RUN: llc -O3 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s | ||
; RUN: %if spirv-tools %{ llc -O3 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %} | ||
|
||
; RUN: llc -O3 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s | ||
; RUN: %if spirv-tools %{ llc -O3 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %} | ||
|
||
; CHECK-DAG: OpName %[[Val:.*]] "math" | ||
; CHECK-DAG: OpName %[[IsOver:.*]] "ov" | ||
; RUN: llc -O3 -disable-lsr -mtriple=spirv32-unknown-unknown %s -o - | FileCheck --check-prefix=NOLSR %s | ||
; RUN: %if spirv-tools %{ llc -O3 -disable-lsr -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %} | ||
|
||
; RUN: llc -O3 -disable-lsr -mtriple=spirv64-unknown-unknown %s -o - | FileCheck --check-prefix=NOLSR %s | ||
; RUN: %if spirv-tools %{ llc -O3 -disable-lsr -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %} | ||
|
||
; CHECK-DAG: OpName %[[PhiRes:.*]] "lsr.iv" | ||
; CHECK-DAG: OpName %[[IsOver:.*]] "fl" | ||
; CHECK-DAG: OpName %[[Val:.*]] "lsr.iv.next" | ||
; CHECK-DAG: %[[Int:.*]] = OpTypeInt 32 0 | ||
; CHECK-DAG: %[[Char:.*]] = OpTypeInt 8 0 | ||
; CHECK-DAG: %[[PtrChar:.*]] = OpTypePointer Generic %[[Char]] | ||
; CHECK-DAG: %[[Bool:.*]] = OpTypeBool | ||
; CHECK-DAG: %[[Struct:.*]] = OpTypeStruct %[[Int]] %[[Int]] | ||
; CHECK-DAG: %[[Const1:.*]] = OpConstant %[[Int]] 1 | ||
; CHECK-DAG: %[[Zero:.*]] = OpConstant %[[Int]] 0 | ||
; CHECK-DAG: %[[Const42:.*]] = OpConstant %[[Char]] 42 | ||
; CHECK-DAG: %[[Zero:.*]] = OpConstantNull %[[Int]] | ||
|
||
; CHECK: OpFunction | ||
; CHECK: %[[A:.*]] = OpFunctionParameter %[[Int]] | ||
; CHECK: %[[Ptr:.*]] = OpFunctionParameter %[[PtrChar]] | ||
; CHECK: %[[#]] = OpLabel | ||
; CHECK: OpBranch %[[#]] | ||
; CHECK: %[[#]] = OpLabel | ||
; CHECK: %[[PhiRes:.*]] = OpPhi %[[Int]] %[[A]] %[[#]] %[[Val]] %[[#]] | ||
; CHECK: %[[AggRes:.*]] = OpIAddCarry %[[Struct]] %[[PhiRes]] %[[Const1]] | ||
; CHECK: %[[Val]] = OpCompositeExtract %[[Int]] %[[AggRes]] 0 | ||
; CHECK: %[[Over:.*]] = OpCompositeExtract %[[Int]] %[[AggRes]] 1 | ||
; CHECK: %[[IsOver]] = OpINotEqual %[[Bool:.*]] %[[Over]] %[[Zero]] | ||
; CHECK: OpBranchConditional %[[IsOver]] %[[#]] %[[#]] | ||
; CHECK: OpStore %[[Ptr]] %[[Const42]] Aligned 1 | ||
; CHECK: %[[APlusOne:.*]] = OpIAdd %[[Int]] %[[A]] %[[Const1]] | ||
; CHECK: OpBranch %[[#]] | ||
; CHECK: [[#]] = OpLabel | ||
; CHECK: %[[PhiRes]] = OpPhi %[[Int]] %[[Val]] %[[#]] %[[APlusOne]] %[[#]] | ||
; CHECK: %[[IsOver]] = OpIEqual %[[Bool]] %[[#]] %[[#]] | ||
; CHECK: OpBranchConditional %[[IsOver]] %[[#]] %[[#]] | ||
; CHECK: [[#]] = OpLabel | ||
; CHECK: OpStore %[[Ptr]] %[[Const42]] Aligned 1 | ||
; CHECK: [[Val]] = OpIAdd %[[Int]] %[[PhiRes]] %[[Const1]] | ||
; CHECK: OpBranch %[[#]] | ||
; CHECK: %[[#]] = OpLabel | ||
; CHECK: OpReturnValue %[[Val]] | ||
; CHECK: OpFunctionEnd | ||
; CHECK: [[#]] = OpLabel | ||
; OpReturnValue %[[PhiRes]] | ||
|
||
; NOLSR-DAG: OpName %[[Val:.*]] "math" | ||
; NOLSR-DAG: OpName %[[IsOver:.*]] "ov" | ||
; NOLSR-DAG: %[[Int:.*]] = OpTypeInt 32 0 | ||
; NOLSR-DAG: %[[Char:.*]] = OpTypeInt 8 0 | ||
; NOLSR-DAG: %[[PtrChar:.*]] = OpTypePointer Generic %[[Char]] | ||
; NOLSR-DAG: %[[Bool:.*]] = OpTypeBool | ||
; NOLSR-DAG: %[[Struct:.*]] = OpTypeStruct %[[Int]] %[[Int]] | ||
; NOLSR-DAG: %[[Const1:.*]] = OpConstant %[[Int]] 1 | ||
; NOLSR-DAG: %[[Const42:.*]] = OpConstant %[[Char]] 42 | ||
; NOLSR-DAG: %[[Zero:.*]] = OpConstantNull %[[Int]] | ||
|
||
; NOLSR: OpFunction | ||
; NOLSR: %[[A:.*]] = OpFunctionParameter %[[Int]] | ||
; NOLSR: %[[Ptr:.*]] = OpFunctionParameter %[[PtrChar]] | ||
; NOLSR: %[[#]] = OpLabel | ||
; NOLSR: OpBranch %[[#]] | ||
; NOLSR: %[[#]] = OpLabel | ||
; NOLSR: %[[PhiRes:.*]] = OpPhi %[[Int]] %[[A]] %[[#]] %[[Val]] %[[#]] | ||
; NOLSR: %[[AggRes:.*]] = OpIAddCarry %[[Struct]] %[[PhiRes]] %[[Const1]] | ||
; NOLSR: %[[Val]] = OpCompositeExtract %[[Int]] %[[AggRes]] 0 | ||
; NOLSR: %[[Over:.*]] = OpCompositeExtract %[[Int]] %[[AggRes]] 1 | ||
; NOLSR: %[[IsOver]] = OpINotEqual %[[Bool:.*]] %[[Over]] %[[Zero]] | ||
; NOLSR: OpBranchConditional %[[IsOver]] %[[#]] %[[#]] | ||
; NOLSR: OpStore %[[Ptr]] %[[Const42]] Aligned 1 | ||
; NOLSR: OpBranch %[[#]] | ||
; NOLSR: %[[#]] = OpLabel | ||
; NOLSR: OpReturnValue %[[Val]] | ||
; NOLSR: OpFunctionEnd | ||
|
||
define spir_func i32 @foo(i32 %a, ptr addrspace(4) %p) { | ||
entry: | ||
|
Uh oh!
There was an error while loading. Please reload this page.