brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.2 KiB · bd96611 Raw
264 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=instcombine -S < %s | FileCheck %s3 4target datalayout = "e-i64:64-f80:128-n8:16:32:64"5target triple = "x86_64-unknown-linux-gnu"6 7%A__vtbl = type { ptr, ptr }8%A = type { ptr }9%B = type { ptr, i64 }10 11@A__vtblZ = constant %A__vtbl { ptr null, ptr @A.foo }12 13declare i32 @A.foo(ptr nocapture %this)14 15define void @storeA(ptr %a.ptr) {16; CHECK-LABEL: @storeA(17; CHECK-NEXT:    store ptr @A__vtblZ, ptr [[A_PTR:%.*]], align 818; CHECK-NEXT:    ret void19;20  store %A { ptr @A__vtblZ }, ptr %a.ptr, align 821  ret void22}23 24define void @storeB(ptr %b.ptr) {25; CHECK-LABEL: @storeB(26; CHECK-NEXT:    store ptr null, ptr [[B_PTR:%.*]], align 827; CHECK-NEXT:    [[B_PTR_REPACK1:%.*]] = getelementptr inbounds nuw i8, ptr [[B_PTR]], i64 828; CHECK-NEXT:    store i64 42, ptr [[B_PTR_REPACK1]], align 829; CHECK-NEXT:    ret void30;31  store %B { ptr null, i64 42 }, ptr %b.ptr, align 832  ret void33}34 35define void @storeStructOfA(ptr %sa.ptr) {36; CHECK-LABEL: @storeStructOfA(37; CHECK-NEXT:    store ptr @A__vtblZ, ptr [[SA_PTR:%.*]], align 838; CHECK-NEXT:    ret void39;40  store { %A } { %A { ptr @A__vtblZ } }, ptr %sa.ptr, align 841  ret void42}43 44define void @storeArrayOfA(ptr %aa.ptr) {45; CHECK-LABEL: @storeArrayOfA(46; CHECK-NEXT:    store ptr @A__vtblZ, ptr [[AA_PTR:%.*]], align 847; CHECK-NEXT:    ret void48;49  store [1 x %A] [%A { ptr @A__vtblZ }], ptr %aa.ptr, align 850  ret void51}52 53; UTC_ARGS: --disable54define void @storeLargeArrayOfA(ptr %aa.ptr) {55; CHECK-LABEL: @storeLargeArrayOfA(56; CHECK-NEXT:    store [2000 x %A]57; CHECK-NEXT:    ret void58;59  %i1 = insertvalue [2000 x %A] poison, %A { ptr @A__vtblZ }, 160  store [2000 x %A] %i1, ptr %aa.ptr, align 861  ret void62}63; UTC_ARGS: --enable64 65define void @storeStructOfArrayOfA(ptr %saa.ptr) {66; CHECK-LABEL: @storeStructOfArrayOfA(67; CHECK-NEXT:    store ptr @A__vtblZ, ptr [[SAA_PTR:%.*]], align 868; CHECK-NEXT:    ret void69;70  store { [1 x %A] } { [1 x %A] [%A { ptr @A__vtblZ }] }, ptr %saa.ptr, align 871  ret void72}73 74define void @storeArrayOfB(ptr %ab.ptr, [2 x %B] %ab) {75; CHECK-LABEL: @storeArrayOfB(76; CHECK-NEXT:    [[AB_ELT:%.*]] = extractvalue [2 x %B] [[AB:%.*]], 077; CHECK-NEXT:    [[AB_ELT_ELT:%.*]] = extractvalue [[B:%.*]] [[AB_ELT]], 078; CHECK-NEXT:    store ptr [[AB_ELT_ELT]], ptr [[AB_PTR:%.*]], align 879; CHECK-NEXT:    [[AB_PTR_REPACK3:%.*]] = getelementptr inbounds nuw i8, ptr [[AB_PTR]], i64 880; CHECK-NEXT:    [[AB_ELT_ELT4:%.*]] = extractvalue [[B]] [[AB_ELT]], 181; CHECK-NEXT:    store i64 [[AB_ELT_ELT4]], ptr [[AB_PTR_REPACK3]], align 882; CHECK-NEXT:    [[AB_PTR_REPACK1:%.*]] = getelementptr inbounds nuw i8, ptr [[AB_PTR]], i64 1683; CHECK-NEXT:    [[AB_ELT2:%.*]] = extractvalue [2 x %B] [[AB]], 184; CHECK-NEXT:    [[AB_ELT2_ELT:%.*]] = extractvalue [[B]] [[AB_ELT2]], 085; CHECK-NEXT:    store ptr [[AB_ELT2_ELT]], ptr [[AB_PTR_REPACK1]], align 886; CHECK-NEXT:    [[AB_PTR_REPACK1_REPACK5:%.*]] = getelementptr inbounds nuw i8, ptr [[AB_PTR]], i64 2487; CHECK-NEXT:    [[AB_ELT2_ELT6:%.*]] = extractvalue [[B]] [[AB_ELT2]], 188; CHECK-NEXT:    store i64 [[AB_ELT2_ELT6]], ptr [[AB_PTR_REPACK1_REPACK5]], align 889; CHECK-NEXT:    ret void90;91  store [2 x %B] %ab, ptr %ab.ptr, align 892  ret void93}94 95define %A @loadA(ptr %a.ptr) {96; CHECK-LABEL: @loadA(97; CHECK-NEXT:    [[DOTUNPACK:%.*]] = load ptr, ptr [[A_PTR:%.*]], align 898; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue [[A:%.*]] poison, ptr [[DOTUNPACK]], 099; CHECK-NEXT:    ret [[A]] [[TMP1]]100;101  %1 = load %A, ptr %a.ptr, align 8102  ret %A %1103}104 105define %B @loadB(ptr %b.ptr) {106; CHECK-LABEL: @loadB(107; CHECK-NEXT:    [[DOTUNPACK:%.*]] = load ptr, ptr [[B_PTR:%.*]], align 8108; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue [[B:%.*]] poison, ptr [[DOTUNPACK]], 0109; CHECK-NEXT:    [[DOTELT1:%.*]] = getelementptr inbounds nuw i8, ptr [[B_PTR]], i64 8110; CHECK-NEXT:    [[DOTUNPACK2:%.*]] = load i64, ptr [[DOTELT1]], align 8111; CHECK-NEXT:    [[TMP2:%.*]] = insertvalue [[B]] [[TMP1]], i64 [[DOTUNPACK2]], 1112; CHECK-NEXT:    ret [[B]] [[TMP2]]113;114  %1 = load %B, ptr %b.ptr, align 8115  ret %B %1116}117 118define { %A } @loadStructOfA(ptr %sa.ptr) {119; CHECK-LABEL: @loadStructOfA(120; CHECK-NEXT:    [[DOTUNPACK_UNPACK:%.*]] = load ptr, ptr [[SA_PTR:%.*]], align 8121; CHECK-NEXT:    [[DOTUNPACK1:%.*]] = insertvalue [[A:%.*]] poison, ptr [[DOTUNPACK_UNPACK]], 0122; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { [[A]] } poison, [[A]] [[DOTUNPACK1]], 0123; CHECK-NEXT:    ret { [[A]] } [[TMP1]]124;125  %1 = load { %A }, ptr %sa.ptr, align 8126  ret { %A } %1127}128 129define [1 x %A] @loadArrayOfA(ptr %aa.ptr) {130; CHECK-LABEL: @loadArrayOfA(131; CHECK-NEXT:    [[DOTUNPACK_UNPACK:%.*]] = load ptr, ptr [[AA_PTR:%.*]], align 8132; CHECK-NEXT:    [[DOTUNPACK1:%.*]] = insertvalue [[A:%.*]] poison, ptr [[DOTUNPACK_UNPACK]], 0133; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue [1 x %A] poison, [[A]] [[DOTUNPACK1]], 0134; CHECK-NEXT:    ret [1 x %A] [[TMP1]]135;136  %1 = load [1 x %A], ptr %aa.ptr, align 8137  ret [1 x %A] %1138}139 140define { [1 x %A] } @loadStructOfArrayOfA(ptr %saa.ptr) {141; CHECK-LABEL: @loadStructOfArrayOfA(142; CHECK-NEXT:    [[DOTUNPACK_UNPACK_UNPACK:%.*]] = load ptr, ptr [[SAA_PTR:%.*]], align 8143; CHECK-NEXT:    [[DOTUNPACK_UNPACK2:%.*]] = insertvalue [[A:%.*]] poison, ptr [[DOTUNPACK_UNPACK_UNPACK]], 0144; CHECK-NEXT:    [[DOTUNPACK1:%.*]] = insertvalue [1 x %A] poison, [[A]] [[DOTUNPACK_UNPACK2]], 0145; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { [1 x %A] } poison, [1 x %A] [[DOTUNPACK1]], 0146; CHECK-NEXT:    ret { [1 x %A] } [[TMP1]]147;148  %1 = load { [1 x %A] }, ptr %saa.ptr, align 8149  ret { [1 x %A] } %1150}151 152define { %A } @structOfA(ptr %sa.ptr) {153; CHECK-LABEL: @structOfA(154; CHECK-NEXT:    store ptr @A__vtblZ, ptr [[SA_PTR:%.*]], align 8155; CHECK-NEXT:    ret { [[A:%.*]] } { [[A]] { ptr @A__vtblZ } }156;157  store { %A } { %A { ptr @A__vtblZ } }, ptr %sa.ptr, align 8158  %1 = load { %A }, ptr %sa.ptr, align 8159  ret { %A } %1160}161 162define %B @structB(ptr %b.ptr) {163; CHECK-LABEL: @structB(164; CHECK-NEXT:    store ptr null, ptr [[B_PTR:%.*]], align 8165; CHECK-NEXT:    [[B_PTR_REPACK1:%.*]] = getelementptr inbounds nuw i8, ptr [[B_PTR]], i64 8166; CHECK-NEXT:    store i64 42, ptr [[B_PTR_REPACK1]], align 8167; CHECK-NEXT:    ret [[B:%.*]] { ptr null, i64 42 }168;169  store %B { ptr null, i64 42 }, ptr %b.ptr, align 8170  %1 = load %B, ptr %b.ptr, align 8171  ret %B %1172}173 174define [2 x %B] @loadArrayOfB(ptr %ab.ptr) {175; CHECK-LABEL: @loadArrayOfB(176; CHECK-NEXT:    [[DOTUNPACK_UNPACK:%.*]] = load ptr, ptr [[AB_PTR:%.*]], align 8177; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue [[B:%.*]] poison, ptr [[DOTUNPACK_UNPACK]], 0178; CHECK-NEXT:    [[DOTUNPACK_ELT3:%.*]] = getelementptr inbounds nuw i8, ptr [[AB_PTR]], i64 8179; CHECK-NEXT:    [[DOTUNPACK_UNPACK4:%.*]] = load i64, ptr [[DOTUNPACK_ELT3]], align 8180; CHECK-NEXT:    [[DOTUNPACK5:%.*]] = insertvalue [[B]] [[TMP1]], i64 [[DOTUNPACK_UNPACK4]], 1181; CHECK-NEXT:    [[TMP2:%.*]] = insertvalue [2 x %B] poison, [[B]] [[DOTUNPACK5]], 0182; CHECK-NEXT:    [[DOTELT1:%.*]] = getelementptr inbounds nuw i8, ptr [[AB_PTR]], i64 16183; CHECK-NEXT:    [[DOTUNPACK2_UNPACK:%.*]] = load ptr, ptr [[DOTELT1]], align 8184; CHECK-NEXT:    [[TMP3:%.*]] = insertvalue [[B]] poison, ptr [[DOTUNPACK2_UNPACK]], 0185; CHECK-NEXT:    [[DOTUNPACK2_ELT6:%.*]] = getelementptr inbounds nuw i8, ptr [[AB_PTR]], i64 24186; CHECK-NEXT:    [[DOTUNPACK2_UNPACK7:%.*]] = load i64, ptr [[DOTUNPACK2_ELT6]], align 8187; CHECK-NEXT:    [[DOTUNPACK28:%.*]] = insertvalue [[B]] [[TMP3]], i64 [[DOTUNPACK2_UNPACK7]], 1188; CHECK-NEXT:    [[TMP4:%.*]] = insertvalue [2 x %B] [[TMP2]], [[B]] [[DOTUNPACK28]], 1189; CHECK-NEXT:    ret [2 x %B] [[TMP4]]190;191  %1 = load [2 x %B], ptr %ab.ptr, align 8192  ret [2 x %B] %1193}194 195define [2000 x %B] @loadLargeArrayOfB(ptr %ab.ptr) {196; CHECK-LABEL: @loadLargeArrayOfB(197; CHECK-NEXT:    [[TMP1:%.*]] = load [2000 x %B], ptr [[AB_PTR:%.*]], align 8198; CHECK-NEXT:    ret [2000 x %B] [[TMP1]]199;200  %1 = load [2000 x %B], ptr %ab.ptr, align 8201  ret [2000 x %B] %1202}203 204%struct.S = type <{ i8, %struct.T }>205%struct.T = type { i32, i32 }206 207; Make sure that we do not increase alignment of packed struct element208define i32 @packed_alignment(ptr dereferenceable(9) %s) {209; CHECK-LABEL: @packed_alignment(210; CHECK-NEXT:    [[TV_ELT1:%.*]] = getelementptr inbounds nuw i8, ptr [[S:%.*]], i64 5211; CHECK-NEXT:    [[TV_UNPACK2:%.*]] = load i32, ptr [[TV_ELT1]], align 1212; CHECK-NEXT:    ret i32 [[TV_UNPACK2]]213;214  %t = getelementptr inbounds %struct.S, ptr %s, i32 0, i32 1215  %tv = load %struct.T, ptr %t, align 1216  %v = extractvalue %struct.T %tv, 1217  ret i32 %v218}219 220%struct.U = type {i8, i8, i8, i8, i8, i8, i8, i8, i64}221 222define void @check_alignment(ptr %u, ptr %v) {223; CHECK-LABEL: @check_alignment(224; CHECK-NEXT:    [[DOTUNPACK:%.*]] = load i8, ptr [[U:%.*]], align 8225; CHECK-NEXT:    [[DOTELT1:%.*]] = getelementptr inbounds nuw i8, ptr [[U]], i64 1226; CHECK-NEXT:    [[DOTUNPACK2:%.*]] = load i8, ptr [[DOTELT1]], align 1227; CHECK-NEXT:    [[DOTELT3:%.*]] = getelementptr inbounds nuw i8, ptr [[U]], i64 2228; CHECK-NEXT:    [[DOTUNPACK4:%.*]] = load i8, ptr [[DOTELT3]], align 2229; CHECK-NEXT:    [[DOTELT5:%.*]] = getelementptr inbounds nuw i8, ptr [[U]], i64 3230; CHECK-NEXT:    [[DOTUNPACK6:%.*]] = load i8, ptr [[DOTELT5]], align 1231; CHECK-NEXT:    [[DOTELT7:%.*]] = getelementptr inbounds nuw i8, ptr [[U]], i64 4232; CHECK-NEXT:    [[DOTUNPACK8:%.*]] = load i8, ptr [[DOTELT7]], align 4233; CHECK-NEXT:    [[DOTELT9:%.*]] = getelementptr inbounds nuw i8, ptr [[U]], i64 5234; CHECK-NEXT:    [[DOTUNPACK10:%.*]] = load i8, ptr [[DOTELT9]], align 1235; CHECK-NEXT:    [[DOTELT11:%.*]] = getelementptr inbounds nuw i8, ptr [[U]], i64 6236; CHECK-NEXT:    [[DOTUNPACK12:%.*]] = load i8, ptr [[DOTELT11]], align 2237; CHECK-NEXT:    [[DOTELT13:%.*]] = getelementptr inbounds nuw i8, ptr [[U]], i64 7238; CHECK-NEXT:    [[DOTUNPACK14:%.*]] = load i8, ptr [[DOTELT13]], align 1239; CHECK-NEXT:    [[DOTELT15:%.*]] = getelementptr inbounds nuw i8, ptr [[U]], i64 8240; CHECK-NEXT:    [[DOTUNPACK16:%.*]] = load i64, ptr [[DOTELT15]], align 8241; CHECK-NEXT:    store i8 [[DOTUNPACK]], ptr [[V:%.*]], align 8242; CHECK-NEXT:    [[V_REPACK17:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 1243; CHECK-NEXT:    store i8 [[DOTUNPACK2]], ptr [[V_REPACK17]], align 1244; CHECK-NEXT:    [[V_REPACK19:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 2245; CHECK-NEXT:    store i8 [[DOTUNPACK4]], ptr [[V_REPACK19]], align 2246; CHECK-NEXT:    [[V_REPACK21:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 3247; CHECK-NEXT:    store i8 [[DOTUNPACK6]], ptr [[V_REPACK21]], align 1248; CHECK-NEXT:    [[V_REPACK23:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 4249; CHECK-NEXT:    store i8 [[DOTUNPACK8]], ptr [[V_REPACK23]], align 4250; CHECK-NEXT:    [[V_REPACK25:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 5251; CHECK-NEXT:    store i8 [[DOTUNPACK10]], ptr [[V_REPACK25]], align 1252; CHECK-NEXT:    [[V_REPACK27:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 6253; CHECK-NEXT:    store i8 [[DOTUNPACK12]], ptr [[V_REPACK27]], align 2254; CHECK-NEXT:    [[V_REPACK29:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 7255; CHECK-NEXT:    store i8 [[DOTUNPACK14]], ptr [[V_REPACK29]], align 1256; CHECK-NEXT:    [[V_REPACK31:%.*]] = getelementptr inbounds nuw i8, ptr [[V]], i64 8257; CHECK-NEXT:    store i64 [[DOTUNPACK16]], ptr [[V_REPACK31]], align 8258; CHECK-NEXT:    ret void259;260  %1 = load %struct.U, ptr %u261  store %struct.U %1, ptr %v262  ret void263}264