[PATCH] D143593: [InstCombine] Don't fold freeze poison when it's used in shufflevector

Manuel Brito via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 10 08:41:03 PST 2023


ManuelJBrito updated this revision to Diff 496490.
ManuelJBrito retitled this revision from "[InstCombine] Don't fold freeze poison when its used in shufflevector" to "[InstCombine] Don't fold freeze poison when it's used in shufflevector".
ManuelJBrito added a comment.

  Add tests and code comment


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D143593/new/

https://reviews.llvm.org/D143593

Files:
  llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
  llvm/test/Transforms/InstCombine/shufflevector_freezepoison.ll


Index: llvm/test/Transforms/InstCombine/shufflevector_freezepoison.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/InstCombine/shufflevector_freezepoison.ll
@@ -0,0 +1,50 @@
+; RUN: opt -passes='instcombine' -S %s | FileCheck %s
+
+define <4 x double> @shuffle_op1_freeze_poison(<2 x double> %a) {
+; CHECK-LABEL: @shuffle_op1_freeze_poison(
+; CHECK-NEXT:   call void @use(<2 x double> zeroinitializer)
+; CHECK-NEXT:   [[SV:%.*]] = shufflevector <2 x double> zeroinitializer, <2 x double> %{{.*}}, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
+; CHECK-NEXT:   ret <4 x double> [[SV]]
+  %b = freeze <2 x double> poison
+  call void @use(<2 x double> %b)
+  %shuffle = shufflevector <2 x double> %b, <2 x double> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
+  ret <4 x double> %shuffle
+}
+
+define <4 x double> @shuffle_op2_freeze_poison(<2 x double> %a) {
+; CHECK-LABEL: @shuffle_op2_freeze_poison(
+; CHECK-NEXT:   [[FR:%.*]] = freeze <2 x double> poison
+; CHECK-NEXT:   call void @use(<2 x double> [[FR]])
+; CHECK-NEXT:   [[SV:%.*]] = shufflevector <2 x double> %{{.*}}, <2 x double> [[FR]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>
+; CHECK-NEXT:   ret <4 x double> [[SV]]
+  %b = freeze <2 x double> poison
+  call void @use(<2 x double> %b)
+  %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
+  ret <4 x double> %shuffle
+}
+
+define <4 x double> @shuffle_op1_freeze_undef(<2 x double> %a) {
+; CHECK-LABEL: @shuffle_op1_freeze_undef(
+; CHECK-NEXT:   call void @use(<2 x double> zeroinitializer)
+; CHECK-NEXT:   [[SV:%.*]] = shufflevector <2 x double> zeroinitializer, <2 x double> %{{.*}}, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
+; CHECK-NEXT:   ret <4 x double> [[SV]]
+  %b = freeze <2 x double> undef
+  call void @use(<2 x double> %b)
+  %shuffle = shufflevector <2 x double> %b, <2 x double> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
+  ret <4 x double> %shuffle
+}
+
+define <4 x double> @shuffle_op2_freeze_undef(<2 x double> %a) {
+; CHECK-LABEL: @shuffle_op2_freeze_undef(
+; CHECK-NEXT:   [[FR:%.*]] = freeze <2 x double> undef
+; CHECK-NEXT:   call void @use(<2 x double> [[FR]])
+; CHECK-NEXT:   [[SV:%.*]] = shufflevector <2 x double> %{{.*}}, <2 x double> [[FR]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>
+; CHECK-NEXT:   ret <4 x double> [[SV]]
+  %b = freeze <2 x double> undef
+  call void @use(<2 x double> %b)
+  %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
+  ret <4 x double> %shuffle
+}
+
+declare void @use(<2 x double>)
+
Index: llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+++ llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -4016,6 +4016,9 @@
 
   if (match(Op0, m_Undef())) {
     for (const auto *U : I.users()) {
+    // Don't fold freeze(undef/poison) if it's used has the second vector in a shuffle.
+    // This is necessary for the backend to generate efficient assembly for
+    // mm*_cast* intel intrinsics.
       if (match(U, m_Shuffle(m_Value(), m_Specific(&I))))
         return nullptr;
     }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D143593.496490.patch
Type: text/x-patch
Size: 3257 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230210/0cc1d09c/attachment.bin>


More information about the llvm-commits mailing list