brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.6 KiB · 2f0fad7 Raw
143 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42; RUN: opt -p slp-vectorizer -S %s | FileCheck %s3 4target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"5target triple = "x86_64-unknown-linux-gnu"6 7define void @test_2_i24_stores(ptr %A) {8; CHECK-LABEL: define void @test_2_i24_stores(9; CHECK-SAME: ptr [[A:%.*]]) {10; CHECK-NEXT:    [[L:%.*]] = load i24, ptr [[A]], align 411; CHECK-NEXT:    store i24 [[L]], ptr [[A]], align 112; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i24, ptr [[A]], i64 113; CHECK-NEXT:    store i24 0, ptr [[GEP]], align 114; CHECK-NEXT:    ret void15;16  %l = load i24, ptr %A17  store i24 %l, ptr %A, align 118  %gep = getelementptr i24, ptr %A, i64 119  store i24 0, ptr %gep, align 120  ret void21}22 23define void @test_2_trunc_i24_to_i8(i24 %x, ptr %A) {24; CHECK-LABEL: define void @test_2_trunc_i24_to_i8(25; CHECK-SAME: i24 [[X:%.*]], ptr [[A:%.*]]) {26; CHECK-NEXT:    [[T:%.*]] = trunc i24 [[X]] to i827; CHECK-NEXT:    store i8 [[T]], ptr [[A]], align 128; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i8, ptr [[A]], i64 129; CHECK-NEXT:    store i8 0, ptr [[GEP]], align 130; CHECK-NEXT:    ret void31;32  %t = trunc i24 %x to i833  store i8 %t, ptr %A, align 134  %gep = getelementptr i8, ptr %A, i64 135  store i8 0, ptr %gep, align 136  ret void37}38 39define void @test_4_trunc_i24_to_i8(i24 %x, ptr %A) {40; CHECK-LABEL: define void @test_4_trunc_i24_to_i8(41; CHECK-SAME: i24 [[X:%.*]], ptr [[A:%.*]]) {42; CHECK-NEXT:    [[T:%.*]] = trunc i24 [[X]] to i843; CHECK-NEXT:    store i8 [[T]], ptr [[A]], align 144; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr i8, ptr [[A]], i64 145; CHECK-NEXT:    store i8 [[T]], ptr [[GEP_1]], align 146; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr i8, ptr [[A]], i64 247; CHECK-NEXT:    store i8 [[T]], ptr [[GEP_2]], align 148; CHECK-NEXT:    [[GEP_3:%.*]] = getelementptr i8, ptr [[A]], i64 349; CHECK-NEXT:    store i8 [[T]], ptr [[GEP_3]], align 150; CHECK-NEXT:    ret void51;52  %t = trunc i24 %x to i853  store i8 %t, ptr %A, align 154  %gep.1 = getelementptr i8, ptr %A, i64 155  store i8 %t, ptr %gep.1, align 156  %gep.2 = getelementptr i8, ptr %A, i64 257  store i8 %t, ptr %gep.2, align 158  %gep.3 = getelementptr i8, ptr %A, i64 359  store i8 %t, ptr %gep.3, align 160  ret void61}62 63define void @test_8_trunc_i24_to_i8(i24 %x, ptr %A) {64; CHECK-LABEL: define void @test_8_trunc_i24_to_i8(65; CHECK-SAME: i24 [[X:%.*]], ptr [[A:%.*]]) {66; CHECK-NEXT:    [[T:%.*]] = trunc i24 [[X]] to i867; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <8 x i8> poison, i8 [[T]], i32 068; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <8 x i8> [[TMP1]], <8 x i8> poison, <8 x i32> zeroinitializer69; CHECK-NEXT:    store <8 x i8> [[TMP2]], ptr [[A]], align 170; CHECK-NEXT:    ret void71;72  %t = trunc i24 %x to i873  store i8 %t, ptr %A, align 174  %gep.1 = getelementptr i8, ptr %A, i64 175  store i8 %t, ptr %gep.1, align 176  %gep.2 = getelementptr i8, ptr %A, i64 277  store i8 %t, ptr %gep.2, align 178  %gep.3 = getelementptr i8, ptr %A, i64 379  store i8 %t, ptr %gep.3, align 180  %gep.4 = getelementptr i8, ptr %A, i64 481  store i8 %t, ptr %gep.4, align 182  %gep.5 = getelementptr i8, ptr %A, i64 583  store i8 %t, ptr %gep.5, align 184  %gep.6 = getelementptr i8, ptr %A, i64 685  store i8 %t, ptr %gep.6, align 186  %gep.7 = getelementptr i8, ptr %A, i64 787  store i8 %t, ptr %gep.7, align 188  ret void89}90 91define void @test_4_trunc_i24_to_i16(i24 %x, ptr %A) {92; CHECK-LABEL: define void @test_4_trunc_i24_to_i16(93; CHECK-SAME: i24 [[X:%.*]], ptr [[A:%.*]]) {94; CHECK-NEXT:    [[T:%.*]] = trunc i24 [[X]] to i1695; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i32 096; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i16> [[TMP1]], <4 x i16> poison, <4 x i32> zeroinitializer97; CHECK-NEXT:    store <4 x i16> [[TMP2]], ptr [[A]], align 198; CHECK-NEXT:    ret void99;100  %t = trunc i24 %x to i16101  store i16 %t, ptr %A, align 1102  %gep.1 = getelementptr i16, ptr %A, i64 1103  store i16 %t, ptr %gep.1, align 1104  %gep.2 = getelementptr i16, ptr %A, i64 2105  store i16 %t, ptr %gep.2, align 1106  %gep.3 = getelementptr i16, ptr %A, i64 3107  store i16 %t, ptr %gep.3, align 1108  ret void109}110 111%struct.d = type { [3 x i8], [3 x i8], [2 x i8] }112 113; Test case for https://github.com/llvm/llvm-project/issues/88640.114define void @test_access_i24_directly(ptr %src, ptr noalias %dst) "target-cpu"="btver2" {115; CHECK-LABEL: define void @test_access_i24_directly(116; CHECK-SAME: ptr [[SRC:%.*]], ptr noalias [[DST:%.*]]) #[[ATTR0:[0-9]+]] {117; CHECK-NEXT:  entry:118; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr [[SRC]], align 8119; CHECK-NEXT:    [[TMP1:%.*]] = trunc i64 [[TMP0]] to i24120; CHECK-NEXT:    [[GEP_SRC:%.*]] = getelementptr inbounds [[STRUCT_D:%.*]], ptr [[SRC]], i64 0, i32 1121; CHECK-NEXT:    [[BF_LOAD:%.*]] = load i24, ptr [[GEP_SRC]], align 1122; CHECK-NEXT:    [[BF_VALUE:%.*]] = and i24 [[TMP1]], 8388607123; CHECK-NEXT:    [[BF_CLEAR:%.*]] = and i24 [[BF_LOAD]], -8388608124; CHECK-NEXT:    [[BF_SET:%.*]] = or disjoint i24 [[BF_CLEAR]], [[BF_VALUE]]125; CHECK-NEXT:    [[GEP_DST:%.*]] = getelementptr inbounds [[STRUCT_D]], ptr [[DST]], i64 0, i32 1126; CHECK-NEXT:    store i24 [[BF_SET]], ptr [[GEP_DST]], align 1127; CHECK-NEXT:    store i24 0, ptr [[DST]], align 8128; CHECK-NEXT:    ret void129;130entry:131  %0 = load i64, ptr %src, align 8132  %1 = trunc i64 %0 to i24133  %gep.src = getelementptr inbounds %struct.d, ptr %src, i64 0, i32 1134  %bf.load = load i24, ptr %gep.src, align 1135  %bf.value = and i24 %1, 8388607136  %bf.clear = and i24 %bf.load, -8388608137  %bf.set = or disjoint i24 %bf.clear, %bf.value138  %gep.dst = getelementptr inbounds %struct.d, ptr %dst, i64 0, i32 1139  store i24 %bf.set, ptr %gep.dst, align 1140  store i24 0, ptr %dst, align 8141  ret void142}143