brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.7 KiB · 19c5700 Raw
313 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes='loop-mssa(licm)' < %s | FileCheck %s3 4declare i1 @cond(i32 %v) readnone5declare ptr @capture(ptr %p) readnone6 7define void @test_captured_after_loop(i32 %len) {8; CHECK-LABEL: @test_captured_after_loop(9; CHECK-NEXT:  entry:10; CHECK-NEXT:    [[COUNT:%.*]] = alloca i32, align 411; CHECK-NEXT:    store i32 0, ptr [[COUNT]], align 412; CHECK-NEXT:    [[COUNT_PROMOTED:%.*]] = load i32, ptr [[COUNT]], align 413; CHECK-NEXT:    br label [[LOOP:%.*]]14; CHECK:       loop:15; CHECK-NEXT:    [[C_INC2:%.*]] = phi i32 [ [[COUNT_PROMOTED]], [[ENTRY:%.*]] ], [ [[C_INC1:%.*]], [[LATCH:%.*]] ]16; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[I_NEXT:%.*]], [[LATCH]] ]17; CHECK-NEXT:    [[COND:%.*]] = call i1 @cond(i32 [[I]])18; CHECK-NEXT:    br i1 [[COND]], label [[IF:%.*]], label [[LATCH]]19; CHECK:       if:20; CHECK-NEXT:    [[C_INC:%.*]] = add i32 [[C_INC2]], 121; CHECK-NEXT:    br label [[LATCH]]22; CHECK:       latch:23; CHECK-NEXT:    [[C_INC1]] = phi i32 [ [[C_INC]], [[IF]] ], [ [[C_INC2]], [[LOOP]] ]24; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 125; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I_NEXT]], [[LEN:%.*]]26; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]27; CHECK:       exit:28; CHECK-NEXT:    [[C_INC1_LCSSA:%.*]] = phi i32 [ [[C_INC1]], [[LATCH]] ]29; CHECK-NEXT:    store i32 [[C_INC1_LCSSA]], ptr [[COUNT]], align 430; CHECK-NEXT:    [[TMP0:%.*]] = call ptr @capture(ptr [[COUNT]])31; CHECK-NEXT:    ret void32;33entry:34  %count = alloca i3235  store i32 0, ptr %count36  br label %loop37 38loop:39  %i = phi i32 [ 0, %entry ], [ %i.next, %latch ]40  %cond = call i1 @cond(i32 %i)41  br i1 %cond, label %if, label %latch42 43if:44  %c = load i32, ptr %count45  %c.inc = add i32 %c, 146  store i32 %c.inc, ptr %count47  br label %latch48 49latch:50  %i.next = add nuw i32 %i, 151  %cmp = icmp eq i32 %i.next, %len52  br i1 %cmp, label %exit, label %loop53 54exit:55  call ptr @capture(ptr %count)56  ret void57}58 59define void @test_captured_in_loop(i32 %len) {60; CHECK-LABEL: @test_captured_in_loop(61; CHECK-NEXT:  entry:62; CHECK-NEXT:    [[COUNT:%.*]] = alloca i32, align 463; CHECK-NEXT:    store i32 0, ptr [[COUNT]], align 464; CHECK-NEXT:    [[COUNT_PROMOTED:%.*]] = load i32, ptr [[COUNT]], align 465; CHECK-NEXT:    br label [[LOOP:%.*]]66; CHECK:       loop:67; CHECK-NEXT:    [[C_INC2:%.*]] = phi i32 [ [[COUNT_PROMOTED]], [[ENTRY:%.*]] ], [ [[C_INC1:%.*]], [[LATCH:%.*]] ]68; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[I_NEXT:%.*]], [[LATCH]] ]69; CHECK-NEXT:    [[COND:%.*]] = call i1 @cond(i32 [[I]])70; CHECK-NEXT:    br i1 [[COND]], label [[IF:%.*]], label [[LATCH]]71; CHECK:       if:72; CHECK-NEXT:    [[C_INC:%.*]] = add i32 [[C_INC2]], 173; CHECK-NEXT:    store i32 [[C_INC]], ptr [[COUNT]], align 474; CHECK-NEXT:    [[TMP0:%.*]] = call ptr @capture(ptr [[COUNT]])75; CHECK-NEXT:    br label [[LATCH]]76; CHECK:       latch:77; CHECK-NEXT:    [[C_INC1]] = phi i32 [ [[C_INC]], [[IF]] ], [ [[C_INC2]], [[LOOP]] ]78; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 179; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I_NEXT]], [[LEN:%.*]]80; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]81; CHECK:       exit:82; CHECK-NEXT:    ret void83;84entry:85  %count = alloca i3286  store i32 0, ptr %count87  br label %loop88 89loop:90  %i = phi i32 [ 0, %entry ], [ %i.next, %latch ]91  %cond = call i1 @cond(i32 %i)92  br i1 %cond, label %if, label %latch93 94if:95  %c = load i32, ptr %count96  %c.inc = add i32 %c, 197  store i32 %c.inc, ptr %count98  call ptr @capture(ptr %count)99  br label %latch100 101latch:102  %i.next = add nuw i32 %i, 1103  %cmp = icmp eq i32 %i.next, %len104  br i1 %cmp, label %exit, label %loop105 106exit:107  ret void108}109 110define void @test_captured_before_loop(i32 %len) {111; CHECK-LABEL: @test_captured_before_loop(112; CHECK-NEXT:  entry:113; CHECK-NEXT:    [[COUNT:%.*]] = alloca i32, align 4114; CHECK-NEXT:    store i32 0, ptr [[COUNT]], align 4115; CHECK-NEXT:    [[TMP0:%.*]] = call ptr @capture(ptr [[COUNT]])116; CHECK-NEXT:    [[COUNT_PROMOTED:%.*]] = load i32, ptr [[COUNT]], align 4117; CHECK-NEXT:    br label [[LOOP:%.*]]118; CHECK:       loop:119; CHECK-NEXT:    [[C_INC2:%.*]] = phi i32 [ [[COUNT_PROMOTED]], [[ENTRY:%.*]] ], [ [[C_INC1:%.*]], [[LATCH:%.*]] ]120; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[I_NEXT:%.*]], [[LATCH]] ]121; CHECK-NEXT:    [[COND:%.*]] = call i1 @cond(i32 [[I]])122; CHECK-NEXT:    br i1 [[COND]], label [[IF:%.*]], label [[LATCH]]123; CHECK:       if:124; CHECK-NEXT:    [[C_INC:%.*]] = add i32 [[C_INC2]], 1125; CHECK-NEXT:    store i32 [[C_INC]], ptr [[COUNT]], align 4126; CHECK-NEXT:    br label [[LATCH]]127; CHECK:       latch:128; CHECK-NEXT:    [[C_INC1]] = phi i32 [ [[C_INC]], [[IF]] ], [ [[C_INC2]], [[LOOP]] ]129; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 1130; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I_NEXT]], [[LEN:%.*]]131; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]132; CHECK:       exit:133; CHECK-NEXT:    ret void134;135entry:136  %count = alloca i32137  store i32 0, ptr %count138  call ptr @capture(ptr %count)139  br label %loop140 141loop:142  %i = phi i32 [ 0, %entry ], [ %i.next, %latch ]143  %cond = call i1 @cond(i32 %i)144  br i1 %cond, label %if, label %latch145 146if:147  %c = load i32, ptr %count148  %c.inc = add i32 %c, 1149  store i32 %c.inc, ptr %count150  br label %latch151 152latch:153  %i.next = add nuw i32 %i, 1154  %cmp = icmp eq i32 %i.next, %len155  br i1 %cmp, label %exit, label %loop156 157exit:158  ret void159}160 161define void @test_captured_before_loop_address_only(i32 %len) {162; CHECK-LABEL: @test_captured_before_loop_address_only(163; CHECK-NEXT:  entry:164; CHECK-NEXT:    [[COUNT:%.*]] = alloca i32, align 4165; CHECK-NEXT:    store i32 0, ptr [[COUNT]], align 4166; CHECK-NEXT:    [[TMP0:%.*]] = call ptr @capture(ptr captures(address) [[COUNT]])167; CHECK-NEXT:    [[COUNT_PROMOTED:%.*]] = load i32, ptr [[COUNT]], align 4168; CHECK-NEXT:    br label [[LOOP:%.*]]169; CHECK:       loop:170; CHECK-NEXT:    [[C_INC2:%.*]] = phi i32 [ [[COUNT_PROMOTED]], [[ENTRY:%.*]] ], [ [[C_INC1:%.*]], [[LATCH:%.*]] ]171; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[I_NEXT:%.*]], [[LATCH]] ]172; CHECK-NEXT:    [[COND:%.*]] = call i1 @cond(i32 [[I]])173; CHECK-NEXT:    br i1 [[COND]], label [[IF:%.*]], label [[LATCH]]174; CHECK:       if:175; CHECK-NEXT:    [[C_INC:%.*]] = add i32 [[C_INC2]], 1176; CHECK-NEXT:    br label [[LATCH]]177; CHECK:       latch:178; CHECK-NEXT:    [[C_INC1]] = phi i32 [ [[C_INC]], [[IF]] ], [ [[C_INC2]], [[LOOP]] ]179; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 1180; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I_NEXT]], [[LEN:%.*]]181; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]182; CHECK:       exit:183; CHECK-NEXT:    [[C_INC1_LCSSA:%.*]] = phi i32 [ [[C_INC1]], [[LATCH]] ]184; CHECK-NEXT:    store i32 [[C_INC1_LCSSA]], ptr [[COUNT]], align 4185; CHECK-NEXT:    ret void186;187entry:188  %count = alloca i32189  store i32 0, ptr %count190  call ptr @capture(ptr captures(address) %count)191  br label %loop192 193loop:194  %i = phi i32 [ 0, %entry ], [ %i.next, %latch ]195  %cond = call i1 @cond(i32 %i)196  br i1 %cond, label %if, label %latch197 198if:199  %c = load i32, ptr %count200  %c.inc = add i32 %c, 1201  store i32 %c.inc, ptr %count202  br label %latch203 204latch:205  %i.next = add nuw i32 %i, 1206  %cmp = icmp eq i32 %i.next, %len207  br i1 %cmp, label %exit, label %loop208 209exit:210  ret void211}212 213; Should not get promoted, because the pointer is captured and may not214; be thread-local.215define void @test_captured_before_loop_byval(ptr byval(i32) align 4 %count, i32 %len) {216; CHECK-LABEL: @test_captured_before_loop_byval(217; CHECK-NEXT:  entry:218; CHECK-NEXT:    store i32 0, ptr [[COUNT:%.*]], align 4219; CHECK-NEXT:    [[TMP0:%.*]] = call ptr @capture(ptr [[COUNT]])220; CHECK-NEXT:    [[COUNT_PROMOTED:%.*]] = load i32, ptr [[COUNT]], align 4221; CHECK-NEXT:    br label [[LOOP:%.*]]222; CHECK:       loop:223; CHECK-NEXT:    [[C_INC2:%.*]] = phi i32 [ [[COUNT_PROMOTED]], [[ENTRY:%.*]] ], [ [[C_INC1:%.*]], [[LATCH:%.*]] ]224; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[I_NEXT:%.*]], [[LATCH]] ]225; CHECK-NEXT:    [[COND:%.*]] = call i1 @cond(i32 [[I]])226; CHECK-NEXT:    br i1 [[COND]], label [[IF:%.*]], label [[LATCH]]227; CHECK:       if:228; CHECK-NEXT:    [[C_INC:%.*]] = add i32 [[C_INC2]], 1229; CHECK-NEXT:    store i32 [[C_INC]], ptr [[COUNT]], align 4230; CHECK-NEXT:    br label [[LATCH]]231; CHECK:       latch:232; CHECK-NEXT:    [[C_INC1]] = phi i32 [ [[C_INC]], [[IF]] ], [ [[C_INC2]], [[LOOP]] ]233; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 1234; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I_NEXT]], [[LEN:%.*]]235; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]236; CHECK:       exit:237; CHECK-NEXT:    ret void238;239entry:240  store i32 0, ptr %count241  call ptr @capture(ptr %count)242  br label %loop243 244loop:245  %i = phi i32 [ 0, %entry ], [ %i.next, %latch ]246  %cond = call i1 @cond(i32 %i)247  br i1 %cond, label %if, label %latch248 249if:250  %c = load i32, ptr %count251  %c.inc = add i32 %c, 1252  store i32 %c.inc, ptr %count253  br label %latch254 255latch:256  %i.next = add nuw i32 %i, 1257  %cmp = icmp eq i32 %i.next, %len258  br i1 %cmp, label %exit, label %loop259 260exit:261  ret void262}263 264define void @test_captured_after_loop_byval(ptr byval(i32) align 4 %count, i32 %len) {265; CHECK-LABEL: @test_captured_after_loop_byval(266; CHECK-NEXT:  entry:267; CHECK-NEXT:    store i32 0, ptr [[COUNT:%.*]], align 4268; CHECK-NEXT:    [[COUNT_PROMOTED:%.*]] = load i32, ptr [[COUNT]], align 4269; CHECK-NEXT:    br label [[LOOP:%.*]]270; CHECK:       loop:271; CHECK-NEXT:    [[C_INC2:%.*]] = phi i32 [ [[COUNT_PROMOTED]], [[ENTRY:%.*]] ], [ [[C_INC1:%.*]], [[LATCH:%.*]] ]272; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[I_NEXT:%.*]], [[LATCH]] ]273; CHECK-NEXT:    [[COND:%.*]] = call i1 @cond(i32 [[I]])274; CHECK-NEXT:    br i1 [[COND]], label [[IF:%.*]], label [[LATCH]]275; CHECK:       if:276; CHECK-NEXT:    [[C_INC:%.*]] = add i32 [[C_INC2]], 1277; CHECK-NEXT:    br label [[LATCH]]278; CHECK:       latch:279; CHECK-NEXT:    [[C_INC1]] = phi i32 [ [[C_INC]], [[IF]] ], [ [[C_INC2]], [[LOOP]] ]280; CHECK-NEXT:    [[I_NEXT]] = add nuw i32 [[I]], 1281; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I_NEXT]], [[LEN:%.*]]282; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]283; CHECK:       exit:284; CHECK-NEXT:    [[C_INC1_LCSSA:%.*]] = phi i32 [ [[C_INC1]], [[LATCH]] ]285; CHECK-NEXT:    store i32 [[C_INC1_LCSSA]], ptr [[COUNT]], align 4286; CHECK-NEXT:    [[TMP0:%.*]] = call ptr @capture(ptr [[COUNT]])287; CHECK-NEXT:    ret void288;289entry:290  store i32 0, ptr %count291  br label %loop292 293loop:294  %i = phi i32 [ 0, %entry ], [ %i.next, %latch ]295  %cond = call i1 @cond(i32 %i)296  br i1 %cond, label %if, label %latch297 298if:299  %c = load i32, ptr %count300  %c.inc = add i32 %c, 1301  store i32 %c.inc, ptr %count302  br label %latch303 304latch:305  %i.next = add nuw i32 %i, 1306  %cmp = icmp eq i32 %i.next, %len307  br i1 %cmp, label %exit, label %loop308 309exit:310  call ptr @capture(ptr %count)311  ret void312}313