brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.5 KiB · 1a1fe20 Raw
224 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 62; RUN: opt -mtriple=x86_64-apple-darwin10.0.0 -passes=pre-isel-intrinsic-lowering -S -o - %s | FileCheck %s3 4;.5; CHECK: @G = global i32 56; CHECK: @.memset_pattern = private unnamed_addr constant [2 x ptr] [ptr @G, ptr @G], align 167; CHECK: @.memset_pattern.1 = private unnamed_addr constant [2 x i64] [i64 -6148895925951734307, i64 -6148895925951734307], align 168; CHECK: @.memset_pattern.2 = private unnamed_addr constant [2 x i64] [i64 4614256656552045848, i64 4614256656552045848], align 169; CHECK: @.memset_pattern.3 = private unnamed_addr constant [8 x i16] [i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555], align 1610; CHECK: @.memset_pattern.4 = private unnamed_addr constant i128 -113427455635030943652277463699152839203, align 1611;.12define void @memset_pattern_i128_1_dynvalue(ptr %a, i128 %value) nounwind {13; CHECK-LABEL: define void @memset_pattern_i128_1_dynvalue(14; CHECK-SAME: ptr [[A:%.*]], i128 [[VALUE:%.*]]) #[[ATTR0:[0-9]+]] {15; CHECK-NEXT:    br i1 false, label %[[SPLIT:.*]], label %[[LOADSTORELOOP:.*]]16; CHECK:       [[LOADSTORELOOP]]:17; CHECK-NEXT:    [[TMP1:%.*]] = phi i64 [ 0, [[TMP0:%.*]] ], [ [[TMP3:%.*]], %[[LOADSTORELOOP]] ]18; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i128, ptr [[A]], i64 [[TMP1]]19; CHECK-NEXT:    store i128 [[VALUE]], ptr [[TMP2]], align 120; CHECK-NEXT:    [[TMP3]] = add i64 [[TMP1]], 121; CHECK-NEXT:    [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 122; CHECK-NEXT:    br i1 [[TMP4]], label %[[LOADSTORELOOP]], label %[[SPLIT]]23; CHECK:       [[SPLIT]]:24; CHECK-NEXT:    ret void25;26  tail call void @llvm.experimental.memset.pattern(ptr %a, i128 %value, i64 1, i1 false)27  ret void28}29 30define void @memset_pattern_i128_1(ptr %a, i128 %value) nounwind {31; CHECK-LABEL: define void @memset_pattern_i128_1(32; CHECK-SAME: ptr [[A:%.*]], i128 [[VALUE:%.*]]) #[[ATTR0]] {33; CHECK-NEXT:    call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.4, i64 16)34; CHECK-NEXT:    ret void35;36  tail call void @llvm.experimental.memset.pattern(ptr %a, i128 u0xaaaaaaaabbbbbbbbccccccccdddddddd, i64 1, i1 false)37  ret void38}39 40define void @memset_pattern_i128_1_nz_as(ptr addrspace(1) %a, i128 %value) nounwind {41; CHECK-LABEL: define void @memset_pattern_i128_1_nz_as(42; CHECK-SAME: ptr addrspace(1) [[A:%.*]], i128 [[VALUE:%.*]]) #[[ATTR0]] {43; CHECK-NEXT:    br i1 false, label %[[SPLIT:.*]], label %[[LOADSTORELOOP:.*]]44; CHECK:       [[LOADSTORELOOP]]:45; CHECK-NEXT:    [[TMP1:%.*]] = phi i64 [ 0, [[TMP0:%.*]] ], [ [[TMP3:%.*]], %[[LOADSTORELOOP]] ]46; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i128, ptr addrspace(1) [[A]], i64 [[TMP1]]47; CHECK-NEXT:    store i128 -113427455635030943652277463699152839203, ptr addrspace(1) [[TMP2]], align 148; CHECK-NEXT:    [[TMP3]] = add i64 [[TMP1]], 149; CHECK-NEXT:    [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 150; CHECK-NEXT:    br i1 [[TMP4]], label %[[LOADSTORELOOP]], label %[[SPLIT]]51; CHECK:       [[SPLIT]]:52; CHECK-NEXT:    ret void53;54  tail call void @llvm.experimental.memset.pattern(ptr addrspace(1) %a, i128 u0xaaaaaaaabbbbbbbbccccccccdddddddd, i64 1, i1 false)55  ret void56}57 58define void @memset_pattern_i128_1_align_attr(ptr align(16) %a, i128 %value) nounwind {59; CHECK-LABEL: define void @memset_pattern_i128_1_align_attr(60; CHECK-SAME: ptr align 16 [[A:%.*]], i128 [[VALUE:%.*]]) #[[ATTR0]] {61; CHECK-NEXT:    call void @memset_pattern16(ptr align 16 [[A]], ptr @.memset_pattern.4, i64 16)62; CHECK-NEXT:    ret void63;64  tail call void @llvm.experimental.memset.pattern(ptr align(16) %a, i128 u0xaaaaaaaabbbbbbbbccccccccdddddddd, i64 1, i1 false)65  ret void66}67 68define void @memset_pattern_i128_16(ptr %a) nounwind {69; CHECK-LABEL: define void @memset_pattern_i128_16(70; CHECK-SAME: ptr [[A:%.*]]) #[[ATTR0]] {71; CHECK-NEXT:    call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.4, i64 256)72; CHECK-NEXT:    ret void73;74  tail call void @llvm.experimental.memset.pattern(ptr %a, i128 u0xaaaaaaaabbbbbbbbccccccccdddddddd, i64 16, i1 false)75  ret void76}77 78define void @memset_pattern_i128_x(ptr %a, i64 %x) nounwind {79; CHECK-LABEL: define void @memset_pattern_i128_x(80; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {81; CHECK-NEXT:    [[TMP1:%.*]] = mul i64 16, [[X]]82; CHECK-NEXT:    call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.4, i64 [[TMP1]])83; CHECK-NEXT:    ret void84;85  tail call void @llvm.experimental.memset.pattern(ptr %a, i128 u0xaaaaaaaabbbbbbbbccccccccdddddddd, i64 %x, i1 false)86  ret void87}88 89define void @memset_pattern_i128_x_nonzero_as(ptr addrspace(10) %a, i64 %x) nounwind {90; CHECK-LABEL: define void @memset_pattern_i128_x_nonzero_as(91; CHECK-SAME: ptr addrspace(10) [[A:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {92; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i64 0, [[X]]93; CHECK-NEXT:    br i1 [[TMP1]], label %[[SPLIT:.*]], label %[[LOADSTORELOOP:.*]]94; CHECK:       [[LOADSTORELOOP]]:95; CHECK-NEXT:    [[TMP2:%.*]] = phi i64 [ 0, [[TMP0:%.*]] ], [ [[TMP4:%.*]], %[[LOADSTORELOOP]] ]96; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i128, ptr addrspace(10) [[A]], i64 [[TMP2]]97; CHECK-NEXT:    store i128 -113427455635030943652277463699152839203, ptr addrspace(10) [[TMP3]], align 198; CHECK-NEXT:    [[TMP4]] = add i64 [[TMP2]], 199; CHECK-NEXT:    [[TMP5:%.*]] = icmp ult i64 [[TMP4]], [[X]]100; CHECK-NEXT:    br i1 [[TMP5]], label %[[LOADSTORELOOP]], label %[[SPLIT]]101; CHECK:       [[SPLIT]]:102; CHECK-NEXT:    ret void103;104  tail call void @llvm.experimental.memset.pattern(ptr addrspace(10) %a, i128 u0xaaaaaaaabbbbbbbbccccccccdddddddd, i64 %x, i1 false)105  ret void106}107 108define void @memset_pattern_i16_x(ptr %a, i64 %x) nounwind {109; CHECK-LABEL: define void @memset_pattern_i16_x(110; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {111; CHECK-NEXT:    [[TMP1:%.*]] = mul i64 2, [[X]]112; CHECK-NEXT:    call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.3, i64 [[TMP1]])113; CHECK-NEXT:    ret void114;115  tail call void @llvm.experimental.memset.pattern(ptr %a, i16 u0xabcd, i64 %x, i1 false)116  ret void117}118 119define void @memset_pattern_i64_x(ptr %a, i64 %x) nounwind {120; CHECK-LABEL: define void @memset_pattern_i64_x(121; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {122; CHECK-NEXT:    [[TMP1:%.*]] = mul i64 8, [[X]]123; CHECK-NEXT:    call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.1, i64 [[TMP1]])124; CHECK-NEXT:    ret void125;126  tail call void @llvm.experimental.memset.pattern(ptr %a, i64 u0xaaaabbbbccccdddd, i64 %x, i1 false)127  ret void128}129 130; Demonstrate that TBAA metadata is preserved.131define void @memset_pattern_i64_128_tbaa(ptr %a) nounwind {132; CHECK-LABEL: define void @memset_pattern_i64_128_tbaa(133; CHECK-SAME: ptr [[A:%.*]]) #[[ATTR0]] {134; CHECK-NEXT:    call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.2, i64 1024), !tbaa [[DOUBLE_TBAA0:![0-9]+]]135; CHECK-NEXT:    ret void136;137  tail call void @llvm.experimental.memset.pattern(ptr %a, i64 u0x400921fb54442d18, i64 128, i1 false), !tbaa !5138  ret void139}140 141!5 = !{!6, !6, i64 0}142!6 = !{!"double", !7, i64 0}143!7 = !{!"omnipotent char", !8, i64 0}144!8 = !{!"Simple C++ TBAA"}145 146define void @memset_pattern_i64_narrow_idx(ptr %a, i32 %x) nounwind {147; CHECK-LABEL: define void @memset_pattern_i64_narrow_idx(148; CHECK-SAME: ptr [[A:%.*]], i32 [[X:%.*]]) #[[ATTR0]] {149; CHECK-NEXT:    [[TMP1:%.*]] = zext i32 [[X]] to i64150; CHECK-NEXT:    [[TMP2:%.*]] = mul i64 8, [[TMP1]]151; CHECK-NEXT:    call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.1, i64 [[TMP2]])152; CHECK-NEXT:    ret void153;154  tail call void @llvm.experimental.memset.pattern(ptr %a, i64 u0xaaaabbbbccccdddd, i32 %x, i1 false)155  ret void156}157 158define void @memset_pattern_i64_wide_idx(ptr %a, i128 %x) nounwind {159; CHECK-LABEL: define void @memset_pattern_i64_wide_idx(160; CHECK-SAME: ptr [[A:%.*]], i128 [[X:%.*]]) #[[ATTR0]] {161; CHECK-NEXT:    [[TMP1:%.*]] = trunc i128 [[X]] to i64162; CHECK-NEXT:    [[TMP2:%.*]] = mul i64 8, [[TMP1]]163; CHECK-NEXT:    call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.1, i64 [[TMP2]])164; CHECK-NEXT:    ret void165;166  tail call void @llvm.experimental.memset.pattern(ptr %a, i64 u0xaaaabbbbccccdddd, i128 %x, i1 false)167  ret void168}169 170@G = global i32 5171 172define void @memset_pattern_i64_16_fromptr(ptr %a) nounwind {173; CHECK-LABEL: define void @memset_pattern_i64_16_fromptr(174; CHECK-SAME: ptr [[A:%.*]]) #[[ATTR0]] {175; CHECK-NEXT:    call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern, i64 128)176; CHECK-NEXT:    ret void177;178  tail call void @llvm.experimental.memset.pattern(ptr %a, ptr @G, i64 16, i1 false)179  ret void180}181 182define void @memset_pattern_i64_x_fromptr(ptr %a, i64 %x) nounwind {183; CHECK-LABEL: define void @memset_pattern_i64_x_fromptr(184; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {185; CHECK-NEXT:    [[TMP2:%.*]] = mul i64 8, [[X]]186; CHECK-NEXT:    call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern, i64 [[TMP2]])187; CHECK-NEXT:    ret void188;189  tail call void @llvm.experimental.memset.pattern(ptr %a, ptr @G, i64 %x, i1 false)190  ret void191}192 193; memset_pattern16 shouldn't be used for this example (at least not by just194; creating a constantarray global at compile time), as the ptr isn't constant.195define void @memset_pattern_i64_x_fromnonconstptr(ptr %a, i64 %x, ptr %p) nounwind {196; CHECK-LABEL: define void @memset_pattern_i64_x_fromnonconstptr(197; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {198; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 0, [[X]]199; CHECK-NEXT:    br i1 [[TMP2]], label %[[SPLIT:.*]], label %[[LOADSTORELOOP:.*]]200; CHECK:       [[LOADSTORELOOP]]:201; CHECK-NEXT:    [[TMP3:%.*]] = phi i64 [ 0, [[TMP0:%.*]] ], [ [[TMP5:%.*]], %[[LOADSTORELOOP]] ]202; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr inbounds ptr, ptr [[A]], i64 [[TMP3]]203; CHECK-NEXT:    store ptr [[P]], ptr [[TMP4]], align 1204; CHECK-NEXT:    [[TMP5]] = add i64 [[TMP3]], 1205; CHECK-NEXT:    [[TMP6:%.*]] = icmp ult i64 [[TMP5]], [[X]]206; CHECK-NEXT:    br i1 [[TMP6]], label %[[LOADSTORELOOP]], label %[[SPLIT]]207; CHECK:       [[SPLIT]]:208; CHECK-NEXT:    ret void209;210  tail call void @llvm.experimental.memset.pattern(ptr %a, ptr %p, i64 %x, i1 false)211  ret void212}213 214;.215; CHECK: attributes #[[ATTR0]] = { nounwind }216; CHECK: attributes #[[ATTR1:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: write) }217; CHECK: attributes #[[ATTR2:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }218;.219; CHECK: [[DOUBLE_TBAA0]] = !{[[META1:![0-9]+]], [[META1]], i64 0}220; CHECK: [[META1]] = !{!"double", [[META2:![0-9]+]], i64 0}221; CHECK: [[META2]] = !{!"omnipotent char", [[META3:![0-9]+]], i64 0}222; CHECK: [[META3]] = !{!"Simple C++ TBAA"}223;.224