142 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -S -passes='move-auto-init' -verify-memoryssa | 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"5 6define void @foo(i32 %x) {7; CHECK-LABEL: @foo(8; CHECK-NEXT: entry:9; CHECK-NEXT: [[BUFFER:%.*]] = alloca [80 x i32], align 1610; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 16 [[BUFFER]], i8 -86, i64 320, i1 false), !annotation [[META0:![0-9]+]]11; CHECK-NEXT: br label [[DO_BODY:%.*]]12; CHECK: do.body:13; CHECK-NEXT: [[X_ADDR_0:%.*]] = phi i32 [ [[X:%.*]], [[ENTRY:%.*]] ], [ [[DEC:%.*]], [[DO_COND:%.*]] ]14; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [80 x i32], ptr [[BUFFER]], i64 0, i64 015; CHECK-NEXT: call void @dump(ptr [[ARRAYIDX]])16; CHECK-NEXT: br label [[DO_COND]]17; CHECK: do.cond:18; CHECK-NEXT: [[DEC]] = add nsw i32 [[X_ADDR_0]], -119; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[X_ADDR_0]], 020; CHECK-NEXT: br i1 [[TOBOOL]], label [[DO_BODY]], label [[DO_END:%.*]]21; CHECK: do.end:22; CHECK-NEXT: ret void23;24 25entry:26 %buffer = alloca [80 x i32], align 1627 call void @llvm.memset.p0.i64(ptr align 16 %buffer, i8 -86, i64 320, i1 false), !annotation !028 br label %do.body29 30do.body: ; preds = %do.cond, %entry31 %x.addr.0 = phi i32 [ %x, %entry ], [ %dec, %do.cond ]32 %arrayidx = getelementptr inbounds [80 x i32], ptr %buffer, i64 0, i64 033 call void @dump(ptr %arrayidx)34 br label %do.cond35 36do.cond: ; preds = %do.body37 %dec = add nsw i32 %x.addr.0, -138 %tobool = icmp ne i32 %x.addr.0, 039 br i1 %tobool, label %do.body, label %do.end40 41do.end: ; preds = %do.cond42 ret void43}44 45declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg)46 47declare void @dump(ptr )48 49define void @bar(i32 %x, i32 %y) {50; CHECK-LABEL: @bar(51; CHECK-NEXT: entry:52; CHECK-NEXT: [[BUFFER:%.*]] = alloca [80 x i32], align 1653; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[Y:%.*]], 054; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]55; CHECK: if.then:56; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 16 [[BUFFER]], i8 -86, i64 320, i1 false), !annotation [[META0]]57; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[X:%.*]], [[Y]]58; CHECK-NEXT: br label [[DO_BODY:%.*]]59; CHECK: do.body:60; CHECK-NEXT: [[X_ADDR_0:%.*]] = phi i32 [ [[ADD]], [[IF_THEN]] ], [ [[DEC:%.*]], [[DO_COND:%.*]] ]61; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [80 x i32], ptr [[BUFFER]], i64 0, i64 062; CHECK-NEXT: call void @dump(ptr [[ARRAYIDX]])63; CHECK-NEXT: br label [[DO_COND]]64; CHECK: do.cond:65; CHECK-NEXT: [[DEC]] = add nsw i32 [[X_ADDR_0]], -166; CHECK-NEXT: [[TOBOOL1:%.*]] = icmp ne i32 [[X_ADDR_0]], 067; CHECK-NEXT: br i1 [[TOBOOL1]], label [[DO_BODY]], label [[DO_END:%.*]]68; CHECK: do.end:69; CHECK-NEXT: br label [[IF_END]]70; CHECK: if.end:71; CHECK-NEXT: ret void72;73 74entry:75 %buffer = alloca [80 x i32], align 1676 call void @llvm.memset.p0.i64(ptr align 16 %buffer, i8 -86, i64 320, i1 false), !annotation !077 %tobool = icmp ne i32 %y, 078 br i1 %tobool, label %if.then, label %if.end79 80if.then: ; preds = %entry81 %add = add nsw i32 %x, %y82 br label %do.body83 84do.body: ; preds = %do.cond, %if.then85 %x.addr.0 = phi i32 [ %add, %if.then ], [ %dec, %do.cond ]86 %arrayidx = getelementptr inbounds [80 x i32], ptr %buffer, i64 0, i64 087 call void @dump(ptr %arrayidx)88 br label %do.cond89 90do.cond: ; preds = %do.body91 %dec = add nsw i32 %x.addr.0, -192 %tobool1 = icmp ne i32 %x.addr.0, 093 br i1 %tobool1, label %do.body, label %do.end94 95do.end: ; preds = %do.cond96 br label %if.end97 98if.end: ; preds = %do.end, %entry99 ret void100}101 102declare void @dummy()103 104define void @unreachable_pred() {105; CHECK-LABEL: @unreachable_pred(106; CHECK-NEXT: entry:107; CHECK-NEXT: [[P:%.*]] = alloca [2 x i16], i32 0, align 2108; CHECK-NEXT: store i32 0, ptr [[P]], align 2, !annotation [[META0]]109; CHECK-NEXT: br i1 true, label [[LOOP:%.*]], label [[USEBB:%.*]]110; CHECK: loop:111; CHECK-NEXT: call void @dummy()112; CHECK-NEXT: br label [[LOOP]]113; CHECK: a:114; CHECK-NEXT: br label [[LOOP]]115; CHECK: b:116; CHECK-NEXT: br label [[LOOP]]117; CHECK: usebb:118; CHECK-NEXT: [[USE_P:%.*]] = icmp ult ptr null, [[P]]119; CHECK-NEXT: ret void120;121entry:122 %p = alloca [2 x i16], i32 0, align 2123 store i32 0, ptr %p, align 2, !annotation !0124 br i1 true, label %loop, label %usebb125 126loop:127 call void @dummy()128 br label %loop129 130a:131 br label %loop132 133b:134 br label %loop135 136usebb:137 %use_p = icmp ult ptr null, %p138 ret void139}140 141!0 = !{!"auto-init"}142