Marius Kamp
30cabdda45
[X86] Distribute Certain Bitwise Operations over SELECT ( #136555 )
...
InstCombine canonicalizes `(select P (and X (- X)) X)` to
`(and (select P (- X) umax) X)`. This is counterproductive for the X86
backend when BMI is available because we can encode `(and X (- X))`
using the `BLSI` instruction. A similar situation arises if we have
`(select P (and X (sub X 1)) X)` (prevents use of `BLSR` instruction) or
`(select P (xor X (sub X 1)) X)` (prevents use of `BLSMSK` instruction).
Trigger the inverse transformation in the X86 backend if BMI is
available and we can use the mentioned BMI instructions. This is done by
overriding the appropriate `shouldFoldSelectWithIdentityConstant()`
overload. In this way, we get `(select P (and X (- X)) X)` again, which
enables the use of `BLSI` (similar for the other cases described above).
Alive proofs: https://alive2.llvm.org/ce/z/MT_pKi
Fixes #131587 , fixes #133848 .
---------
Co-authored-by: Simon Pilgrim <llvm-dev@redking.me.uk >
2025-06-10 17:12:10 +01:00
..
2025-06-06 21:10:21 +08:00
2025-04-24 10:41:31 +01:00
2025-06-02 16:43:39 +02:00
2025-03-30 22:03:14 -07:00
2025-06-05 08:20:44 +01:00
2025-05-06 18:01:17 -07:00
2025-05-20 09:33:28 +01:00
2025-06-10 11:29:08 +01:00
2025-06-04 13:47:44 +01:00
2025-04-30 09:11:36 +02:00
2025-05-08 00:22:10 -07:00
2025-05-08 00:35:59 -07:00
2025-05-09 11:54:01 +08:00
2025-06-08 11:32:20 +01:00
2025-05-12 10:35:12 +01:00
2025-03-30 22:03:14 -07:00
2025-05-15 10:13:50 +01:00
2025-05-28 11:02:37 +01:00
2025-04-10 13:32:54 +01:00
2025-05-28 11:02:37 +01:00
2025-04-10 13:32:54 +01:00
2025-05-12 20:56:34 +08:00
2025-05-28 11:02:37 +01:00
2025-05-13 17:03:54 +01:00
2025-04-27 09:51:13 +08:00
2025-06-09 14:07:15 +01:00
2025-05-30 08:34:13 +01:00
2025-04-27 09:51:13 +08:00
2025-04-01 15:50:07 +01:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-06-09 08:35:56 +08:00
2025-04-27 14:01:37 +08:00
2025-06-09 08:35:56 +08:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-06-02 15:44:51 +08:00
2025-06-10 17:31:59 +08:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-04-28 09:52:03 -07:00
2025-05-13 17:10:54 +01:00
2025-06-10 15:48:37 +01:00
2025-04-03 15:56:53 +02:00
2025-04-14 09:58:46 -04:00
2025-05-06 18:01:17 -07:00
2025-06-03 08:44:13 +01:00
2025-05-06 18:01:17 -07:00
2025-04-22 17:36:41 -04:00
2025-06-09 17:57:15 +08:00
2025-06-10 17:12:10 +01:00
2025-04-24 11:47:09 +01:00
2025-05-06 14:27:27 +01:00
2025-05-06 14:27:27 +01:00
2025-06-05 08:20:44 +01:00
2025-06-03 08:44:13 +01:00
2025-06-03 08:44:13 +01:00
2025-06-03 08:44:13 +01:00
2025-03-30 22:03:14 -07:00
2025-06-03 08:44:13 +01:00
2025-06-03 08:44:13 +01:00
2025-06-03 08:44:13 +01:00
2025-06-03 08:44:13 +01:00
2025-06-03 08:44:13 +01:00
2025-06-03 08:44:13 +01:00
2025-06-03 08:44:13 +01:00
2025-06-03 08:44:13 +01:00
2025-03-30 16:38:16 -07:00
2025-04-30 15:01:00 +02:00
2025-04-30 15:01:00 +02:00
2025-04-22 17:36:41 -04:00
2025-05-24 08:52:51 +02:00
2025-04-29 12:40:43 -07:00
2025-04-29 12:40:43 -07:00
2025-05-27 16:21:12 +01:00
2025-03-28 12:47:02 +00:00
2025-04-21 13:24:20 +01:00
2025-03-27 09:32:40 +00:00
2025-05-28 11:02:37 +01:00
2025-05-28 11:02:37 +01:00
2025-04-24 19:08:06 +01:00
2025-03-27 09:32:40 +00:00
2025-04-22 17:36:41 -04:00
2025-06-04 17:28:05 +01:00
2025-04-07 22:22:08 -07:00
2025-05-28 11:02:37 +01:00
2025-04-28 13:39:40 +08:00
2025-06-04 13:47:44 +01:00
2025-05-30 08:03:50 +02:00
2025-05-30 08:03:50 +02:00
2025-05-30 08:03:50 +02:00
2025-04-29 22:33:40 +03:00
2025-04-29 22:33:40 +03:00
2025-04-28 13:39:40 +08:00
2025-04-29 22:33:40 +03:00
2025-04-28 13:39:40 +08:00
2025-04-22 20:57:03 +08:00
2025-04-22 20:57:03 +08:00
2025-04-30 12:14:58 -07:00
2025-03-30 16:38:16 -07:00
2025-04-08 10:11:20 -07:00
2025-04-28 13:39:40 +08:00
2025-04-28 09:52:03 -07:00
2025-05-23 09:12:29 +01:00
2025-05-20 09:33:28 +01:00
2025-05-20 09:33:28 +01:00
2025-04-24 16:16:50 +02:00
2025-04-14 12:58:03 +05:30
2025-05-30 08:06:53 +02:00
2025-05-20 09:33:28 +01:00
2025-06-04 14:35:30 +02:00
2025-06-04 08:20:48 +08:00
2025-03-27 14:10:55 +07:00
2025-05-28 11:02:37 +01:00
2025-06-09 17:57:15 +08:00
2025-04-27 14:01:37 +08:00
2025-06-10 10:46:29 +09:00
2025-06-03 12:28:31 +02:00
2025-05-22 16:51:00 +01:00
2025-04-27 09:51:13 +08:00
2025-05-28 11:02:37 +01:00
2025-06-10 10:46:29 +09:00
2025-04-28 09:52:03 -07:00
2025-04-28 09:52:03 -07:00
2025-06-04 14:26:34 +01:00
2025-04-14 09:58:46 -04:00
2025-04-28 13:39:40 +08:00
2025-04-07 22:22:08 -07:00
2025-04-27 09:51:13 +08:00
2025-05-23 09:12:29 +01:00
2025-05-22 11:30:18 +01:00
2025-05-28 11:02:37 +01:00
2025-03-30 22:03:14 -07:00
2025-05-21 09:28:52 +01:00
2025-05-13 17:10:54 +01:00
2025-06-04 09:33:05 +02:00
2025-06-04 09:33:05 +02:00
2025-06-04 09:33:05 +02:00
2025-04-19 22:59:18 +02:00
2025-05-13 17:15:53 +01:00
2025-05-13 17:15:54 +01:00
2025-04-19 22:59:18 +02:00
2025-04-19 22:59:18 +02:00
2025-06-05 10:34:33 +01:00
2025-06-05 10:34:33 +01:00
2025-06-02 16:43:39 +02:00
2025-04-19 22:59:18 +02:00
2025-04-19 22:59:18 +02:00
2025-04-19 22:59:18 +02:00
2025-04-19 22:59:18 +02:00
2025-04-19 22:59:18 +02:00
2025-06-02 16:43:39 +02:00
2025-03-26 13:52:17 +01:00
2025-04-19 22:59:18 +02:00
2025-04-19 22:59:18 +02:00
2025-04-19 22:59:18 +02:00
2025-04-19 22:59:18 +02:00
2025-04-19 22:59:18 +02:00
2025-04-19 22:59:18 +02:00
2025-04-23 08:54:10 +03:00
2025-04-22 17:36:41 -04:00
2025-04-07 22:22:08 -07:00
2025-05-28 11:02:37 +01:00
2025-04-15 17:00:25 +08:00
2025-06-02 15:51:32 +02:00
2025-06-02 15:51:32 +02:00
2025-05-20 09:33:28 +01:00
2025-05-28 11:02:37 +01:00
2025-04-22 17:36:41 -04:00
2025-04-30 12:14:58 -07:00
2025-05-19 17:12:48 +01:00
2025-04-24 19:08:06 +01:00
2025-04-24 19:08:06 +01:00
2025-04-24 19:08:06 +01:00
2025-06-05 12:50:33 +01:00
2025-05-28 11:02:37 +01:00
2025-05-07 14:45:48 +03:00
2025-05-07 14:45:48 +03:00
2025-04-28 09:52:03 -07:00
2025-05-12 10:06:11 -07:00
2025-06-05 08:20:44 +01:00
2025-05-12 13:56:45 +01:00
2025-06-09 13:46:40 -07:00
2025-04-14 09:58:46 -04:00
2025-05-15 16:05:15 +08:00
2025-04-29 19:12:59 +08:00
2025-06-10 11:29:08 +01:00
2025-04-29 10:35:15 +01:00
2025-04-29 19:12:59 +08:00
2025-04-25 10:55:31 +08:00
2025-04-02 21:53:55 +00:00
2025-04-17 09:23:14 -04:00
2025-04-04 13:42:20 +02:00
2025-04-07 14:32:56 +02:00
2025-05-28 11:02:37 +01:00
2025-04-30 14:10:46 +05:30
2025-05-23 11:02:46 +01:00
2025-05-30 10:56:49 +02:00
2025-05-23 11:02:46 +01:00
2025-05-20 09:33:28 +01:00
2025-04-24 19:08:06 +01:00
2025-03-29 17:55:38 +00:00
2025-05-28 11:02:37 +01:00
2025-04-22 17:36:41 -04:00
2025-05-28 11:02:37 +01:00
2025-04-22 17:36:41 -04:00
2025-06-06 10:21:40 +01:00
2025-05-28 11:02:37 +01:00
2025-05-28 11:02:37 +01:00
2025-04-27 09:51:13 +08:00
2025-04-23 08:54:10 +03:00
2025-04-27 09:51:13 +08:00
2025-04-17 09:23:14 -04:00
2025-04-16 12:34:11 +01:00
2025-04-09 10:19:26 +01:00
2025-04-16 12:34:11 +01:00
2025-05-10 13:14:01 +08:00
2025-05-20 10:43:50 +01:00
2025-06-06 10:21:40 +01:00
2025-06-09 10:44:55 +05:30
2025-04-24 19:08:06 +01:00
2025-04-22 17:36:41 -04:00
2025-05-28 11:02:37 +01:00
2025-05-28 11:02:37 +01:00
2025-04-08 10:11:20 -07:00
2025-04-08 10:11:20 -07:00
2025-04-08 10:11:20 -07:00
2025-06-09 13:46:40 -07:00
2025-04-04 15:39:24 -07:00
2025-03-29 17:55:38 +00:00
2025-05-20 13:42:06 +01:00
2025-03-30 16:38:16 -07:00
2025-04-10 12:29:56 +02:00
2025-04-29 10:35:15 +01:00
2025-04-22 17:36:41 -04:00
2025-04-10 17:44:39 +01:00
2025-04-30 13:11:17 +05:30
2025-06-03 08:44:13 +01:00
2025-04-22 17:36:41 -04:00
2025-04-22 17:36:41 -04:00
2025-04-03 17:39:38 +01:00
2025-04-10 17:44:39 +01:00
2025-05-28 11:02:37 +01:00
2025-05-28 11:02:37 +01:00
2025-05-28 11:02:37 +01:00
2025-05-13 11:33:07 +01:00
2025-05-28 11:02:37 +01:00
2025-03-30 16:38:16 -07:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-05-22 16:51:00 +01:00
2025-04-22 17:36:41 -04:00
2025-06-03 08:44:13 +01:00
2025-03-26 21:27:43 +08:00
2025-04-22 17:36:41 -04:00
2025-05-12 13:56:45 +01:00
2025-05-12 13:56:45 +01:00
2025-05-06 15:48:05 -07:00
2025-03-30 11:21:19 -07:00
2025-05-06 15:48:05 -07:00
2025-04-28 13:39:40 +08:00
2025-05-28 11:02:37 +01:00
2025-05-06 15:48:05 -07:00
2025-06-09 17:57:15 +08:00
2025-06-09 17:57:15 +08:00
2025-05-27 16:21:12 +01:00
2025-04-22 17:36:41 -04:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-05-27 16:21:12 +01:00
2025-05-20 15:06:36 +02:00
2025-04-27 14:01:37 +08:00
2025-06-05 15:32:25 +08:00
2025-06-05 15:32:25 +08:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-04-27 14:01:37 +08:00
2025-04-16 12:34:11 +01:00
2025-04-16 12:34:11 +01:00
2025-04-10 17:44:39 +01:00
2025-04-10 17:44:39 +01:00
2025-04-16 12:34:11 +01:00
2025-04-16 12:34:11 +01:00
2025-05-23 09:12:29 +01:00
2025-06-09 11:52:07 +01:00
2025-06-09 11:52:07 +01:00
2025-06-09 11:52:07 +01:00
2025-03-27 09:32:40 +00:00
2025-06-03 10:00:10 +01:00
2025-04-01 09:57:39 +01:00
2025-06-05 21:26:42 +01:00
2025-06-04 17:53:43 +01:00
2025-04-08 11:28:40 +01:00
2025-04-03 17:39:38 +01:00
2025-04-24 10:41:31 +01:00
2025-06-04 17:53:43 +01:00
2025-06-09 18:40:15 +01:00
2025-04-08 11:28:40 +01:00
2025-04-29 10:35:15 +01:00
2025-06-03 10:00:10 +01:00
2025-06-03 10:00:10 +01:00
2025-04-11 15:41:09 +01:00
2025-06-04 17:53:43 +01:00
2025-04-29 10:35:15 +01:00
2025-04-11 15:41:09 +01:00
2025-04-29 10:35:15 +01:00
2025-04-29 10:35:15 +01:00
2025-04-29 10:35:15 +01:00
2025-04-11 15:41:09 +01:00
2025-05-21 13:00:48 +01:00
2025-06-10 11:29:08 +01:00
2025-06-10 11:29:08 +01:00
2025-06-10 11:29:08 +01:00
2025-06-10 11:29:08 +01:00
2025-06-10 11:29:08 +01:00
2025-06-10 11:29:08 +01:00
2025-06-06 16:41:40 +01:00
2025-04-03 17:39:38 +01:00
2025-04-03 17:39:38 +01:00
2025-04-27 09:51:13 +08:00
2025-04-27 09:51:13 +08:00
2025-05-23 09:12:29 +01:00
2025-04-23 08:54:10 +03:00
2025-04-23 08:54:10 +03:00
2025-04-23 08:54:10 +03:00
2025-04-23 08:54:10 +03:00
2025-04-23 08:54:10 +03:00
2025-04-10 17:44:39 +01:00
2025-03-29 17:55:38 +00:00
2025-05-20 09:33:28 +01:00
2025-05-20 09:33:28 +01:00
2025-03-29 17:55:38 +00:00
2025-04-24 19:08:06 +01:00
2025-05-23 11:02:46 +01:00
2025-05-13 11:33:07 +01:00
2025-05-16 14:45:38 +01:00
2025-06-10 11:29:08 +01:00
2025-04-08 11:28:40 +01:00
2025-05-28 11:02:37 +01:00
2025-05-28 11:02:37 +01:00
2025-05-23 11:02:46 +01:00
2025-04-02 11:18:47 +01:00
2025-05-23 14:10:17 +01:00
2025-05-20 16:07:56 +01:00
2025-06-05 21:26:42 +01:00
2025-04-26 11:05:30 +01:00
2025-05-28 11:02:37 +01:00
2025-04-24 19:08:06 +01:00
2025-04-24 19:08:06 +01:00
2025-04-24 19:08:06 +01:00
2025-05-28 11:02:37 +01:00
2025-04-24 19:08:06 +01:00
2025-04-29 10:35:15 +01:00
2025-05-21 09:28:52 +01:00
2025-05-21 09:28:52 +01:00
2025-05-21 09:28:52 +01:00
2025-05-21 09:28:52 +01:00
2025-03-30 16:38:16 -07:00
2025-04-30 12:14:58 -07:00
2025-05-12 10:06:11 -07:00
2025-05-12 10:06:11 -07:00
2025-05-09 10:42:10 -07:00
2025-05-12 10:06:11 -07:00
2025-03-30 16:38:16 -07:00
2025-03-30 16:38:16 -07:00
2025-03-30 16:38:16 -07:00
2025-03-30 16:38:16 -07:00
2025-05-20 14:48:41 -07:00
2025-05-20 14:48:41 -07:00
2025-05-20 14:48:41 -07:00
2025-05-20 14:48:41 -07:00
2025-05-09 14:56:38 -07:00
2025-03-30 16:38:16 -07:00
2025-03-30 16:38:16 -07:00
2025-03-30 22:03:14 -07:00
2025-06-09 18:40:15 +01:00
2025-04-22 17:36:41 -04:00
2025-04-01 15:38:49 +05:30
2025-04-01 15:38:49 +05:30
2025-06-10 11:29:08 +01:00
2025-06-04 17:53:43 +01:00
2025-05-22 15:13:35 +01:00