[PATCH] D151340: AMDGPU: Refine undef handling for llvm.amdgcn.class intrinsic
Matt Arsenault via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu May 25 13:39:21 PDT 2023
arsenm updated this revision to Diff 525775.
arsenm added a comment.
Compare with undef
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D151340/new/
https://reviews.llvm.org/D151340
Files:
llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp
llvm/test/Transforms/InstCombine/AMDGPU/amdgcn-intrinsics.ll
Index: llvm/test/Transforms/InstCombine/AMDGPU/amdgcn-intrinsics.ll
===================================================================
--- llvm/test/Transforms/InstCombine/AMDGPU/amdgcn-intrinsics.ll
+++ llvm/test/Transforms/InstCombine/AMDGPU/amdgcn-intrinsics.ll
@@ -569,14 +569,14 @@
define i1 @test_class_poison_poison_f32(float %x) nounwind {
; CHECK-LABEL: @test_class_poison_poison_f32(
-; CHECK-NEXT: ret i1 undef
+; CHECK-NEXT: ret i1 poison
;
%val = call i1 @llvm.amdgcn.class.f32(float poison, i32 poison)
ret i1 %val
}
define i1 @test_class_val_poison_f32(float %arg) nounwind {
; CHECK-LABEL: @test_class_val_poison_f32(
-; CHECK-NEXT: ret i1 false
+; CHECK-NEXT: ret i1 poison
;
%val = call i1 @llvm.amdgcn.class.f32(float %arg, i32 poison)
ret i1 %val
@@ -584,7 +584,7 @@
define i1 @test_class_poison_val_f32(i32 %arg) nounwind {
; CHECK-LABEL: @test_class_poison_val_f32(
-; CHECK-NEXT: ret i1 undef
+; CHECK-NEXT: ret i1 poison
;
%val = call i1 @llvm.amdgcn.class.f32(float poison, i32 %arg)
ret i1 %val
@@ -639,6 +639,15 @@
ret i1 %val
}
+define i1 @test_class_undef_val_f32_var(i32 %arg) nounwind {
+; CHECK-LABEL: @test_class_undef_val_f32_var(
+; CHECK-NEXT: [[VAL:%.*]] = icmp ne i32 [[ARG:%.*]], 0
+; CHECK-NEXT: ret i1 [[VAL]]
+;
+ %val = call i1 @llvm.amdgcn.class.f32(float undef, i32 %arg)
+ ret i1 %val
+}
+
define i1 @test_class_val_undef_f32(float %arg) nounwind {
; CHECK-LABEL: @test_class_val_undef_f32(
; CHECK-NEXT: ret i1 false
@@ -649,7 +658,7 @@
define i1 @test_class_undef_undef_f32() nounwind {
; CHECK-LABEL: @test_class_undef_undef_f32(
-; CHECK-NEXT: ret i1 undef
+; CHECK-NEXT: ret i1 false
;
%val = call i1 @llvm.amdgcn.class.f32(float undef, i32 undef)
ret i1 %val
Index: llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp
===================================================================
--- llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp
+++ llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp
@@ -460,14 +460,20 @@
return ⅈ
}
- // FIXME: Should propagate poison.
- if (isa<UndefValue>(Src0))
- return IC.replaceInstUsesWith(II, UndefValue::get(II.getType()));
+ // Propagate poison.
+ if (isa<PoisonValue>(Src0) || isa<PoisonValue>(Src1))
+ return IC.replaceInstUsesWith(II, PoisonValue::get(II.getType()));
- if (isa<UndefValue>(Src1)) {
+ // llvm.amdgcn.class(_, undef) -> false
+ if (IC.getSimplifyQuery().isUndefValue(Src1))
return IC.replaceInstUsesWith(II, ConstantInt::get(II.getType(), false));
- }
+ // llvm.amdgcn.class(undef, mask) -> mask != 0
+ if (IC.getSimplifyQuery().isUndefValue(Src0)) {
+ Value *CmpMask = IC.Builder.CreateICmpNE(
+ Src1, ConstantInt::getNullValue(Src1->getType()));
+ return IC.replaceInstUsesWith(II, CmpMask);
+ }
break;
}
case Intrinsic::amdgcn_cvt_pkrtz: {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D151340.525775.patch
Type: text/x-patch
Size: 2950 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230525/62a2ed80/attachment.bin>
More information about the llvm-commits
mailing list