[PATCH] D28810: [X86][SSE] Use MOVMSK for all_of/any_of reduction patterns

Filipe Cabecinhas via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 19 07:50:54 PST 2017

filcab added a comment.

I see that some simple tests grow by a bunch of instructions (also simple, but from looking at instruction tables, it seems to be marginally slower after this transform). These tests are like micro-benchmarks and don't really reflect real-world code, but should we only do this transform if we have a minimum number of shuffles?


Comment at: lib/Target/X86/X86ISelLowering.cpp:28639
+    SDValue Match = matchBinOpReduction(Extract, Op);
+    if (!Match || (Match.getScalarValueSizeInBits() != BitWidth))
+      continue;
Maybe that second part should be in an assert?
The way I see it, we haven't really done much yet, so either:
  - The bitwidth changed (how? `matchBinOpReduction` bails if it encounters an extract_subvector (shuffles with different sizes are a thing in IR though, can't remember if also on SDAG)) but we can still recover if we use the new bitwidth we got (if it still matched, there shouldn't be a big problem, no?)
  - The bitwidth changed and we can't recover (does this happen?)

Comment at: lib/Target/X86/X86ISelLowering.cpp:28657
+      MaskVT = MVT::getFloatingPointVT(BitWidth);
+      MaskVT = MVT::getVectorVT(MaskVT, MatchSizeInBits / BitWidth);
+    } else {
This raised a red flag when reading. Maybe join the two? Will it be that hard to read?
Otherwise, something like
```MVT ElemVT = ...;
MaskVT = ...;```



More information about the llvm-commits mailing list