brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.1 KiB · 00af652 Raw
132 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=lower-constant-intrinsics -S < %s | FileCheck %s3 4target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"5target triple = "x86_64-unknown-linux-gnu"6 7declare i64 @llvm.objectsize.i64.p0(ptr, i1 immarg, i1 immarg, i1 immarg)8declare noalias ptr @malloc(i64 noundef) #09 10define i64 @select_alloc_size(i1 %cond) {11; CHECK-LABEL: @select_alloc_size(12; CHECK-NEXT:    [[SIZE:%.*]] = select i1 [[COND:%.*]], i64 3, i64 413; CHECK-NEXT:    [[PTR:%.*]] = alloca i8, i64 [[SIZE]], align 114; CHECK-NEXT:    [[RES:%.*]] = select i1 [[COND]], i64 4, i64 315; CHECK-NEXT:    ret i64 [[RES]]16;17  %size = select i1 %cond, i64 3, i64 418  %ptr = alloca i8, i64 %size19  %objsize_max = call i64 @llvm.objectsize.i64.p0(ptr %ptr, i1 false, i1 true, i1 false)20  %objsize_min = call i64 @llvm.objectsize.i64.p0(ptr %ptr, i1 true, i1 true, i1 false)21  %res = select i1 %cond, i64 %objsize_max, i64 %objsize_min22  ret i64 %res23}24 25define i64 @select_malloc_size(i1 %cond) {26; CHECK-LABEL: @select_malloc_size(27; CHECK-NEXT:    [[SIZE:%.*]] = select i1 [[COND:%.*]], i64 3, i64 428; CHECK-NEXT:    [[PTR:%.*]] = call noalias ptr @malloc(i64 noundef [[SIZE]])29; CHECK-NEXT:    [[RES:%.*]] = select i1 [[COND]], i64 4, i64 330; CHECK-NEXT:    ret i64 [[RES]]31;32  %size = select i1 %cond, i64 3, i64 433  %ptr = call noalias ptr @malloc(i64 noundef %size)34  %objsize_max = call i64 @llvm.objectsize.i64.p0(ptr %ptr, i1 false, i1 true, i1 false)35  %objsize_min = call i64 @llvm.objectsize.i64.p0(ptr %ptr, i1 true, i1 true, i1 false)36  %res = select i1 %cond, i64 %objsize_max, i64 %objsize_min37  ret i64 %res38}39 40define i64 @select_gep_offset(i1 %cond) {41; CHECK-LABEL: @select_gep_offset(42; CHECK-NEXT:    [[PTR:%.*]] = alloca i8, i64 10, align 143; CHECK-NEXT:    [[OFFSET:%.*]] = select i1 [[COND:%.*]], i64 3, i64 444; CHECK-NEXT:    [[PTR_SLIDE:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 [[OFFSET]]45; CHECK-NEXT:    [[RES:%.*]] = select i1 [[COND]], i64 7, i64 646; CHECK-NEXT:    ret i64 [[RES]]47;48  %ptr = alloca i8, i64 1049  %offset = select i1 %cond, i64 3, i64 450  %ptr.slide = getelementptr inbounds i8, ptr %ptr, i64 %offset51  %objsize_max = call i64 @llvm.objectsize.i64.p0(ptr %ptr.slide, i1 false, i1 true, i1 false)52  %objsize_min = call i64 @llvm.objectsize.i64.p0(ptr %ptr.slide, i1 true, i1 true, i1 false)53  %res = select i1 %cond, i64 %objsize_max, i64 %objsize_min54  ret i64 %res55}56 57define i64 @select_gep_neg_offset(i1 %c0, i1 %c1) {58; CHECK-LABEL: @select_gep_neg_offset(59; CHECK-NEXT:    [[PTR:%.*]] = alloca i8, i64 10, align 160; CHECK-NEXT:    [[PTR_SLIDE_1:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 561; CHECK-NEXT:    [[OFFSET:%.*]] = select i1 [[COND:%.*]], i64 -3, i64 -462; CHECK-NEXT:    [[PTR_SLIDE_2:%.*]] = getelementptr inbounds i8, ptr [[PTR_SLIDE_1]], i64 [[OFFSET]]63; CHECK-NEXT:    [[RES:%.*]] = select i1 [[C1:%.*]], i64 9, i64 864; CHECK-NEXT:    ret i64 [[RES]]65;66  %ptr = alloca i8, i64 1067  %ptr.slide.1 = getelementptr inbounds i8, ptr %ptr, i64 568  %offset = select i1 %c0, i64 -3, i64 -469  %ptr.slide.2 = getelementptr inbounds i8, ptr %ptr.slide.1, i64 %offset70  %objsize_max = call i64 @llvm.objectsize.i64.p0(ptr %ptr.slide.2, i1 false, i1 true, i1 false)71  %objsize_min = call i64 @llvm.objectsize.i64.p0(ptr %ptr.slide.2, i1 true, i1 true, i1 false)72  %res = select i1 %c1, i64 %objsize_max, i64 %objsize_min73  ret i64 %res74}75 76define i64 @select_neg_oob_offset(i1 %c0, i1 %c1) {77; CHECK-LABEL: @select_neg_oob_offset(78; CHECK-NEXT:    [[PTR:%.*]] = alloca i8, i64 10, align 179; CHECK-NEXT:    [[OFFSET:%.*]] = select i1 [[C0:%.*]], i64 -3, i64 -480; CHECK-NEXT:    [[PTR_SLIDE:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 [[OFFSET]]81; CHECK-NEXT:    [[RES:%.*]] = select i1 [[C1:%.*]], i64 -1, i64 082; CHECK-NEXT:    ret i64 [[RES]]83;84  %ptr = alloca i8, i64 1085  %offset = select i1 %c0, i64 -3, i64 -486  %ptr.slide = getelementptr inbounds i8, ptr %ptr, i64 %offset87  %objsize_max = call i64 @llvm.objectsize.i64.p0(ptr %ptr.slide, i1 false, i1 true, i1 false)88  %objsize_min = call i64 @llvm.objectsize.i64.p0(ptr %ptr.slide, i1 true, i1 true, i1 false)89  %res = select i1 %c1, i64 %objsize_max, i64 %objsize_min90  ret i64 %res91}92 93define i64 @select_gep_offsets(i1 %cond) {94; CHECK-LABEL: @select_gep_offsets(95; CHECK-NEXT:    [[PTR:%.*]] = alloca [10 x i8], i64 2, align 196; CHECK-NEXT:    [[OFFSET:%.*]] = select i1 [[COND:%.*]], i32 0, i32 197; CHECK-NEXT:    [[PTR_SLIDE:%.*]] = getelementptr inbounds [10 x i8], ptr [[PTR]], i32 [[OFFSET]], i32 598; CHECK-NEXT:    [[RES:%.*]] = select i1 [[COND]], i64 15, i64 599; CHECK-NEXT:    ret i64 [[RES]]100;101  %ptr = alloca [10 x i8], i64 2102  %offset = select i1 %cond, i32 0, i32 1103  %ptr.slide = getelementptr inbounds [10 x i8], ptr %ptr, i32 %offset, i32 5104  %objsize_max = call i64 @llvm.objectsize.i64.p0(ptr %ptr.slide, i1 false, i1 true, i1 false)105  %objsize_min = call i64 @llvm.objectsize.i64.p0(ptr %ptr.slide, i1 true, i1 true, i1 false)106  %res = select i1 %cond, i64 %objsize_max, i64 %objsize_min107  ret i64 %res108}109 110define i64 @select_gep_oob_overapproximated_offsets(i1 %cond) {111; CHECK-LABEL: @select_gep_oob_overapproximated_offsets(112; CHECK-NEXT:    [[BASE1:%.*]] = alloca [288 x i8], align 16113; CHECK-NEXT:    [[SELECT0:%.*]] = select i1 [[COND:%.*]], i64 -4, i64 -64114; CHECK-NEXT:    [[SELECT1:%.*]] = select i1 [[COND]], i64 16, i64 64115; CHECK-NEXT:    [[GEP0:%.*]] = getelementptr inbounds nuw i8, ptr [[BASE1]], i64 [[SELECT1]]116; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr inbounds i8, ptr [[GEP0]], i64 [[SELECT0]]117; CHECK-NEXT:    ret i64 -1118;119  %base1 = alloca [288 x i8], align 16120  %select0 = select i1 %cond, i64 -4, i64 -64121  %select1 = select i1 %cond, i64 16, i64 64122; This never actually goes oob, but because we approximate each select123; independently, this actually ranges in [16 - 64 ; 64 - 4] instead of [64 - 64; 16 - 4]124  %gep0 = getelementptr inbounds nuw i8, ptr %base1, i64 %select1125  %gep1 = getelementptr inbounds i8, ptr %gep0, i64 %select0126  %call = call i64 @llvm.objectsize.i64.p0(ptr %gep1, i1 false, i1 true, i1 false)127  ret i64 %call128}129 130 131attributes #0 = { nounwind allocsize(0) }132