316 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes='sroa<preserve-cfg>' -S | FileCheck %s --check-prefixes=CHECK,CHECK-PRESERVE-CFG3; RUN: opt < %s -passes='sroa<modify-cfg>' -S | FileCheck %s --check-prefixes=CHECK,CHECK-MODIFY-CFG4target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n8:16:32:64"5 6@a = external global i16, align 17 8declare void @maybe_writes()9 10define void @f2(i1 %c1) {11; CHECK-LABEL: @f2(12; CHECK-NEXT: entry:13; CHECK-NEXT: br i1 [[C1:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]14; CHECK: if.then:15; CHECK-NEXT: br label [[CLEANUP:%.*]]16; CHECK: cleanup:17; CHECK-NEXT: [[G_0_SROA_SPECULATE_LOAD_CLEANUP:%.*]] = load i16, ptr @a, align 118; CHECK-NEXT: switch i32 2, label [[CLEANUP7:%.*]] [19; CHECK-NEXT: i32 0, label [[LBL1:%.*]]20; CHECK-NEXT: i32 2, label [[LBL1]]21; CHECK-NEXT: ]22; CHECK: if.else:23; CHECK-NEXT: br label [[LBL1]]24; CHECK: lbl1:25; CHECK-NEXT: [[G_0_SROA_SPECULATED:%.*]] = phi i16 [ [[G_0_SROA_SPECULATE_LOAD_CLEANUP]], [[CLEANUP]] ], [ [[G_0_SROA_SPECULATE_LOAD_CLEANUP]], [[CLEANUP]] ], [ undef, [[IF_ELSE]] ]26; CHECK-NEXT: unreachable27; CHECK: cleanup7:28; CHECK-NEXT: ret void29;30entry:31 %e = alloca i16, align 132 br i1 %c1, label %if.then, label %if.else33 34if.then: ; preds = %entry35 br label %cleanup36 37cleanup: ; preds = %if.then38 switch i32 2, label %cleanup7 [39 i32 0, label %lbl140 i32 2, label %lbl141 ]42 43if.else: ; preds = %entry44 br label %lbl145 46lbl1: ; preds = %if.else, %cleanup, %cleanup47 %g.0 = phi ptr [ @a, %cleanup ], [ @a, %cleanup ], [ %e, %if.else ]48 %0 = load i16, ptr %g.0, align 149 unreachable50 51cleanup7: ; preds = %cleanup52 ret void53}54 55define void @f2_hwasan(i1 %c1) sanitize_hwaddress {56; CHECK-LABEL: @f2_hwasan(57; CHECK-NEXT: entry:58; CHECK-NEXT: [[E:%.*]] = alloca i16, align 159; CHECK-NEXT: br i1 [[C1:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]60; CHECK: if.then:61; CHECK-NEXT: br label [[CLEANUP:%.*]]62; CHECK: cleanup:63; CHECK-NEXT: switch i32 2, label [[CLEANUP7:%.*]] [64; CHECK-NEXT: i32 0, label [[LBL1:%.*]]65; CHECK-NEXT: i32 2, label [[LBL1]]66; CHECK-NEXT: ]67; CHECK: if.else:68; CHECK-NEXT: br label [[LBL1]]69; CHECK: lbl1:70; CHECK-NEXT: [[G_0:%.*]] = phi ptr [ @a, [[CLEANUP]] ], [ @a, [[CLEANUP]] ], [ [[E]], [[IF_ELSE]] ]71; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[G_0]], align 172; CHECK-NEXT: unreachable73; CHECK: cleanup7:74; CHECK-NEXT: ret void75;76entry:77 %e = alloca i16, align 178 br i1 %c1, label %if.then, label %if.else79 80if.then: ; preds = %entry81 br label %cleanup82 83cleanup: ; preds = %if.then84 switch i32 2, label %cleanup7 [85 i32 0, label %lbl186 i32 2, label %lbl187 ]88 89if.else: ; preds = %entry90 br label %lbl191 92lbl1: ; preds = %if.else, %cleanup, %cleanup93 %g.0 = phi ptr [ @a, %cleanup ], [ @a, %cleanup ], [ %e, %if.else ]94 %0 = load i16, ptr %g.0, align 195 unreachable96 97cleanup7: ; preds = %cleanup98 ret void99}100 101define void @f3(i1 %c1) {102; CHECK-LABEL: @f3(103; CHECK-NEXT: entry:104; CHECK-NEXT: [[E:%.*]] = alloca i16, align 1105; CHECK-NEXT: br i1 [[C1:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]106; CHECK: if.then:107; CHECK-NEXT: br label [[CLEANUP:%.*]]108; CHECK: cleanup:109; CHECK-NEXT: switch i32 2, label [[CLEANUP7:%.*]] [110; CHECK-NEXT: i32 0, label [[LBL1:%.*]]111; CHECK-NEXT: i32 2, label [[LBL1]]112; CHECK-NEXT: ]113; CHECK: if.else:114; CHECK-NEXT: br label [[LBL1]]115; CHECK: lbl1:116; CHECK-NEXT: [[G_0:%.*]] = phi ptr [ @a, [[CLEANUP]] ], [ @a, [[CLEANUP]] ], [ [[E]], [[IF_ELSE]] ]117; CHECK-NEXT: br label [[FINAL:%.*]]118; CHECK: final:119; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[G_0]], align 1120; CHECK-NEXT: unreachable121; CHECK: cleanup7:122; CHECK-NEXT: ret void123;124entry:125 %e = alloca i16, align 1126 br i1 %c1, label %if.then, label %if.else127 128if.then: ; preds = %entry129 br label %cleanup130 131cleanup: ; preds = %if.then132 switch i32 2, label %cleanup7 [133 i32 0, label %lbl1134 i32 2, label %lbl1135 ]136 137if.else: ; preds = %entry138 br label %lbl1139 140lbl1: ; preds = %if.else, %cleanup, %cleanup141 %g.0 = phi ptr [ @a, %cleanup ], [ @a, %cleanup ], [ %e, %if.else ]142 br label %final143 144final:145 %0 = load i16, ptr %g.0, align 1146 unreachable147 148cleanup7: ; preds = %cleanup149 ret void150}151 152define void @f4(i1 %c1) {153; CHECK-LABEL: @f4(154; CHECK-NEXT: entry:155; CHECK-NEXT: [[E:%.*]] = alloca i16, align 1156; CHECK-NEXT: br i1 [[C1:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]157; CHECK: if.then:158; CHECK-NEXT: br label [[CLEANUP:%.*]]159; CHECK: cleanup:160; CHECK-NEXT: switch i32 2, label [[CLEANUP7:%.*]] [161; CHECK-NEXT: i32 0, label [[LBL1:%.*]]162; CHECK-NEXT: i32 2, label [[LBL1]]163; CHECK-NEXT: ]164; CHECK: if.else:165; CHECK-NEXT: br label [[LBL1]]166; CHECK: lbl1:167; CHECK-NEXT: [[G_0:%.*]] = phi ptr [ @a, [[CLEANUP]] ], [ @a, [[CLEANUP]] ], [ [[E]], [[IF_ELSE]] ]168; CHECK-NEXT: br label [[FINAL:%.*]]169; CHECK: final:170; CHECK-NEXT: call void @maybe_writes()171; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[G_0]], align 1172; CHECK-NEXT: unreachable173; CHECK: cleanup7:174; CHECK-NEXT: ret void175;176entry:177 %e = alloca i16, align 1178 br i1 %c1, label %if.then, label %if.else179 180if.then: ; preds = %entry181 br label %cleanup182 183cleanup: ; preds = %if.then184 switch i32 2, label %cleanup7 [185 i32 0, label %lbl1186 i32 2, label %lbl1187 ]188 189if.else: ; preds = %entry190 br label %lbl1191 192lbl1: ; preds = %if.else, %cleanup, %cleanup193 %g.0 = phi ptr [ @a, %cleanup ], [ @a, %cleanup ], [ %e, %if.else ]194 br label %final195 196final:197 call void @maybe_writes()198 %0 = load i16, ptr %g.0, align 1199 unreachable200 201cleanup7: ; preds = %cleanup202 ret void203}204 205define void @f5(i1 %c1, i1 %c2) {206; CHECK-LABEL: @f5(207; CHECK-NEXT: entry:208; CHECK-NEXT: [[E:%.*]] = alloca i16, align 1209; CHECK-NEXT: br i1 [[C1:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]210; CHECK: if.then:211; CHECK-NEXT: br label [[CLEANUP:%.*]]212; CHECK: cleanup:213; CHECK-NEXT: switch i32 2, label [[CLEANUP7:%.*]] [214; CHECK-NEXT: i32 0, label [[LBL1:%.*]]215; CHECK-NEXT: i32 2, label [[LBL1]]216; CHECK-NEXT: ]217; CHECK: if.else:218; CHECK-NEXT: br label [[LBL1]]219; CHECK: lbl1:220; CHECK-NEXT: [[G_0:%.*]] = phi ptr [ @a, [[CLEANUP]] ], [ @a, [[CLEANUP]] ], [ [[E]], [[IF_ELSE]] ]221; CHECK-NEXT: br i1 [[C2:%.*]], label [[FINAL:%.*]], label [[CLEANUP7]]222; CHECK: final:223; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[G_0]], align 1224; CHECK-NEXT: unreachable225; CHECK: cleanup7:226; CHECK-NEXT: ret void227;228entry:229 %e = alloca i16, align 1230 br i1 %c1, label %if.then, label %if.else231 232if.then: ; preds = %entry233 br label %cleanup234 235cleanup: ; preds = %if.then236 switch i32 2, label %cleanup7 [237 i32 0, label %lbl1238 i32 2, label %lbl1239 ]240 241if.else: ; preds = %entry242 br label %lbl1243 244lbl1: ; preds = %if.else, %cleanup, %cleanup245 %g.0 = phi ptr [ @a, %cleanup ], [ @a, %cleanup ], [ %e, %if.else ]246 br i1 %c2, label %final, label %cleanup7247 248final:249 %0 = load i16, ptr %g.0, align 1250 unreachable251 252cleanup7: ; preds = %cleanup253 ret void254}255 256define void @f6(i1 %c1) {257; CHECK-LABEL: @f6(258; CHECK-NEXT: entry:259; CHECK-NEXT: [[E:%.*]] = alloca i16, align 1260; CHECK-NEXT: br i1 [[C1:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]261; CHECK: if.then:262; CHECK-NEXT: br label [[CLEANUP:%.*]]263; CHECK: cleanup:264; CHECK-NEXT: switch i32 2, label [[CLEANUP7:%.*]] [265; CHECK-NEXT: i32 0, label [[LBL1:%.*]]266; CHECK-NEXT: i32 2, label [[LBL1]]267; CHECK-NEXT: ]268; CHECK: if.else:269; CHECK-NEXT: br label [[LBL1]]270; CHECK: lbl1:271; CHECK-NEXT: [[G_0:%.*]] = phi ptr [ @a, [[CLEANUP]] ], [ @a, [[CLEANUP]] ], [ [[E]], [[IF_ELSE]] ]272; CHECK-NEXT: br label [[FINAL:%.*]]273; CHECK: unreachable_pred:274; CHECK-NEXT: br label [[FINAL]]275; CHECK: final:276; CHECK-NEXT: call void @maybe_writes()277; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[G_0]], align 1278; CHECK-NEXT: unreachable279; CHECK: cleanup7:280; CHECK-NEXT: ret void281;282entry:283 %e = alloca i16, align 1284 br i1 %c1, label %if.then, label %if.else285 286if.then: ; preds = %entry287 br label %cleanup288 289cleanup: ; preds = %if.then290 switch i32 2, label %cleanup7 [291 i32 0, label %lbl1292 i32 2, label %lbl1293 ]294 295if.else: ; preds = %entry296 br label %lbl1297 298lbl1: ; preds = %if.else, %cleanup, %cleanup299 %g.0 = phi ptr [ @a, %cleanup ], [ @a, %cleanup ], [ %e, %if.else ]300 br label %final301 302unreachable_pred:303 br label %final304 305final:306 call void @maybe_writes()307 %0 = load i16, ptr %g.0, align 1308 unreachable309 310cleanup7: ; preds = %cleanup311 ret void312}313;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:314; CHECK-MODIFY-CFG: {{.*}}315; CHECK-PRESERVE-CFG: {{.*}}316