brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.8 KiB · 9a23c73 Raw
708 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes='dse' -S %s | FileCheck %s3 4target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"5 6; Test case from PR50220.7define i32 @other_value_escapes_before_call() {8; CHECK-LABEL: @other_value_escapes_before_call(9; CHECK-NEXT:  entry:10; CHECK-NEXT:    [[V1:%.*]] = alloca i32, align 411; CHECK-NEXT:    [[V2:%.*]] = alloca i32, align 412; CHECK-NEXT:    store i32 0, ptr [[V1]], align 413; CHECK-NEXT:    call void @escape(ptr nonnull [[V1]])14; CHECK-NEXT:    [[CALL:%.*]] = call i32 @getval()15; CHECK-NEXT:    store i32 [[CALL]], ptr [[V2]], align 416; CHECK-NEXT:    call void @escape(ptr nonnull [[V2]])17; CHECK-NEXT:    [[LOAD_V2:%.*]] = load i32, ptr [[V2]], align 418; CHECK-NEXT:    [[LOAD_V1:%.*]] = load i32, ptr [[V1]], align 419; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[LOAD_V2]], [[LOAD_V1]]20; CHECK-NEXT:    ret i32 [[ADD]]21;22entry:23  %v1 = alloca i32, align 424  %v2 = alloca i32, align 425  store i32 0, ptr %v1, align 426  call void @escape(ptr nonnull %v1)27  store i32 55555, ptr %v2, align 428  %call = call i32 @getval()29  store i32 %call, ptr %v2, align 430  call void @escape(ptr nonnull %v2)31  %load.v2 = load i32, ptr %v2, align 432  %load.v1 = load i32, ptr %v1, align 433  %add = add nsw i32 %load.v2, %load.v134  ret i32 %add35}36 37declare void @escape(ptr)38 39declare i32 @getval()40 41declare void @escape_and_clobber(ptr)42declare void @escape_writeonly(ptr) writeonly43declare void @clobber()44 45define i32 @test_not_captured_before_call_same_bb() {46; CHECK-LABEL: @test_not_captured_before_call_same_bb(47; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 448; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()49; CHECK-NEXT:    store i32 99, ptr [[A]], align 450; CHECK-NEXT:    call void @escape_and_clobber(ptr [[A]])51; CHECK-NEXT:    ret i32 [[R]]52;53  %a = alloca i32, align 454  store i32 55, ptr %a55  %r = call i32 @getval()56  store i32 99, ptr %a, align 457  call void @escape_and_clobber(ptr %a)58  ret i32 %r59}60 61define i32 @test_not_captured_before_call_same_bb_escape_unreachable_block() {62; CHECK-LABEL: @test_not_captured_before_call_same_bb_escape_unreachable_block(63; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 464; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()65; CHECK-NEXT:    store i32 99, ptr [[A]], align 466; CHECK-NEXT:    call void @escape_and_clobber(ptr [[A]])67; CHECK-NEXT:    ret i32 [[R]]68; CHECK:       unreach:69; CHECK-NEXT:    call void @escape_and_clobber(ptr [[A]])70; CHECK-NEXT:    ret i32 071;72  %a = alloca i32, align 473  store i32 55, ptr %a74  %r = call i32 @getval()75  store i32 99, ptr %a, align 476  call void @escape_and_clobber(ptr %a)77  ret i32 %r78 79unreach:80  call void @escape_and_clobber(ptr %a)81  ret i32 082}83 84define i32 @test_captured_and_clobbered_after_load_same_bb_2() {85; CHECK-LABEL: @test_captured_and_clobbered_after_load_same_bb_2(86; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 487; CHECK-NEXT:    store i32 55, ptr [[A]], align 488; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()89; CHECK-NEXT:    call void @escape_and_clobber(ptr [[A]])90; CHECK-NEXT:    store i32 99, ptr [[A]], align 491; CHECK-NEXT:    call void @clobber()92; CHECK-NEXT:    ret i32 [[R]]93;94  %a = alloca i32, align 495  store i32 55, ptr %a96  %r = call i32 @getval()97  call void @escape_and_clobber(ptr %a)98  store i32 99, ptr %a, align 499  call void @clobber()100  ret i32 %r101}102 103define i32 @test_captured_after_call_same_bb_2_clobbered_later() {104; CHECK-LABEL: @test_captured_after_call_same_bb_2_clobbered_later(105; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4106; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()107; CHECK-NEXT:    call void @escape_writeonly(ptr [[A]])108; CHECK-NEXT:    store i32 99, ptr [[A]], align 4109; CHECK-NEXT:    call void @clobber()110; CHECK-NEXT:    ret i32 [[R]]111;112  %a = alloca i32, align 4113  store i32 55, ptr %a114  %r = call i32 @getval()115  call void @escape_writeonly(ptr %a)116  store i32 99, ptr %a, align 4117  call void @clobber()118  ret i32 %r119}120 121define i32 @test_captured_sibling_path_to_call_other_blocks_1(i1 %c.1) {122; CHECK-LABEL: @test_captured_sibling_path_to_call_other_blocks_1(123; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4124; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]125; CHECK:       then:126; CHECK-NEXT:    call void @escape_writeonly(ptr [[A]])127; CHECK-NEXT:    br label [[EXIT:%.*]]128; CHECK:       else:129; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()130; CHECK-NEXT:    br label [[EXIT]]131; CHECK:       exit:132; CHECK-NEXT:    [[P:%.*]] = phi i32 [ 0, [[THEN]] ], [ [[R]], [[ELSE]] ]133; CHECK-NEXT:    store i32 99, ptr [[A]], align 4134; CHECK-NEXT:    call void @clobber()135; CHECK-NEXT:    ret i32 [[P]]136;137  %a = alloca i32, align 4138  store i32 55, ptr %a139  br i1 %c.1, label %then, label %else140 141then:142  call void @escape_writeonly(ptr %a)143  br label %exit144 145else:146  %r = call i32 @getval()147  br label %exit148 149exit:150  %p = phi i32 [ 0, %then ], [ %r, %else ]151  store i32 99, ptr %a, align 4152  call void @clobber()153  ret i32 %p154}155 156define i32 @test_captured_before_call_other_blocks_2(i1 %c.1) {157; CHECK-LABEL: @test_captured_before_call_other_blocks_2(158; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4159; CHECK-NEXT:    store i32 55, ptr [[A]], align 4160; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]161; CHECK:       then:162; CHECK-NEXT:    br label [[EXIT:%.*]]163; CHECK:       else:164; CHECK-NEXT:    call void @escape_and_clobber(ptr [[A]])165; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()166; CHECK-NEXT:    br label [[EXIT]]167; CHECK:       exit:168; CHECK-NEXT:    [[P:%.*]] = phi i32 [ 0, [[THEN]] ], [ [[R]], [[ELSE]] ]169; CHECK-NEXT:    store i32 99, ptr [[A]], align 4170; CHECK-NEXT:    call void @clobber()171; CHECK-NEXT:    ret i32 [[P]]172;173  %a = alloca i32, align 4174  store i32 55, ptr %a175  br i1 %c.1, label %then, label %else176 177then:178  br label %exit179 180else:181  call void @escape_and_clobber(ptr %a)182  %r = call i32 @getval()183  br label %exit184 185exit:186  %p = phi i32 [ 0, %then ], [ %r, %else ]187  store i32 99, ptr %a, align 4188  call void @clobber()189  ret i32 %p190}191 192define i32 @test_captured_before_call_other_blocks_4(i1 %c.1) {193; CHECK-LABEL: @test_captured_before_call_other_blocks_4(194; CHECK-NEXT:  entry:195; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4196; CHECK-NEXT:    store i32 55, ptr [[A]], align 4197; CHECK-NEXT:    call void @escape_writeonly(ptr [[A]])198; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()199; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[THEN:%.*]], label [[EXIT:%.*]]200; CHECK:       then:201; CHECK-NEXT:    call void @escape_writeonly(ptr [[A]])202; CHECK-NEXT:    br label [[EXIT]]203; CHECK:       exit:204; CHECK-NEXT:    [[P:%.*]] = phi i32 [ 0, [[THEN]] ], [ [[R]], [[ENTRY:%.*]] ]205; CHECK-NEXT:    store i32 99, ptr [[A]], align 4206; CHECK-NEXT:    call void @clobber()207; CHECK-NEXT:    ret i32 [[P]]208;209entry:210  %a = alloca i32, align 4211  store i32 55, ptr %a212  call void @escape_writeonly(ptr %a)213  %r = call i32 @getval()214  br i1 %c.1, label %then, label %exit215 216then:217  call void @escape_writeonly(ptr %a)218  br label %exit219 220exit:221  %p = phi i32 [ 0, %then ], [ %r, %entry ]222  store i32 99, ptr %a, align 4223  call void @clobber()224  ret i32 %p225}226 227define i32 @test_captured_before_call_other_blocks_5(i1 %c.1) {228; CHECK-LABEL: @test_captured_before_call_other_blocks_5(229; CHECK-NEXT:  entry:230; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4231; CHECK-NEXT:    store i32 55, ptr [[A]], align 4232; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[THEN:%.*]], label [[EXIT:%.*]]233; CHECK:       then:234; CHECK-NEXT:    call void @escape_writeonly(ptr [[A]])235; CHECK-NEXT:    br label [[EXIT]]236; CHECK:       exit:237; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()238; CHECK-NEXT:    store i32 99, ptr [[A]], align 4239; CHECK-NEXT:    call void @clobber()240; CHECK-NEXT:    ret i32 [[R]]241;242entry:243  %a = alloca i32, align 4244  store i32 55, ptr %a245  br i1 %c.1, label %then, label %exit246 247then:248  call void @escape_writeonly(ptr %a)249  br label %exit250 251exit:252  %r = call i32 @getval()253  store i32 99, ptr %a, align 4254  call void @clobber()255  ret i32 %r256}257 258define i32 @test_captured_before_call_other_blocks_6(i1 %c.1) {259; CHECK-LABEL: @test_captured_before_call_other_blocks_6(260; CHECK-NEXT:  entry:261; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4262; CHECK-NEXT:    store i32 55, ptr [[A]], align 4263; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[THEN:%.*]], label [[EXIT:%.*]]264; CHECK:       then:265; CHECK-NEXT:    call void @escape_writeonly(ptr [[A]])266; CHECK-NEXT:    br label [[EXIT]]267; CHECK:       exit:268; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()269; CHECK-NEXT:    store i32 99, ptr [[A]], align 4270; CHECK-NEXT:    call void @escape_writeonly(ptr [[A]])271; CHECK-NEXT:    call void @clobber()272; CHECK-NEXT:    ret i32 [[R]]273;274entry:275  %a = alloca i32, align 4276  store i32 55, ptr %a277  br i1 %c.1, label %then, label %exit278 279then:280  call void @escape_writeonly(ptr %a)281  br label %exit282 283exit:284  %r = call i32 @getval()285  store i32 99, ptr %a, align 4286  call void @escape_writeonly(ptr %a)287  call void @clobber()288  ret i32 %r289}290 291define i32 @test_not_captured_before_call_other_blocks_1(i1 %c.1) {292; CHECK-LABEL: @test_not_captured_before_call_other_blocks_1(293; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4294; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()295; CHECK-NEXT:    store i32 99, ptr [[A]], align 4296; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]297; CHECK:       then:298; CHECK-NEXT:    br label [[EXIT:%.*]]299; CHECK:       else:300; CHECK-NEXT:    br label [[EXIT]]301; CHECK:       exit:302; CHECK-NEXT:    call void @escape_and_clobber(ptr [[A]])303; CHECK-NEXT:    ret i32 [[R]]304;305  %a = alloca i32, align 4306  store i32 55, ptr %a307  %r = call i32 @getval()308  store i32 99, ptr %a, align 4309  br i1 %c.1, label %then, label %else310 311then:312  br label %exit313 314else:315  br label %exit316 317exit:318  call void @escape_and_clobber(ptr %a)319  ret i32 %r320}321 322define i32 @test_not_captured_before_call_other_blocks_2(i1 %c.1) {323; CHECK-LABEL: @test_not_captured_before_call_other_blocks_2(324; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4325; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()326; CHECK-NEXT:    store i32 99, ptr [[A]], align 4327; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]328; CHECK:       then:329; CHECK-NEXT:    call void @escape_and_clobber(ptr [[A]])330; CHECK-NEXT:    br label [[EXIT:%.*]]331; CHECK:       else:332; CHECK-NEXT:    call void @escape_and_clobber(ptr [[A]])333; CHECK-NEXT:    br label [[EXIT]]334; CHECK:       exit:335; CHECK-NEXT:    ret i32 [[R]]336;337  %a = alloca i32, align 4338  store i32 55, ptr %a339  %r = call i32 @getval()340  store i32 99, ptr %a, align 4341  br i1 %c.1, label %then, label %else342 343then:344  call void @escape_and_clobber(ptr %a)345  br label %exit346 347else:348  call void @escape_and_clobber(ptr %a)349  br label %exit350 351exit:352  ret i32 %r353}354 355define i32 @test_not_captured_before_call_other_blocks_3(i1 %c.1) {356; CHECK-LABEL: @test_not_captured_before_call_other_blocks_3(357; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4358; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()359; CHECK-NEXT:    store i32 99, ptr [[A]], align 4360; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]361; CHECK:       then:362; CHECK-NEXT:    call void @escape_and_clobber(ptr [[A]])363; CHECK-NEXT:    br label [[EXIT:%.*]]364; CHECK:       else:365; CHECK-NEXT:    br label [[EXIT]]366; CHECK:       exit:367; CHECK-NEXT:    ret i32 [[R]]368;369  %a = alloca i32, align 4370  store i32 55, ptr %a371  %r = call i32 @getval()372  store i32 99, ptr %a, align 4373  br i1 %c.1, label %then, label %else374 375then:376  call void @escape_and_clobber(ptr %a)377  br label %exit378 379else:380  br label %exit381 382exit:383  ret i32 %r384}385 386define i32 @test_not_captured_before_call_other_blocks_4(i1 %c.1) {387; CHECK-LABEL: @test_not_captured_before_call_other_blocks_4(388; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4389; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]390; CHECK:       then:391; CHECK-NEXT:    br label [[EXIT:%.*]]392; CHECK:       else:393; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()394; CHECK-NEXT:    call void @escape_writeonly(ptr [[A]])395; CHECK-NEXT:    br label [[EXIT]]396; CHECK:       exit:397; CHECK-NEXT:    [[P:%.*]] = phi i32 [ 0, [[THEN]] ], [ [[R]], [[ELSE]] ]398; CHECK-NEXT:    store i32 99, ptr [[A]], align 4399; CHECK-NEXT:    call void @clobber()400; CHECK-NEXT:    ret i32 [[P]]401;402  %a = alloca i32, align 4403  store i32 55, ptr %a404  br i1 %c.1, label %then, label %else405 406then:407  br label %exit408 409else:410  %r = call i32 @getval()411  call void @escape_writeonly(ptr %a)412  br label %exit413 414exit:415  %p = phi i32 [ 0, %then ], [ %r, %else ]416  store i32 99, ptr %a, align 4417  call void @clobber()418  ret i32 %p419}420 421define i32 @test_not_captured_before_call_other_blocks_5(i1 %c.1) {422; CHECK-LABEL: @test_not_captured_before_call_other_blocks_5(423; CHECK-NEXT:  entry:424; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4425; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[THEN:%.*]], label [[EXIT:%.*]]426; CHECK:       then:427; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()428; CHECK-NEXT:    call void @escape_writeonly(ptr [[A]])429; CHECK-NEXT:    br label [[EXIT]]430; CHECK:       exit:431; CHECK-NEXT:    [[P:%.*]] = phi i32 [ [[R]], [[THEN]] ], [ 0, [[ENTRY:%.*]] ]432; CHECK-NEXT:    store i32 99, ptr [[A]], align 4433; CHECK-NEXT:    call void @clobber()434; CHECK-NEXT:    ret i32 [[P]]435;436entry:437  %a = alloca i32, align 4438  store i32 55, ptr %a439  br i1 %c.1, label %then, label %exit440 441then:442  %r = call i32 @getval()443  call void @escape_writeonly(ptr %a)444  br label %exit445 446exit:447  %p = phi i32 [ %r, %then ], [ 0, %entry ]448  store i32 99, ptr %a, align 4449  call void @clobber()450  ret i32 %p451}452 453define i32 @test_not_captured_before_call_other_blocks_6(i1 %c.1) {454; CHECK-LABEL: @test_not_captured_before_call_other_blocks_6(455; CHECK-NEXT:  entry:456; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4457; CHECK-NEXT:    store i32 55, ptr [[A]], align 4458; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[THEN:%.*]], label [[EXIT:%.*]]459; CHECK:       then:460; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()461; CHECK-NEXT:    call void @escape_writeonly(ptr [[A]])462; CHECK-NEXT:    br label [[EXIT]]463; CHECK:       exit:464; CHECK-NEXT:    [[P:%.*]] = phi i32 [ [[R]], [[THEN]] ], [ 0, [[ENTRY:%.*]] ]465; CHECK-NEXT:    store i32 99, ptr [[A]], align 4466; CHECK-NEXT:    call void @escape_writeonly(ptr [[A]])467; CHECK-NEXT:    call void @clobber()468; CHECK-NEXT:    ret i32 [[P]]469;470entry:471  %a = alloca i32, align 4472  store i32 55, ptr %a473  br i1 %c.1, label %then, label %exit474 475then:476  %r = call i32 @getval()477  call void @escape_writeonly(ptr %a)478  br label %exit479 480exit:481  %p = phi i32 [ %r, %then ], [ 0, %entry ]482  store i32 99, ptr %a, align 4483  call void @escape_writeonly(ptr %a)484  call void @clobber()485  ret i32 %p486}487 488define i32 @test_not_captured_before_call_other_blocks_7(i1 %c.1) {489; CHECK-LABEL: @test_not_captured_before_call_other_blocks_7(490; CHECK-NEXT:  entry:491; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4492; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()493; CHECK-NEXT:    call void @escape_writeonly(ptr [[A]])494; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[THEN:%.*]], label [[EXIT:%.*]]495; CHECK:       then:496; CHECK-NEXT:    call void @escape_writeonly(ptr [[A]])497; CHECK-NEXT:    br label [[EXIT]]498; CHECK:       exit:499; CHECK-NEXT:    [[P:%.*]] = phi i32 [ 0, [[THEN]] ], [ [[R]], [[ENTRY:%.*]] ]500; CHECK-NEXT:    store i32 99, ptr [[A]], align 4501; CHECK-NEXT:    call void @clobber()502; CHECK-NEXT:    ret i32 [[P]]503;504entry:505  %a = alloca i32, align 4506  store i32 55, ptr %a507  %r = call i32 @getval()508  call void @escape_writeonly(ptr %a)509  br i1 %c.1, label %then, label %exit510 511then:512  call void @escape_writeonly(ptr %a)513  br label %exit514 515exit:516  %p = phi i32 [ 0, %then ], [ %r, %entry ]517  store i32 99, ptr %a, align 4518  call void @clobber()519  ret i32 %p520}521 522define i32 @test_not_captured_before_call_same_bb_but_read() {523; CHECK-LABEL: @test_not_captured_before_call_same_bb_but_read(524; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4525; CHECK-NEXT:    store i32 55, ptr [[A]], align 4526; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()527; CHECK-NEXT:    [[LV:%.*]] = load i32, ptr [[A]], align 4528; CHECK-NEXT:    store i32 99, ptr [[A]], align 4529; CHECK-NEXT:    call void @escape_and_clobber(ptr [[A]])530; CHECK-NEXT:    [[RES:%.*]] = add i32 [[R]], [[LV]]531; CHECK-NEXT:    ret i32 [[RES]]532;533  %a = alloca i32, align 4534  store i32 55, ptr %a535  %r = call i32 @getval()536  %lv = load i32, ptr %a537  store i32 99, ptr %a, align 4538  call void @escape_and_clobber(ptr %a)539  %res = add i32 %r, %lv540  ret i32 %res541}542 543define i32 @test_captured_after_loop(i1 %c.1) {544; CHECK-LABEL: @test_captured_after_loop(545; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4546; CHECK-NEXT:    br label [[LOOP:%.*]]547; CHECK:       loop:548; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()549; CHECK-NEXT:    store i32 99, ptr [[A]], align 4550; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[LOOP]], label [[EXIT:%.*]]551; CHECK:       exit:552; CHECK-NEXT:    call void @escape_and_clobber(ptr [[A]])553; CHECK-NEXT:    ret i32 [[R]]554;555  %a = alloca i32, align 4556  store i32 55, ptr %a557  br label %loop558 559loop:560  %r = call i32 @getval()561  store i32 99, ptr %a, align 4562  br i1 %c.1, label %loop, label %exit563 564exit:565  call void @escape_and_clobber(ptr %a)566  ret i32 %r567}568 569define i32 @test_captured_in_loop(i1 %c.1) {570; CHECK-LABEL: @test_captured_in_loop(571; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4572; CHECK-NEXT:    store i32 55, ptr [[A]], align 4573; CHECK-NEXT:    br label [[LOOP:%.*]]574; CHECK:       loop:575; CHECK-NEXT:    [[R:%.*]] = call i32 @getval()576; CHECK-NEXT:    call void @escape_writeonly(ptr [[A]])577; CHECK-NEXT:    store i32 99, ptr [[A]], align 4578; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[LOOP]], label [[EXIT:%.*]]579; CHECK:       exit:580; CHECK-NEXT:    call void @escape_and_clobber(ptr [[A]])581; CHECK-NEXT:    ret i32 [[R]]582;583  %a = alloca i32, align 4584  store i32 55, ptr %a585  br label %loop586 587loop:588  %r = call i32 @getval()589  call void @escape_writeonly(ptr %a)590  store i32 99, ptr %a, align 4591  br i1 %c.1, label %loop, label %exit592 593exit:594  call void @escape_and_clobber(ptr %a)595  ret i32 %r596}597 598declare void @llvm.memcpy.p0.p0.i64(ptr, ptr, i64, i1)599define void @test_escaping_store_removed(ptr %src, ptr %escape) {600; CHECK-LABEL: @test_escaping_store_removed(601; CHECK-NEXT:  bb:602; CHECK-NEXT:    [[A:%.*]] = alloca i64, align 8603; CHECK-NEXT:    call void @clobber()604; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[A]], ptr [[SRC:%.*]], i64 8, i1 false)605; CHECK-NEXT:    store ptr [[A]], ptr [[ESCAPE:%.*]], align 8606; CHECK-NEXT:    call void @clobber()607; CHECK-NEXT:    store i64 99, ptr [[A]], align 8608; CHECK-NEXT:    call void @clobber()609; CHECK-NEXT:    ret void610;611bb:612  %a = alloca i64, align 8613  store i64 0, ptr %a614  call void @clobber()615  call void @llvm.memcpy.p0.p0.i64(ptr %a, ptr %src, i64 8, i1 false)616  store ptr %a, ptr %escape, align 8617  store ptr %a, ptr %escape, align 8618  call void @clobber()619  store i64 99, ptr %a620  call void @clobber()621  ret void622}623 624 625define void @test_invoke_captures() personality ptr undef {626; CHECK-LABEL: @test_invoke_captures(627; CHECK-NEXT:  bb:628; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4629; CHECK-NEXT:    invoke void @clobber()630; CHECK-NEXT:    to label [[BB2:%.*]] unwind label [[BB5:%.*]]631; CHECK:       bb2:632; CHECK-NEXT:    store i32 0, ptr [[A]], align 8633; CHECK-NEXT:    invoke void @escape(ptr [[A]])634; CHECK-NEXT:    to label [[BB9:%.*]] unwind label [[BB10:%.*]]635; CHECK:       bb4:636; CHECK-NEXT:    ret void637; CHECK:       bb5:638; CHECK-NEXT:    [[LP_1:%.*]] = landingpad { ptr, i32 }639; CHECK-NEXT:    cleanup640; CHECK-NEXT:    ret void641; CHECK:       bb9:642; CHECK-NEXT:    ret void643; CHECK:       bb10:644; CHECK-NEXT:    [[LP_2:%.*]] = landingpad { ptr, i32 }645; CHECK-NEXT:    cleanup646; CHECK-NEXT:    unreachable647;648bb:649  %a = alloca i32650  store i32 99, ptr %a651  invoke void @clobber()652  to label %bb2 unwind label %bb5653 654bb2:655  store i32 0, ptr %a, align 8656  invoke void @escape(ptr %a)657  to label %bb9 unwind label %bb10658 659bb4:660  ret void661 662bb5:663  %lp.1 = landingpad { ptr, i32 }664  cleanup665  ret void666 667bb9:668  ret void669 670bb10:671  %lp.2 = landingpad { ptr, i32 }672  cleanup673  unreachable674}675 676declare noalias ptr @alloc() nounwind677declare i32 @getval_nounwind() nounwind678 679define i32 @test_not_captured_before_load_same_bb_noalias_call() {680; CHECK-LABEL: @test_not_captured_before_load_same_bb_noalias_call(681; CHECK-NEXT:    [[A:%.*]] = call ptr @alloc()682; CHECK-NEXT:    [[R:%.*]] = call i32 @getval_nounwind()683; CHECK-NEXT:    store i32 99, ptr [[A]], align 4684; CHECK-NEXT:    call void @escape_and_clobber(ptr [[A]])685; CHECK-NEXT:    ret i32 [[R]]686;687  %a = call ptr @alloc()688  store i32 55, ptr %a689  %r = call i32 @getval_nounwind()690  store i32 99, ptr %a, align 4691  call void @escape_and_clobber(ptr %a)692  ret i32 %r693}694 695define i32 @test_not_captured_before_load_same_bb_noalias_arg(ptr noalias %a) {696; CHECK-LABEL: @test_not_captured_before_load_same_bb_noalias_arg(697; CHECK-NEXT:    [[R:%.*]] = call i32 @getval_nounwind()698; CHECK-NEXT:    store i32 99, ptr [[A:%.*]], align 4699; CHECK-NEXT:    call void @escape_and_clobber(ptr [[A]])700; CHECK-NEXT:    ret i32 [[R]]701;702  store i32 55, ptr %a703  %r = call i32 @getval_nounwind()704  store i32 99, ptr %a, align 4705  call void @escape_and_clobber(ptr %a)706  ret i32 %r707}708