[llvm] 3409d07 - [SLP][NFC]Add a test with missed widened boolean optimization, NFC
via llvm-commits
llvm-commits at lists.llvm.org
Sun Sep 13 06:56:12 PDT 2026
Author: Alexey Bataev
Date: 2026-09-13T09:56:08-04:00
New Revision: 3409d079b5b76d0cdd51526b29aebd4143ecca64
URL: https://github.com/llvm/llvm-project/commit/3409d079b5b76d0cdd51526b29aebd4143ecca64
DIFF: https://github.com/llvm/llvm-project/commit/3409d079b5b76d0cdd51526b29aebd4143ecca64.diff
LOG: [SLP][NFC]Add a test with missed widened boolean optimization, NFC
Reviewers:
Pull Request: https://github.com/llvm/llvm-project/pull/223245
Added:
llvm/test/Transforms/SLPVectorizer/X86/logical-binops-booleanized-leaves.ll
Modified:
Removed:
################################################################################
diff --git a/llvm/test/Transforms/SLPVectorizer/X86/logical-binops-booleanized-leaves.ll b/llvm/test/Transforms/SLPVectorizer/X86/logical-binops-booleanized-leaves.ll
new file mode 100644
index 0000000000000..3a211ca08b70f
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/X86/logical-binops-booleanized-leaves.ll
@@ -0,0 +1,589 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt < %s -passes=slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu -mcpu=x86-64-v2 | FileCheck %s
+
+define void @and_store_8(ptr %p, ptr %q, ptr %out) {
+; CHECK-LABEL: define void @and_store_8(
+; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[OUT:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[TMP0:%.*]] = load <8 x i8>, ptr [[P]], align 1
+; CHECK-NEXT: [[TMP1:%.*]] = load <8 x i8>, ptr [[Q]], align 1
+; CHECK-NEXT: [[TMP2:%.*]] = trunc <8 x i8> [[TMP0]] to <8 x i1>
+; CHECK-NEXT: [[TMP3:%.*]] = trunc <8 x i8> [[TMP1]] to <8 x i1>
+; CHECK-NEXT: [[TMP5:%.*]] = and <8 x i1> [[TMP2]], [[TMP3]]
+; CHECK-NEXT: [[TMP4:%.*]] = extractelement <8 x i1> [[TMP5]], i64 0
+; CHECK-NEXT: store i1 [[TMP4]], ptr [[OUT]], align 1
+; CHECK-NEXT: [[O1:%.*]] = getelementptr inbounds nuw i1, ptr [[OUT]], i64 1
+; CHECK-NEXT: [[TMP6:%.*]] = extractelement <8 x i1> [[TMP5]], i64 1
+; CHECK-NEXT: store i1 [[TMP6]], ptr [[O1]], align 1
+; CHECK-NEXT: [[O2:%.*]] = getelementptr inbounds nuw i1, ptr [[OUT]], i64 2
+; CHECK-NEXT: [[TMP8:%.*]] = extractelement <8 x i1> [[TMP5]], i64 2
+; CHECK-NEXT: store i1 [[TMP8]], ptr [[O2]], align 1
+; CHECK-NEXT: [[O3:%.*]] = getelementptr inbounds nuw i1, ptr [[OUT]], i64 3
+; CHECK-NEXT: [[TMP10:%.*]] = extractelement <8 x i1> [[TMP5]], i64 3
+; CHECK-NEXT: store i1 [[TMP10]], ptr [[O3]], align 1
+; CHECK-NEXT: [[O4:%.*]] = getelementptr inbounds nuw i1, ptr [[OUT]], i64 4
+; CHECK-NEXT: [[TMP12:%.*]] = extractelement <8 x i1> [[TMP5]], i64 4
+; CHECK-NEXT: store i1 [[TMP12]], ptr [[O4]], align 1
+; CHECK-NEXT: [[O5:%.*]] = getelementptr inbounds nuw i1, ptr [[OUT]], i64 5
+; CHECK-NEXT: [[TMP14:%.*]] = extractelement <8 x i1> [[TMP5]], i64 5
+; CHECK-NEXT: store i1 [[TMP14]], ptr [[O5]], align 1
+; CHECK-NEXT: [[O6:%.*]] = getelementptr inbounds nuw i1, ptr [[OUT]], i64 6
+; CHECK-NEXT: [[TMP16:%.*]] = extractelement <8 x i1> [[TMP5]], i64 6
+; CHECK-NEXT: store i1 [[TMP16]], ptr [[O6]], align 1
+; CHECK-NEXT: [[O7:%.*]] = getelementptr inbounds nuw i1, ptr [[OUT]], i64 7
+; CHECK-NEXT: [[TMP18:%.*]] = extractelement <8 x i1> [[TMP5]], i64 7
+; CHECK-NEXT: store i1 [[TMP18]], ptr [[O7]], align 1
+; CHECK-NEXT: ret void
+;
+entry:
+ %a0 = load i8, ptr %p, align 1, !range !0, !noundef !1
+ %p1 = getelementptr inbounds nuw i8, ptr %p, i64 1
+ %a1 = load i8, ptr %p1, align 1, !range !0, !noundef !1
+ %p2 = getelementptr inbounds nuw i8, ptr %p, i64 2
+ %a2 = load i8, ptr %p2, align 1, !range !0, !noundef !1
+ %p3 = getelementptr inbounds nuw i8, ptr %p, i64 3
+ %a3 = load i8, ptr %p3, align 1, !range !0, !noundef !1
+ %p4 = getelementptr inbounds nuw i8, ptr %p, i64 4
+ %a4 = load i8, ptr %p4, align 1, !range !0, !noundef !1
+ %p5 = getelementptr inbounds nuw i8, ptr %p, i64 5
+ %a5 = load i8, ptr %p5, align 1, !range !0, !noundef !1
+ %p6 = getelementptr inbounds nuw i8, ptr %p, i64 6
+ %a6 = load i8, ptr %p6, align 1, !range !0, !noundef !1
+ %p7 = getelementptr inbounds nuw i8, ptr %p, i64 7
+ %a7 = load i8, ptr %p7, align 1, !range !0, !noundef !1
+ %b0 = load i8, ptr %q, align 1, !range !0, !noundef !1
+ %q1 = getelementptr inbounds nuw i8, ptr %q, i64 1
+ %b1 = load i8, ptr %q1, align 1, !range !0, !noundef !1
+ %q2 = getelementptr inbounds nuw i8, ptr %q, i64 2
+ %b2 = load i8, ptr %q2, align 1, !range !0, !noundef !1
+ %q3 = getelementptr inbounds nuw i8, ptr %q, i64 3
+ %b3 = load i8, ptr %q3, align 1, !range !0, !noundef !1
+ %q4 = getelementptr inbounds nuw i8, ptr %q, i64 4
+ %b4 = load i8, ptr %q4, align 1, !range !0, !noundef !1
+ %q5 = getelementptr inbounds nuw i8, ptr %q, i64 5
+ %b5 = load i8, ptr %q5, align 1, !range !0, !noundef !1
+ %q6 = getelementptr inbounds nuw i8, ptr %q, i64 6
+ %b6 = load i8, ptr %q6, align 1, !range !0, !noundef !1
+ %q7 = getelementptr inbounds nuw i8, ptr %q, i64 7
+ %b7 = load i8, ptr %q7, align 1, !range !0, !noundef !1
+ %t0 = trunc nuw i8 %a0 to i1
+ %t1 = trunc nuw i8 %a1 to i1
+ %t2 = trunc nuw i8 %a2 to i1
+ %t3 = trunc nuw i8 %a3 to i1
+ %t4 = trunc nuw i8 %a4 to i1
+ %t5 = trunc nuw i8 %a5 to i1
+ %t6 = trunc nuw i8 %a6 to i1
+ %t7 = trunc nuw i8 %a7 to i1
+ %u0 = trunc nuw i8 %b0 to i1
+ %u1 = trunc nuw i8 %b1 to i1
+ %u2 = trunc nuw i8 %b2 to i1
+ %u3 = trunc nuw i8 %b3 to i1
+ %u4 = trunc nuw i8 %b4 to i1
+ %u5 = trunc nuw i8 %b5 to i1
+ %u6 = trunc nuw i8 %b6 to i1
+ %u7 = trunc nuw i8 %b7 to i1
+ %r0 = and i1 %t0, %u0
+ %r1 = and i1 %t1, %u1
+ %r2 = and i1 %t2, %u2
+ %r3 = and i1 %t3, %u3
+ %r4 = and i1 %t4, %u4
+ %r5 = and i1 %t5, %u5
+ %r6 = and i1 %t6, %u6
+ %r7 = and i1 %t7, %u7
+ store i1 %r0, ptr %out, align 1
+ %o1 = getelementptr inbounds nuw i1, ptr %out, i64 1
+ store i1 %r1, ptr %o1, align 1
+ %o2 = getelementptr inbounds nuw i1, ptr %out, i64 2
+ store i1 %r2, ptr %o2, align 1
+ %o3 = getelementptr inbounds nuw i1, ptr %out, i64 3
+ store i1 %r3, ptr %o3, align 1
+ %o4 = getelementptr inbounds nuw i1, ptr %out, i64 4
+ store i1 %r4, ptr %o4, align 1
+ %o5 = getelementptr inbounds nuw i1, ptr %out, i64 5
+ store i1 %r5, ptr %o5, align 1
+ %o6 = getelementptr inbounds nuw i1, ptr %out, i64 6
+ store i1 %r6, ptr %o6, align 1
+ %o7 = getelementptr inbounds nuw i1, ptr %out, i64 7
+ store i1 %r7, ptr %o7, align 1
+ ret void
+}
+
+define <8 x i1> @or_icmp_bv(ptr %p, ptr %q) {
+; CHECK-LABEL: define <8 x i1> @or_icmp_bv(
+; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[TMP0:%.*]] = load <8 x i8>, ptr [[P]], align 1
+; CHECK-NEXT: [[TMP1:%.*]] = load <8 x i8>, ptr [[Q]], align 1
+; CHECK-NEXT: [[TMP2:%.*]] = icmp ne <8 x i8> [[TMP0]], zeroinitializer
+; CHECK-NEXT: [[TMP4:%.*]] = icmp ne <8 x i8> [[TMP1]], zeroinitializer
+; CHECK-NEXT: [[TMP3:%.*]] = or <8 x i1> [[TMP2]], [[TMP4]]
+; CHECK-NEXT: ret <8 x i1> [[TMP3]]
+;
+entry:
+ %a0 = load i8, ptr %p, align 1, !range !0, !noundef !1
+ %p1 = getelementptr inbounds nuw i8, ptr %p, i64 1
+ %a1 = load i8, ptr %p1, align 1, !range !0, !noundef !1
+ %p2 = getelementptr inbounds nuw i8, ptr %p, i64 2
+ %a2 = load i8, ptr %p2, align 1, !range !0, !noundef !1
+ %p3 = getelementptr inbounds nuw i8, ptr %p, i64 3
+ %a3 = load i8, ptr %p3, align 1, !range !0, !noundef !1
+ %p4 = getelementptr inbounds nuw i8, ptr %p, i64 4
+ %a4 = load i8, ptr %p4, align 1, !range !0, !noundef !1
+ %p5 = getelementptr inbounds nuw i8, ptr %p, i64 5
+ %a5 = load i8, ptr %p5, align 1, !range !0, !noundef !1
+ %p6 = getelementptr inbounds nuw i8, ptr %p, i64 6
+ %a6 = load i8, ptr %p6, align 1, !range !0, !noundef !1
+ %p7 = getelementptr inbounds nuw i8, ptr %p, i64 7
+ %a7 = load i8, ptr %p7, align 1, !range !0, !noundef !1
+ %b0 = load i8, ptr %q, align 1, !range !0, !noundef !1
+ %q1 = getelementptr inbounds nuw i8, ptr %q, i64 1
+ %b1 = load i8, ptr %q1, align 1, !range !0, !noundef !1
+ %q2 = getelementptr inbounds nuw i8, ptr %q, i64 2
+ %b2 = load i8, ptr %q2, align 1, !range !0, !noundef !1
+ %q3 = getelementptr inbounds nuw i8, ptr %q, i64 3
+ %b3 = load i8, ptr %q3, align 1, !range !0, !noundef !1
+ %q4 = getelementptr inbounds nuw i8, ptr %q, i64 4
+ %b4 = load i8, ptr %q4, align 1, !range !0, !noundef !1
+ %q5 = getelementptr inbounds nuw i8, ptr %q, i64 5
+ %b5 = load i8, ptr %q5, align 1, !range !0, !noundef !1
+ %q6 = getelementptr inbounds nuw i8, ptr %q, i64 6
+ %b6 = load i8, ptr %q6, align 1, !range !0, !noundef !1
+ %q7 = getelementptr inbounds nuw i8, ptr %q, i64 7
+ %b7 = load i8, ptr %q7, align 1, !range !0, !noundef !1
+ %c0 = icmp ne i8 %a0, 0
+ %c1 = icmp ne i8 %a1, 0
+ %c2 = icmp ne i8 %a2, 0
+ %c3 = icmp ne i8 %a3, 0
+ %c4 = icmp ne i8 %a4, 0
+ %c5 = icmp ne i8 %a5, 0
+ %c6 = icmp ne i8 %a6, 0
+ %c7 = icmp ne i8 %a7, 0
+ %d0 = icmp ne i8 %b0, 0
+ %d1 = icmp ne i8 %b1, 0
+ %d2 = icmp ne i8 %b2, 0
+ %d3 = icmp ne i8 %b3, 0
+ %d4 = icmp ne i8 %b4, 0
+ %d5 = icmp ne i8 %b5, 0
+ %d6 = icmp ne i8 %b6, 0
+ %d7 = icmp ne i8 %b7, 0
+ %r0 = or i1 %c0, %d0
+ %r1 = or i1 %c1, %d1
+ %r2 = or i1 %c2, %d2
+ %r3 = or i1 %c3, %d3
+ %r4 = or i1 %c4, %d4
+ %r5 = or i1 %c5, %d5
+ %r6 = or i1 %c6, %d6
+ %r7 = or i1 %c7, %d7
+ %v0 = insertelement <8 x i1> poison, i1 %r0, i32 0
+ %v1 = insertelement <8 x i1> %v0, i1 %r1, i32 1
+ %v2 = insertelement <8 x i1> %v1, i1 %r2, i32 2
+ %v3 = insertelement <8 x i1> %v2, i1 %r3, i32 3
+ %v4 = insertelement <8 x i1> %v3, i1 %r4, i32 4
+ %v5 = insertelement <8 x i1> %v4, i1 %r5, i32 5
+ %v6 = insertelement <8 x i1> %v5, i1 %r6, i32 6
+ %v7 = insertelement <8 x i1> %v6, i1 %r7, i32 7
+ ret <8 x i1> %v7
+}
+
+define <8 x i1> @and_chain_bv(ptr %p, ptr %q, ptr %r) {
+; CHECK-LABEL: define <8 x i1> @and_chain_bv(
+; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[R:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[TMP0:%.*]] = load <8 x i8>, ptr [[P]], align 1
+; CHECK-NEXT: [[TMP1:%.*]] = load <8 x i8>, ptr [[Q]], align 1
+; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i8>, ptr [[R]], align 1
+; CHECK-NEXT: [[TMP3:%.*]] = trunc <8 x i8> [[TMP0]] to <8 x i1>
+; CHECK-NEXT: [[TMP4:%.*]] = trunc <8 x i8> [[TMP1]] to <8 x i1>
+; CHECK-NEXT: [[TMP7:%.*]] = trunc <8 x i8> [[TMP2]] to <8 x i1>
+; CHECK-NEXT: [[TMP6:%.*]] = and <8 x i1> [[TMP3]], [[TMP4]]
+; CHECK-NEXT: [[TMP5:%.*]] = and <8 x i1> [[TMP6]], [[TMP7]]
+; CHECK-NEXT: ret <8 x i1> [[TMP5]]
+;
+entry:
+ %a0 = load i8, ptr %p, align 1, !range !0, !noundef !1
+ %p1 = getelementptr inbounds nuw i8, ptr %p, i64 1
+ %a1 = load i8, ptr %p1, align 1, !range !0, !noundef !1
+ %p2 = getelementptr inbounds nuw i8, ptr %p, i64 2
+ %a2 = load i8, ptr %p2, align 1, !range !0, !noundef !1
+ %p3 = getelementptr inbounds nuw i8, ptr %p, i64 3
+ %a3 = load i8, ptr %p3, align 1, !range !0, !noundef !1
+ %p4 = getelementptr inbounds nuw i8, ptr %p, i64 4
+ %a4 = load i8, ptr %p4, align 1, !range !0, !noundef !1
+ %p5 = getelementptr inbounds nuw i8, ptr %p, i64 5
+ %a5 = load i8, ptr %p5, align 1, !range !0, !noundef !1
+ %p6 = getelementptr inbounds nuw i8, ptr %p, i64 6
+ %a6 = load i8, ptr %p6, align 1, !range !0, !noundef !1
+ %p7 = getelementptr inbounds nuw i8, ptr %p, i64 7
+ %a7 = load i8, ptr %p7, align 1, !range !0, !noundef !1
+ %b0 = load i8, ptr %q, align 1, !range !0, !noundef !1
+ %q1 = getelementptr inbounds nuw i8, ptr %q, i64 1
+ %b1 = load i8, ptr %q1, align 1, !range !0, !noundef !1
+ %q2 = getelementptr inbounds nuw i8, ptr %q, i64 2
+ %b2 = load i8, ptr %q2, align 1, !range !0, !noundef !1
+ %q3 = getelementptr inbounds nuw i8, ptr %q, i64 3
+ %b3 = load i8, ptr %q3, align 1, !range !0, !noundef !1
+ %q4 = getelementptr inbounds nuw i8, ptr %q, i64 4
+ %b4 = load i8, ptr %q4, align 1, !range !0, !noundef !1
+ %q5 = getelementptr inbounds nuw i8, ptr %q, i64 5
+ %b5 = load i8, ptr %q5, align 1, !range !0, !noundef !1
+ %q6 = getelementptr inbounds nuw i8, ptr %q, i64 6
+ %b6 = load i8, ptr %q6, align 1, !range !0, !noundef !1
+ %q7 = getelementptr inbounds nuw i8, ptr %q, i64 7
+ %b7 = load i8, ptr %q7, align 1, !range !0, !noundef !1
+ %e0 = load i8, ptr %r, align 1, !range !0, !noundef !1
+ %r1p = getelementptr inbounds nuw i8, ptr %r, i64 1
+ %e1 = load i8, ptr %r1p, align 1, !range !0, !noundef !1
+ %r2p = getelementptr inbounds nuw i8, ptr %r, i64 2
+ %e2 = load i8, ptr %r2p, align 1, !range !0, !noundef !1
+ %r3p = getelementptr inbounds nuw i8, ptr %r, i64 3
+ %e3 = load i8, ptr %r3p, align 1, !range !0, !noundef !1
+ %r4p = getelementptr inbounds nuw i8, ptr %r, i64 4
+ %e4 = load i8, ptr %r4p, align 1, !range !0, !noundef !1
+ %r5p = getelementptr inbounds nuw i8, ptr %r, i64 5
+ %e5 = load i8, ptr %r5p, align 1, !range !0, !noundef !1
+ %r6p = getelementptr inbounds nuw i8, ptr %r, i64 6
+ %e6 = load i8, ptr %r6p, align 1, !range !0, !noundef !1
+ %r7p = getelementptr inbounds nuw i8, ptr %r, i64 7
+ %e7 = load i8, ptr %r7p, align 1, !range !0, !noundef !1
+ %t0 = trunc nuw i8 %a0 to i1
+ %t1 = trunc nuw i8 %a1 to i1
+ %t2 = trunc nuw i8 %a2 to i1
+ %t3 = trunc nuw i8 %a3 to i1
+ %t4 = trunc nuw i8 %a4 to i1
+ %t5 = trunc nuw i8 %a5 to i1
+ %t6 = trunc nuw i8 %a6 to i1
+ %t7 = trunc nuw i8 %a7 to i1
+ %u0 = trunc nuw i8 %b0 to i1
+ %u1 = trunc nuw i8 %b1 to i1
+ %u2 = trunc nuw i8 %b2 to i1
+ %u3 = trunc nuw i8 %b3 to i1
+ %u4 = trunc nuw i8 %b4 to i1
+ %u5 = trunc nuw i8 %b5 to i1
+ %u6 = trunc nuw i8 %b6 to i1
+ %u7 = trunc nuw i8 %b7 to i1
+ %w0 = trunc nuw i8 %e0 to i1
+ %w1 = trunc nuw i8 %e1 to i1
+ %w2 = trunc nuw i8 %e2 to i1
+ %w3 = trunc nuw i8 %e3 to i1
+ %w4 = trunc nuw i8 %e4 to i1
+ %w5 = trunc nuw i8 %e5 to i1
+ %w6 = trunc nuw i8 %e6 to i1
+ %w7 = trunc nuw i8 %e7 to i1
+ %s0 = and i1 %t0, %u0
+ %s1 = and i1 %t1, %u1
+ %s2 = and i1 %t2, %u2
+ %s3 = and i1 %t3, %u3
+ %s4 = and i1 %t4, %u4
+ %s5 = and i1 %t5, %u5
+ %s6 = and i1 %t6, %u6
+ %s7 = and i1 %t7, %u7
+ %r0 = and i1 %s0, %w0
+ %r1 = and i1 %s1, %w1
+ %r2 = and i1 %s2, %w2
+ %r3 = and i1 %s3, %w3
+ %r4 = and i1 %s4, %w4
+ %r5 = and i1 %s5, %w5
+ %r6 = and i1 %s6, %w6
+ %r7 = and i1 %s7, %w7
+ %v0 = insertelement <8 x i1> poison, i1 %r0, i32 0
+ %v1 = insertelement <8 x i1> %v0, i1 %r1, i32 1
+ %v2 = insertelement <8 x i1> %v1, i1 %r2, i32 2
+ %v3 = insertelement <8 x i1> %v2, i1 %r3, i32 3
+ %v4 = insertelement <8 x i1> %v3, i1 %r4, i32 4
+ %v5 = insertelement <8 x i1> %v4, i1 %r5, i32 5
+ %v6 = insertelement <8 x i1> %v5, i1 %r6, i32 6
+ %v7 = insertelement <8 x i1> %v6, i1 %r7, i32 7
+ ret <8 x i1> %v7
+}
+
+; Negative: the wide leaves may be poison (no noundef); the i1 and may mask
+; that poison, so the wide form would be a miscompile.
+define <8 x i1> @and_poisonable_bv(ptr %p, ptr %q) {
+; CHECK-LABEL: define <8 x i1> @and_poisonable_bv(
+; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[TMP0:%.*]] = load <8 x i8>, ptr [[P]], align 1
+; CHECK-NEXT: [[TMP1:%.*]] = load <8 x i8>, ptr [[Q]], align 1
+; CHECK-NEXT: [[TMP2:%.*]] = trunc <8 x i8> [[TMP0]] to <8 x i1>
+; CHECK-NEXT: [[TMP3:%.*]] = trunc <8 x i8> [[TMP1]] to <8 x i1>
+; CHECK-NEXT: [[TMP4:%.*]] = and <8 x i1> [[TMP2]], [[TMP3]]
+; CHECK-NEXT: ret <8 x i1> [[TMP4]]
+;
+entry:
+ %a0 = load i8, ptr %p, align 1
+ %p1 = getelementptr inbounds nuw i8, ptr %p, i64 1
+ %a1 = load i8, ptr %p1, align 1
+ %p2 = getelementptr inbounds nuw i8, ptr %p, i64 2
+ %a2 = load i8, ptr %p2, align 1
+ %p3 = getelementptr inbounds nuw i8, ptr %p, i64 3
+ %a3 = load i8, ptr %p3, align 1
+ %p4 = getelementptr inbounds nuw i8, ptr %p, i64 4
+ %a4 = load i8, ptr %p4, align 1
+ %p5 = getelementptr inbounds nuw i8, ptr %p, i64 5
+ %a5 = load i8, ptr %p5, align 1
+ %p6 = getelementptr inbounds nuw i8, ptr %p, i64 6
+ %a6 = load i8, ptr %p6, align 1
+ %p7 = getelementptr inbounds nuw i8, ptr %p, i64 7
+ %a7 = load i8, ptr %p7, align 1
+ %b0 = load i8, ptr %q, align 1
+ %q1 = getelementptr inbounds nuw i8, ptr %q, i64 1
+ %b1 = load i8, ptr %q1, align 1
+ %q2 = getelementptr inbounds nuw i8, ptr %q, i64 2
+ %b2 = load i8, ptr %q2, align 1
+ %q3 = getelementptr inbounds nuw i8, ptr %q, i64 3
+ %b3 = load i8, ptr %q3, align 1
+ %q4 = getelementptr inbounds nuw i8, ptr %q, i64 4
+ %b4 = load i8, ptr %q4, align 1
+ %q5 = getelementptr inbounds nuw i8, ptr %q, i64 5
+ %b5 = load i8, ptr %q5, align 1
+ %q6 = getelementptr inbounds nuw i8, ptr %q, i64 6
+ %b6 = load i8, ptr %q6, align 1
+ %q7 = getelementptr inbounds nuw i8, ptr %q, i64 7
+ %b7 = load i8, ptr %q7, align 1
+ %t0 = trunc i8 %a0 to i1
+ %t1 = trunc i8 %a1 to i1
+ %t2 = trunc i8 %a2 to i1
+ %t3 = trunc i8 %a3 to i1
+ %t4 = trunc i8 %a4 to i1
+ %t5 = trunc i8 %a5 to i1
+ %t6 = trunc i8 %a6 to i1
+ %t7 = trunc i8 %a7 to i1
+ %u0 = trunc i8 %b0 to i1
+ %u1 = trunc i8 %b1 to i1
+ %u2 = trunc i8 %b2 to i1
+ %u3 = trunc i8 %b3 to i1
+ %u4 = trunc i8 %b4 to i1
+ %u5 = trunc i8 %b5 to i1
+ %u6 = trunc i8 %b6 to i1
+ %u7 = trunc i8 %b7 to i1
+ %r0 = and i1 %t0, %u0
+ %r1 = and i1 %t1, %u1
+ %r2 = and i1 %t2, %u2
+ %r3 = and i1 %t3, %u3
+ %r4 = and i1 %t4, %u4
+ %r5 = and i1 %t5, %u5
+ %r6 = and i1 %t6, %u6
+ %r7 = and i1 %t7, %u7
+ %v0 = insertelement <8 x i1> poison, i1 %r0, i32 0
+ %v1 = insertelement <8 x i1> %v0, i1 %r1, i32 1
+ %v2 = insertelement <8 x i1> %v1, i1 %r2, i32 2
+ %v3 = insertelement <8 x i1> %v2, i1 %r3, i32 3
+ %v4 = insertelement <8 x i1> %v3, i1 %r4, i32 4
+ %v5 = insertelement <8 x i1> %v4, i1 %r5, i32 5
+ %v6 = insertelement <8 x i1> %v5, i1 %r6, i32 6
+ %v7 = insertelement <8 x i1> %v6, i1 %r7, i32 7
+ ret <8 x i1> %v7
+}
+
+; Negative: the trunc leaf has another use, so it cannot be absorbed.
+define <8 x i1> @and_multiuse_bv(ptr %p, ptr %q, ptr %s) {
+; CHECK-LABEL: define <8 x i1> @and_multiuse_bv(
+; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[S:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[TMP0:%.*]] = load <8 x i8>, ptr [[P]], align 1
+; CHECK-NEXT: [[A0:%.*]] = load i8, ptr [[P]], align 1, !range [[RNG0:![0-9]+]], !noundef [[META1:![0-9]+]]
+; CHECK-NEXT: [[TMP1:%.*]] = load <8 x i8>, ptr [[Q]], align 1
+; CHECK-NEXT: [[TMP2:%.*]] = trunc <8 x i8> [[TMP0]] to <8 x i1>
+; CHECK-NEXT: [[T0:%.*]] = trunc nuw i8 [[A0]] to i1
+; CHECK-NEXT: [[TMP3:%.*]] = trunc <8 x i8> [[TMP1]] to <8 x i1>
+; CHECK-NEXT: store i1 [[T0]], ptr [[S]], align 1
+; CHECK-NEXT: [[TMP4:%.*]] = and <8 x i1> [[TMP2]], [[TMP3]]
+; CHECK-NEXT: ret <8 x i1> [[TMP4]]
+;
+entry:
+ %a0 = load i8, ptr %p, align 1, !range !0, !noundef !1
+ %p1 = getelementptr inbounds nuw i8, ptr %p, i64 1
+ %a1 = load i8, ptr %p1, align 1, !range !0, !noundef !1
+ %p2 = getelementptr inbounds nuw i8, ptr %p, i64 2
+ %a2 = load i8, ptr %p2, align 1, !range !0, !noundef !1
+ %p3 = getelementptr inbounds nuw i8, ptr %p, i64 3
+ %a3 = load i8, ptr %p3, align 1, !range !0, !noundef !1
+ %p4 = getelementptr inbounds nuw i8, ptr %p, i64 4
+ %a4 = load i8, ptr %p4, align 1, !range !0, !noundef !1
+ %p5 = getelementptr inbounds nuw i8, ptr %p, i64 5
+ %a5 = load i8, ptr %p5, align 1, !range !0, !noundef !1
+ %p6 = getelementptr inbounds nuw i8, ptr %p, i64 6
+ %a6 = load i8, ptr %p6, align 1, !range !0, !noundef !1
+ %p7 = getelementptr inbounds nuw i8, ptr %p, i64 7
+ %a7 = load i8, ptr %p7, align 1, !range !0, !noundef !1
+ %b0 = load i8, ptr %q, align 1, !range !0, !noundef !1
+ %q1 = getelementptr inbounds nuw i8, ptr %q, i64 1
+ %b1 = load i8, ptr %q1, align 1, !range !0, !noundef !1
+ %q2 = getelementptr inbounds nuw i8, ptr %q, i64 2
+ %b2 = load i8, ptr %q2, align 1, !range !0, !noundef !1
+ %q3 = getelementptr inbounds nuw i8, ptr %q, i64 3
+ %b3 = load i8, ptr %q3, align 1, !range !0, !noundef !1
+ %q4 = getelementptr inbounds nuw i8, ptr %q, i64 4
+ %b4 = load i8, ptr %q4, align 1, !range !0, !noundef !1
+ %q5 = getelementptr inbounds nuw i8, ptr %q, i64 5
+ %b5 = load i8, ptr %q5, align 1, !range !0, !noundef !1
+ %q6 = getelementptr inbounds nuw i8, ptr %q, i64 6
+ %b6 = load i8, ptr %q6, align 1, !range !0, !noundef !1
+ %q7 = getelementptr inbounds nuw i8, ptr %q, i64 7
+ %b7 = load i8, ptr %q7, align 1, !range !0, !noundef !1
+ %t0 = trunc nuw i8 %a0 to i1
+ %t1 = trunc nuw i8 %a1 to i1
+ %t2 = trunc nuw i8 %a2 to i1
+ %t3 = trunc nuw i8 %a3 to i1
+ %t4 = trunc nuw i8 %a4 to i1
+ %t5 = trunc nuw i8 %a5 to i1
+ %t6 = trunc nuw i8 %a6 to i1
+ %t7 = trunc nuw i8 %a7 to i1
+ %u0 = trunc nuw i8 %b0 to i1
+ %u1 = trunc nuw i8 %b1 to i1
+ %u2 = trunc nuw i8 %b2 to i1
+ %u3 = trunc nuw i8 %b3 to i1
+ %u4 = trunc nuw i8 %b4 to i1
+ %u5 = trunc nuw i8 %b5 to i1
+ %u6 = trunc nuw i8 %b6 to i1
+ %u7 = trunc nuw i8 %b7 to i1
+ store i1 %t0, ptr %s, align 1
+ %r0 = and i1 %t0, %u0
+ %r1 = and i1 %t1, %u1
+ %r2 = and i1 %t2, %u2
+ %r3 = and i1 %t3, %u3
+ %r4 = and i1 %t4, %u4
+ %r5 = and i1 %t5, %u5
+ %r6 = and i1 %t6, %u6
+ %r7 = and i1 %t7, %u7
+ %v0 = insertelement <8 x i1> poison, i1 %r0, i32 0
+ %v1 = insertelement <8 x i1> %v0, i1 %r1, i32 1
+ %v2 = insertelement <8 x i1> %v1, i1 %r2, i32 2
+ %v3 = insertelement <8 x i1> %v2, i1 %r3, i32 3
+ %v4 = insertelement <8 x i1> %v3, i1 %r4, i32 4
+ %v5 = insertelement <8 x i1> %v4, i1 %r5, i32 5
+ %v6 = insertelement <8 x i1> %v5, i1 %r6, i32 6
+ %v7 = insertelement <8 x i1> %v6, i1 %r7, i32 7
+ ret <8 x i1> %v7
+}
+
+define <8 x i1> @and_select_val(ptr %p, ptr %q, ptr %c) {
+; CHECK-LABEL: define <8 x i1> @and_select_val(
+; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[C:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[C0:%.*]] = load i1, ptr [[C]], align 1
+; CHECK-NEXT: [[C1P:%.*]] = getelementptr inbounds nuw i1, ptr [[C]], i64 1
+; CHECK-NEXT: [[C1:%.*]] = load i1, ptr [[C1P]], align 1
+; CHECK-NEXT: [[C2P:%.*]] = getelementptr inbounds nuw i1, ptr [[C]], i64 2
+; CHECK-NEXT: [[C2:%.*]] = load i1, ptr [[C2P]], align 1
+; CHECK-NEXT: [[C3P:%.*]] = getelementptr inbounds nuw i1, ptr [[C]], i64 3
+; CHECK-NEXT: [[C3:%.*]] = load i1, ptr [[C3P]], align 1
+; CHECK-NEXT: [[C4P:%.*]] = getelementptr inbounds nuw i1, ptr [[C]], i64 4
+; CHECK-NEXT: [[C4:%.*]] = load i1, ptr [[C4P]], align 1
+; CHECK-NEXT: [[C5P:%.*]] = getelementptr inbounds nuw i1, ptr [[C]], i64 5
+; CHECK-NEXT: [[C5:%.*]] = load i1, ptr [[C5P]], align 1
+; CHECK-NEXT: [[C6P:%.*]] = getelementptr inbounds nuw i1, ptr [[C]], i64 6
+; CHECK-NEXT: [[C6:%.*]] = load i1, ptr [[C6P]], align 1
+; CHECK-NEXT: [[C7P:%.*]] = getelementptr inbounds nuw i1, ptr [[C]], i64 7
+; CHECK-NEXT: [[C7:%.*]] = load i1, ptr [[C7P]], align 1
+; CHECK-NEXT: [[TMP0:%.*]] = load <8 x i8>, ptr [[P]], align 1
+; CHECK-NEXT: [[TMP1:%.*]] = load <8 x i8>, ptr [[Q]], align 1
+; CHECK-NEXT: [[TMP2:%.*]] = trunc <8 x i8> [[TMP0]] to <8 x i1>
+; CHECK-NEXT: [[TMP13:%.*]] = trunc <8 x i8> [[TMP1]] to <8 x i1>
+; CHECK-NEXT: [[TMP11:%.*]] = and <8 x i1> [[TMP2]], [[TMP13]]
+; CHECK-NEXT: [[TMP3:%.*]] = insertelement <8 x i1> poison, i1 [[C0]], i64 0
+; CHECK-NEXT: [[TMP4:%.*]] = insertelement <8 x i1> [[TMP3]], i1 [[C1]], i64 1
+; CHECK-NEXT: [[TMP5:%.*]] = insertelement <8 x i1> [[TMP4]], i1 [[C2]], i64 2
+; CHECK-NEXT: [[TMP6:%.*]] = insertelement <8 x i1> [[TMP5]], i1 [[C3]], i64 3
+; CHECK-NEXT: [[TMP7:%.*]] = insertelement <8 x i1> [[TMP6]], i1 [[C4]], i64 4
+; CHECK-NEXT: [[TMP8:%.*]] = insertelement <8 x i1> [[TMP7]], i1 [[C5]], i64 5
+; CHECK-NEXT: [[TMP9:%.*]] = insertelement <8 x i1> [[TMP8]], i1 [[C6]], i64 6
+; CHECK-NEXT: [[TMP10:%.*]] = insertelement <8 x i1> [[TMP9]], i1 [[C7]], i64 7
+; CHECK-NEXT: [[TMP12:%.*]] = select <8 x i1> [[TMP10]], <8 x i1> [[TMP11]], <8 x i1> zeroinitializer
+; CHECK-NEXT: ret <8 x i1> [[TMP12]]
+;
+entry:
+ %a0 = load i8, ptr %p, align 1, !range !0, !noundef !1
+ %p1 = getelementptr inbounds nuw i8, ptr %p, i64 1
+ %a1 = load i8, ptr %p1, align 1, !range !0, !noundef !1
+ %p2 = getelementptr inbounds nuw i8, ptr %p, i64 2
+ %a2 = load i8, ptr %p2, align 1, !range !0, !noundef !1
+ %p3 = getelementptr inbounds nuw i8, ptr %p, i64 3
+ %a3 = load i8, ptr %p3, align 1, !range !0, !noundef !1
+ %p4 = getelementptr inbounds nuw i8, ptr %p, i64 4
+ %a4 = load i8, ptr %p4, align 1, !range !0, !noundef !1
+ %p5 = getelementptr inbounds nuw i8, ptr %p, i64 5
+ %a5 = load i8, ptr %p5, align 1, !range !0, !noundef !1
+ %p6 = getelementptr inbounds nuw i8, ptr %p, i64 6
+ %a6 = load i8, ptr %p6, align 1, !range !0, !noundef !1
+ %p7 = getelementptr inbounds nuw i8, ptr %p, i64 7
+ %a7 = load i8, ptr %p7, align 1, !range !0, !noundef !1
+ %b0 = load i8, ptr %q, align 1, !range !0, !noundef !1
+ %q1 = getelementptr inbounds nuw i8, ptr %q, i64 1
+ %b1 = load i8, ptr %q1, align 1, !range !0, !noundef !1
+ %q2 = getelementptr inbounds nuw i8, ptr %q, i64 2
+ %b2 = load i8, ptr %q2, align 1, !range !0, !noundef !1
+ %q3 = getelementptr inbounds nuw i8, ptr %q, i64 3
+ %b3 = load i8, ptr %q3, align 1, !range !0, !noundef !1
+ %q4 = getelementptr inbounds nuw i8, ptr %q, i64 4
+ %b4 = load i8, ptr %q4, align 1, !range !0, !noundef !1
+ %q5 = getelementptr inbounds nuw i8, ptr %q, i64 5
+ %b5 = load i8, ptr %q5, align 1, !range !0, !noundef !1
+ %q6 = getelementptr inbounds nuw i8, ptr %q, i64 6
+ %b6 = load i8, ptr %q6, align 1, !range !0, !noundef !1
+ %q7 = getelementptr inbounds nuw i8, ptr %q, i64 7
+ %b7 = load i8, ptr %q7, align 1, !range !0, !noundef !1
+ %c0 = load i1, ptr %c, align 1
+ %c1p = getelementptr inbounds nuw i1, ptr %c, i64 1
+ %c1 = load i1, ptr %c1p, align 1
+ %c2p = getelementptr inbounds nuw i1, ptr %c, i64 2
+ %c2 = load i1, ptr %c2p, align 1
+ %c3p = getelementptr inbounds nuw i1, ptr %c, i64 3
+ %c3 = load i1, ptr %c3p, align 1
+ %c4p = getelementptr inbounds nuw i1, ptr %c, i64 4
+ %c4 = load i1, ptr %c4p, align 1
+ %c5p = getelementptr inbounds nuw i1, ptr %c, i64 5
+ %c5 = load i1, ptr %c5p, align 1
+ %c6p = getelementptr inbounds nuw i1, ptr %c, i64 6
+ %c6 = load i1, ptr %c6p, align 1
+ %c7p = getelementptr inbounds nuw i1, ptr %c, i64 7
+ %c7 = load i1, ptr %c7p, align 1
+ %t0 = trunc nuw i8 %a0 to i1
+ %t1 = trunc nuw i8 %a1 to i1
+ %t2 = trunc nuw i8 %a2 to i1
+ %t3 = trunc nuw i8 %a3 to i1
+ %t4 = trunc nuw i8 %a4 to i1
+ %t5 = trunc nuw i8 %a5 to i1
+ %t6 = trunc nuw i8 %a6 to i1
+ %t7 = trunc nuw i8 %a7 to i1
+ %u0 = trunc nuw i8 %b0 to i1
+ %u1 = trunc nuw i8 %b1 to i1
+ %u2 = trunc nuw i8 %b2 to i1
+ %u3 = trunc nuw i8 %b3 to i1
+ %u4 = trunc nuw i8 %b4 to i1
+ %u5 = trunc nuw i8 %b5 to i1
+ %u6 = trunc nuw i8 %b6 to i1
+ %u7 = trunc nuw i8 %b7 to i1
+ %r0 = and i1 %t0, %u0
+ %r1 = and i1 %t1, %u1
+ %r2 = and i1 %t2, %u2
+ %r3 = and i1 %t3, %u3
+ %r4 = and i1 %t4, %u4
+ %r5 = and i1 %t5, %u5
+ %r6 = and i1 %t6, %u6
+ %r7 = and i1 %t7, %u7
+ %s0 = select i1 %c0, i1 %r0, i1 false
+ %s1 = select i1 %c1, i1 %r1, i1 false
+ %s2 = select i1 %c2, i1 %r2, i1 false
+ %s3 = select i1 %c3, i1 %r3, i1 false
+ %s4 = select i1 %c4, i1 %r4, i1 false
+ %s5 = select i1 %c5, i1 %r5, i1 false
+ %s6 = select i1 %c6, i1 %r6, i1 false
+ %s7 = select i1 %c7, i1 %r7, i1 false
+ %v0 = insertelement <8 x i1> poison, i1 %s0, i32 0
+ %v1 = insertelement <8 x i1> %v0, i1 %s1, i32 1
+ %v2 = insertelement <8 x i1> %v1, i1 %s2, i32 2
+ %v3 = insertelement <8 x i1> %v2, i1 %s3, i32 3
+ %v4 = insertelement <8 x i1> %v3, i1 %s4, i32 4
+ %v5 = insertelement <8 x i1> %v4, i1 %s5, i32 5
+ %v6 = insertelement <8 x i1> %v5, i1 %s6, i32 6
+ %v7 = insertelement <8 x i1> %v6, i1 %s7, i32 7
+ ret <8 x i1> %v7
+}
+
+!0 = !{i8 0, i8 2}
+!1 = !{}
+;.
+; CHECK: [[RNG0]] = !{i8 0, i8 2}
+; CHECK: [[META1]] = !{}
+;.
More information about the llvm-commits
mailing list