1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2; RUN: opt -S --passes=slp-vectorizer -mtriple=x86_64-unknown-linux < %s | FileCheck %s 3 4define i64 @test(ptr %p) { 5; CHECK-LABEL: define i64 @test( 6; CHECK-SAME: ptr [[P:%.*]]) { 7; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[P]], i64 12 8; CHECK-NEXT: [[TMP2:%.*]] = xor <4 x i32> zeroinitializer, zeroinitializer 9; CHECK-NEXT: [[TMP3:%.*]] = xor <4 x i32> [[TMP2]], zeroinitializer 10; CHECK-NEXT: [[TMP4:%.*]] = xor <4 x i32> [[TMP3]], zeroinitializer 11; CHECK-NEXT: [[TMP5:%.*]] = xor <4 x i32> [[TMP4]], zeroinitializer 12; CHECK-NEXT: [[TMP6:%.*]] = xor <4 x i32> [[TMP5]], zeroinitializer 13; CHECK-NEXT: [[TMP7:%.*]] = xor <4 x i32> [[TMP6]], zeroinitializer 14; CHECK-NEXT: [[TMP8:%.*]] = xor <4 x i32> [[TMP7]], zeroinitializer 15; CHECK-NEXT: [[TMP9:%.*]] = xor <4 x i32> [[TMP8]], zeroinitializer 16; CHECK-NEXT: [[TMP10:%.*]] = xor <4 x i32> [[TMP9]], zeroinitializer 17; CHECK-NEXT: [[TMP11:%.*]] = xor <4 x i32> [[TMP10]], zeroinitializer 18; CHECK-NEXT: [[TMP12:%.*]] = trunc <4 x i32> [[TMP11]] to <4 x i8> 19; CHECK-NEXT: store <4 x i8> [[TMP12]], ptr [[TMP1]], align 1 20; CHECK-NEXT: ret i64 0 21; 22 %1 = getelementptr i8, ptr %p, i64 13 23 %2 = getelementptr i8, ptr %p, i64 14 24 %3 = getelementptr i8, ptr %p, i64 15 25 %4 = getelementptr i8, ptr %p, i64 12 26 %5 = zext i8 0 to i32 27 %6 = and i32 %5, 0 28 %.not866 = icmp eq i32 %6, 0 29 %7 = select i1 %.not866, i32 0, i32 0 30 %8 = xor i32 0, %7 31 %9 = zext i8 0 to i32 32 %10 = and i32 %9, 0 33 %.not871 = icmp eq i32 %10, 0 34 %11 = select i1 %.not871, i32 0, i32 0 35 %12 = xor i32 0, %11 36 %13 = xor i32 %9, 0 37 %14 = xor i32 %13, 0 38 %15 = xor i32 %14, 0 39 %16 = xor i32 %15, 0 40 %17 = xor i32 %16, 0 41 %18 = xor i32 %17, %12 42 %19 = xor i32 %18, 0 43 %20 = xor i32 %19, 0 44 %21 = xor i32 %20, 0 45 %22 = xor i32 %21, 0 46 %23 = trunc i32 %22 to i8 47 store i8 %23, ptr %4, align 1 48 %24 = xor i32 %9, 0 49 %25 = xor i32 %24, 0 50 %26 = xor i32 %25, 0 51 %27 = xor i32 %26, 0 52 %28 = xor i32 %27, 0 53 %29 = xor i32 %28, %8 54 %30 = xor i32 %29, 0 55 %31 = xor i32 %30, 0 56 %32 = xor i32 %31, 0 57 %33 = xor i32 %32, 0 58 %34 = trunc i32 %33 to i8 59 store i8 %34, ptr %1, align 1 60 %35 = xor i32 0, %5 61 %36 = xor i32 %35, 0 62 %37 = xor i32 %36, 0 63 %38 = xor i32 %37, 0 64 %39 = xor i32 %38, 0 65 %40 = xor i32 %39, %8 66 %41 = xor i32 %40, 0 67 %42 = xor i32 %41, 0 68 %43 = xor i32 %42, 0 69 %44 = xor i32 %43, 0 70 %45 = trunc i32 %44 to i8 71 store i8 %45, ptr %2, align 1 72 %46 = xor i32 %35, 0 73 %47 = xor i32 %46, 0 74 %48 = xor i32 %47, 0 75 %49 = xor i32 %48, 0 76 %50 = xor i32 %49, %8 77 %51 = xor i32 %50, 0 78 %52 = xor i32 %51, 0 79 %53 = xor i32 %52, 0 80 %54 = xor i32 %53, 0 81 %55 = trunc i32 %54 to i8 82 store i8 %55, ptr %3, align 1 83 ret i64 0 84} 85 86define i64 @test1(ptr %p) { 87; CHECK-LABEL: define i64 @test1( 88; CHECK-SAME: ptr [[P:%.*]]) { 89; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[P]], i64 12 90; CHECK-NEXT: [[TMP2:%.*]] = xor <4 x i32> zeroinitializer, zeroinitializer 91; CHECK-NEXT: [[TMP3:%.*]] = xor <4 x i32> [[TMP2]], zeroinitializer 92; CHECK-NEXT: [[TMP4:%.*]] = xor <4 x i32> [[TMP3]], zeroinitializer 93; CHECK-NEXT: [[TMP5:%.*]] = xor <4 x i32> [[TMP4]], zeroinitializer 94; CHECK-NEXT: [[TMP6:%.*]] = xor <4 x i32> [[TMP5]], zeroinitializer 95; CHECK-NEXT: [[TMP7:%.*]] = xor <4 x i32> [[TMP6]], zeroinitializer 96; CHECK-NEXT: [[TMP8:%.*]] = xor <4 x i32> [[TMP7]], zeroinitializer 97; CHECK-NEXT: [[TMP9:%.*]] = xor <4 x i32> [[TMP8]], zeroinitializer 98; CHECK-NEXT: [[TMP10:%.*]] = xor <4 x i32> [[TMP9]], zeroinitializer 99; CHECK-NEXT: [[TMP11:%.*]] = xor <4 x i32> [[TMP10]], zeroinitializer 100; CHECK-NEXT: [[TMP12:%.*]] = trunc <4 x i32> [[TMP11]] to <4 x i8> 101; CHECK-NEXT: store <4 x i8> [[TMP12]], ptr [[TMP1]], align 1 102; CHECK-NEXT: ret i64 0 103; 104 %1 = getelementptr i8, ptr %p, i64 13 105 %2 = getelementptr i8, ptr %p, i64 14 106 %3 = getelementptr i8, ptr %p, i64 15 107 %4 = getelementptr i8, ptr %p, i64 12 108 %5 = zext i8 0 to i32 109 %6 = and i32 %5, 0 110 %.not866 = icmp eq i32 %6, 0 111 %7 = select i1 %.not866, i32 0, i32 0 112 %8 = xor i32 0, %7 113 %9 = zext i8 0 to i32 114 %10 = and i32 %9, 0 115 %.not869 = icmp eq i32 %10, 0 116 %11 = select i1 %.not869, i32 0, i32 0 117 %12 = xor i32 0, %11 118 %13 = zext i8 0 to i32 119 %14 = and i32 %13, 0 120 %.not871 = icmp eq i32 %14, 0 121 %15 = select i1 %.not871, i32 0, i32 0 122 %16 = xor i32 0, %15 123 %17 = zext i8 0 to i32 124 %18 = and i32 %17, 0 125 %.not874 = icmp eq i32 %18, 0 126 %19 = select i1 %.not874, i32 0, i32 0 127 %20 = xor i32 0, %19 128 %21 = xor i32 %13, 0 129 %22 = xor i32 %21, 0 130 %23 = xor i32 %22, 0 131 %24 = xor i32 %23, 0 132 %25 = xor i32 %24, 0 133 %26 = xor i32 %25, 0 134 %27 = xor i32 %26, %8 135 %28 = xor i32 %27, 0 136 %29 = xor i32 %28, 0 137 %30 = xor i32 %29, 0 138 %31 = trunc i32 %30 to i8 139 store i8 %31, ptr %4, align 1 140 %32 = xor i32 %13, 0 141 %33 = xor i32 %32, 0 142 %34 = xor i32 %33, 0 143 %35 = xor i32 %34, 0 144 %36 = xor i32 %35, 0 145 %37 = xor i32 %36, 0 146 %38 = xor i32 %37, %20 147 %39 = xor i32 %38, 0 148 %40 = xor i32 %39, 0 149 %41 = xor i32 %40, 0 150 %42 = trunc i32 %41 to i8 151 store i8 %42, ptr %1, align 1 152 %43 = xor i32 %9, 0 153 %44 = xor i32 %43, 0 154 %45 = xor i32 %44, 0 155 %46 = xor i32 %45, 0 156 %47 = xor i32 %46, 0 157 %48 = xor i32 %47, 0 158 %49 = xor i32 %48, %16 159 %50 = xor i32 %49, 0 160 %51 = xor i32 %50, 0 161 %52 = xor i32 %51, 0 162 %53 = trunc i32 %52 to i8 163 store i8 %53, ptr %2, align 1 164 %54 = xor i32 %43, 0 165 %55 = xor i32 %54, 0 166 %56 = xor i32 %55, 0 167 %57 = xor i32 %56, 0 168 %58 = xor i32 %57, 0 169 %59 = xor i32 %58, %12 170 %60 = xor i32 %59, 0 171 %61 = xor i32 %60, 0 172 %62 = xor i32 %61, 0 173 %63 = trunc i32 %62 to i8 174 store i8 %63, ptr %3, align 1 175 ret i64 0 176} 177