|
| 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-gnu < %s | FileCheck %s |
| 3 | + |
| 4 | +@e = global i8 0 |
| 5 | +@c = global i16 0 |
| 6 | +@d = global i32 0 |
| 7 | + |
| 8 | +define i8 @test() { |
| 9 | +; CHECK-LABEL: define i8 @test() { |
| 10 | +; CHECK-NEXT: entry: |
| 11 | +; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr @e, align 1 |
| 12 | +; CHECK-NEXT: [[CONV:%.*]] = sext i8 [[TMP0]] to i32 |
| 13 | +; CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr @c, align 2 |
| 14 | +; CHECK-NEXT: [[CONV1:%.*]] = zext i16 [[TMP1]] to i32 |
| 15 | +; CHECK-NEXT: [[TMP2:%.*]] = insertelement <8 x i32> poison, i32 [[CONV]], i32 0 |
| 16 | +; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> poison, <8 x i32> zeroinitializer |
| 17 | +; CHECK-NEXT: [[TMP4:%.*]] = trunc <8 x i32> [[TMP3]] to <8 x i16> |
| 18 | +; CHECK-NEXT: [[TMP5:%.*]] = or <8 x i16> [[TMP4]], <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 -32767> |
| 19 | +; CHECK-NEXT: [[TMP6:%.*]] = insertelement <8 x i32> poison, i32 [[CONV1]], i32 0 |
| 20 | +; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <8 x i32> [[TMP6]], <8 x i32> poison, <8 x i32> zeroinitializer |
| 21 | +; CHECK-NEXT: [[TMP8:%.*]] = trunc <8 x i32> [[TMP7]] to <8 x i16> |
| 22 | +; CHECK-NEXT: [[TMP9:%.*]] = add <8 x i16> [[TMP5]], [[TMP8]] |
| 23 | +; CHECK-NEXT: [[TMP10:%.*]] = call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> [[TMP9]]) |
| 24 | +; CHECK-NEXT: [[TMP11:%.*]] = sext i16 [[TMP10]] to i32 |
| 25 | +; CHECK-NEXT: [[CONV4_30:%.*]] = trunc i32 [[TMP11]] to i8 |
| 26 | +; CHECK-NEXT: [[TMP12:%.*]] = extractelement <8 x i16> [[TMP5]], i32 7 |
| 27 | +; CHECK-NEXT: [[TMP13:%.*]] = sext i16 [[TMP12]] to i32 |
| 28 | +; CHECK-NEXT: [[XOR_31:%.*]] = and i32 [[TMP13]], -2 |
| 29 | +; CHECK-NEXT: store i32 [[XOR_31]], ptr @d, align 4 |
| 30 | +; CHECK-NEXT: ret i8 [[CONV4_30]] |
| 31 | +; |
| 32 | +entry: |
| 33 | + %0 = load i8, ptr @e, align 1 |
| 34 | + %conv = sext i8 %0 to i32 |
| 35 | + %1 = load i16, ptr @c, align 2 |
| 36 | + %conv1 = zext i16 %1 to i32 |
| 37 | + %or.16 = or i32 %conv, 1 |
| 38 | + %add.16 = add nsw i32 %or.16, %conv1 |
| 39 | + %or.18 = or i32 %conv, 1 |
| 40 | + %add.18 = add nsw i32 %or.18, %conv1 |
| 41 | + %conv4.181 = or i32 %add.16, %add.18 |
| 42 | + %or.20 = or i32 %conv, 1 |
| 43 | + %add.20 = add nsw i32 %or.20, %conv1 |
| 44 | + %conv4.202 = or i32 %conv4.181, %add.20 |
| 45 | + %or.22 = or i32 %conv, 1 |
| 46 | + %add.22 = add nsw i32 %or.22, %conv1 |
| 47 | + %conv4.223 = or i32 %conv4.202, %add.22 |
| 48 | + %or.24 = or i32 %conv, 1 |
| 49 | + %add.24 = add nsw i32 %or.24, %conv1 |
| 50 | + %conv4.244 = or i32 %conv4.223, %add.24 |
| 51 | + %or.26 = or i32 %conv, 1 |
| 52 | + %add.26 = add nsw i32 %or.26, %conv1 |
| 53 | + %conv4.265 = or i32 %conv4.244, %add.26 |
| 54 | + %or.28 = or i32 %conv, 1 |
| 55 | + %add.28 = add nsw i32 %or.28, %conv1 |
| 56 | + %conv4.286 = or i32 %conv4.265, %add.28 |
| 57 | + %or.30 = or i32 %conv, 32769 |
| 58 | + %add.30 = add nsw i32 %or.30, %conv1 |
| 59 | + %conv4.307 = or i32 %conv4.286, %add.30 |
| 60 | + %conv4.30 = trunc i32 %conv4.307 to i8 |
| 61 | + %xor.31 = and i32 %or.30, -2 |
| 62 | + store i32 %xor.31, ptr @d, align 4 |
| 63 | + ret i8 %conv4.30 |
| 64 | +} |
0 commit comments