brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.5 KiB · a513c60 Raw
172 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=dse -S | FileCheck %s3 4target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"5 6declare void @readnone_may_throw() readnone7 8declare void @use(ptr)9 10; Tests where the pointer/object is accessible after the function returns.11 12; Cannot remove the store from the entry block, because the call in bb2 may throw.13define void @accessible_after_return_1(ptr noalias %P, i1 %c1) {14; CHECK-LABEL: @accessible_after_return_1(15; CHECK-NEXT:    store i32 1, ptr [[P:%.*]], align 416; CHECK-NEXT:    br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]17; CHECK:       bb1:18; CHECK-NEXT:    store i32 0, ptr [[P]], align 419; CHECK-NEXT:    br label [[BB5:%.*]]20; CHECK:       bb2:21; CHECK-NEXT:    call void @readnone_may_throw()22; CHECK-NEXT:    store i32 3, ptr [[P]], align 423; CHECK-NEXT:    br label [[BB5]]24; CHECK:       bb5:25; CHECK-NEXT:    call void @use(ptr [[P]])26; CHECK-NEXT:    ret void27;28  store i32 1, ptr %P29  br i1 %c1, label %bb1, label %bb230 31bb1:32  store i32 0, ptr %P33  br label %bb534 35bb2:36  call void @readnone_may_throw()37  store i32 3, ptr %P38  br label %bb539 40bb5:41  call void @use(ptr %P)42  ret void43}44 45; Cannot remove the store from the entry block, because the call in bb3 may throw.46define void @accessible_after_return6(ptr %P, i1 %c.1, i1 %c.2) {47; CHECK-LABEL: @accessible_after_return6(48; CHECK-NEXT:  entry:49; CHECK-NEXT:    store i32 0, ptr [[P:%.*]], align 450; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]51; CHECK:       bb1:52; CHECK-NEXT:    br i1 [[C_2:%.*]], label [[BB3:%.*]], label [[BB4:%.*]]53; CHECK:       bb2:54; CHECK-NEXT:    store i32 1, ptr [[P]], align 455; CHECK-NEXT:    ret void56; CHECK:       bb3:57; CHECK-NEXT:    call void @readnone_may_throw()58; CHECK-NEXT:    store i32 2, ptr [[P]], align 459; CHECK-NEXT:    ret void60; CHECK:       bb4:61; CHECK-NEXT:    store i32 3, ptr [[P]], align 462; CHECK-NEXT:    ret void63;64entry:65  store i32 0, ptr %P66  br i1 %c.1, label %bb1, label %bb267 68bb1:69  br i1 %c.2, label %bb3, label %bb470 71bb2:72  store i32 1, ptr %P73  ret void74 75bb3:76  call void @readnone_may_throw()77  store i32 2, ptr %P78  ret void79 80bb4:81  store i32 3, ptr %P82  ret void83}84 85; Tests where the pointer/object is *NOT* accessible after the function returns.86 87; The store in the entry block can be eliminated, because it is overwritten88; on all paths to the exit. As the location is not visible to the caller, the89; call in bb2 (which may throw) can be ignored.90define void @alloca_1(i1 %c1) {91; CHECK-LABEL: @alloca_1(92; CHECK-NEXT:  entry:93; CHECK-NEXT:    [[P:%.*]] = alloca i3294; CHECK-NEXT:    br i1 [[C1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]95; CHECK:       bb1:96; CHECK-NEXT:    store i32 0, ptr [[P]], align 497; CHECK-NEXT:    br label [[BB5:%.*]]98; CHECK:       bb2:99; CHECK-NEXT:    call void @readnone_may_throw()100; CHECK-NEXT:    store i32 3, ptr [[P]], align 4101; CHECK-NEXT:    br label [[BB5]]102; CHECK:       bb5:103; CHECK-NEXT:    call void @use(ptr [[P]])104; CHECK-NEXT:    ret void105;106entry:107  %P = alloca i32108  store i32 1, ptr %P109  br i1 %c1, label %bb1, label %bb2110 111bb1:112  store i32 0, ptr %P113  br label %bb5114 115bb2:116  call void @readnone_may_throw()117  store i32 3, ptr %P118  br label %bb5119 120bb5:121  call void @use(ptr %P)122  ret void123}124 125; The store in the entry block can be eliminated, because it is overwritten126; on all paths to the exit. As the location is not visible to the caller, the127; call in bb3 (which may throw) can be ignored.128define void @alloca_2(i1 %c.1, i1 %c.2) {129; CHECK-LABEL: @alloca_2(130; CHECK-NEXT:    [[P:%.*]] = alloca i32131; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]132; CHECK:       bb1:133; CHECK-NEXT:    store i32 0, ptr [[P]], align 4134; CHECK-NEXT:    br label [[BB5:%.*]]135; CHECK:       bb2:136; CHECK-NEXT:    br i1 [[C_2:%.*]], label [[BB3:%.*]], label [[BB4:%.*]]137; CHECK:       bb3:138; CHECK-NEXT:    call void @readnone_may_throw()139; CHECK-NEXT:    store i32 3, ptr [[P]], align 4140; CHECK-NEXT:    br label [[BB5]]141; CHECK:       bb4:142; CHECK-NEXT:    store i32 5, ptr [[P]], align 4143; CHECK-NEXT:    br label [[BB5]]144; CHECK:       bb5:145; CHECK-NEXT:    call void @use(ptr [[P]])146; CHECK-NEXT:    ret void147;148  %P = alloca i32149  store i32 1, ptr %P150  br i1 %c.1, label %bb1, label %bb2151 152bb1:153  store i32 0, ptr %P154  br label %bb5155 156bb2:157  br i1 %c.2, label %bb3, label %bb4158 159bb3:160  call void @readnone_may_throw()161  store i32 3, ptr %P162  br label %bb5163 164bb4:165  store i32 5, ptr %P166  br label %bb5167 168bb5:169  call void @use(ptr %P)170  ret void171}172