[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