142 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=newgvn -S | FileCheck %s3; REQUIRES: asserts4 5target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"6target triple = "x86_64-grtev4-linux-gnu"7 8define hidden void @barrier() align 2 {9; CHECK-LABEL: @barrier(10; CHECK-NEXT: entry:11; CHECK-NEXT: [[CALLG:%.*]] = tail call i64 @g()12; CHECK-NEXT: [[SEL:%.*]] = select i1 undef, i64 0, i64 [[CALLG]]13; CHECK-NEXT: [[LOADED:%.*]] = load i64, ptr null, align 814; CHECK-NEXT: [[ADD:%.*]] = add i64 [[LOADED]], 115; CHECK-NEXT: [[SHR17:%.*]] = lshr i64 [[ADD]], 116; CHECK-NEXT: [[SUB:%.*]] = add nsw i64 [[SHR17]], -117; CHECK-NEXT: br label [[FIRST:%.*]]18; CHECK: first:19; CHECK-NEXT: [[PHI_ONE:%.*]] = phi i64 [ [[SEL]], [[ENTRY:%.*]] ], [ 0, [[FIRST]] ], [ 0, [[THIRD:%.*]] ]20; CHECK-NEXT: [[CMP_PHI1_SUB:%.*]] = icmp eq i64 [[PHI_ONE]], [[SUB]]21; CHECK-NEXT: br i1 [[CMP_PHI1_SUB]], label [[SECOND:%.*]], label [[FIRST]]22; CHECK: second:23; CHECK-NEXT: br label [[THIRD]]24; CHECK: third:25; CHECK-NEXT: br i1 false, label [[SECOND]], label [[FIRST]]26;27entry:28 %callg = tail call i64 @g()29 %sel = select i1 undef, i64 0, i64 %callg30 31 %loaded = load i64, ptr null, align 832 %add = add i64 %loaded, 133 %shr17 = lshr i64 %add, 134 %sub = add nsw i64 %shr17, -135 36 br label %first37 38first:39 %phi_one = phi i64 [ %sel, %entry ], [ 0, %first ], [ 0, %third ]40 %cmp_phi1_sub = icmp eq i64 %phi_one, %sub41 br i1 %cmp_phi1_sub, label %second, label %first42 43second:44 %phi_two = phi i64 [ %inc, %third ], [ %phi_one, %first ]45 br label %third46 47third:48 %inc = add i64 %phi_two, 149 %cmp_inc_sub = icmp eq i64 %inc, %sub50 br i1 %cmp_inc_sub, label %second, label %first51}52 53define hidden void @barrier2() align 2 {54; CHECK-LABEL: @barrier2(55; CHECK-NEXT: entry:56; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr null, align 857; CHECK-NEXT: [[CALL9:%.*]] = tail call i64 @g()58; CHECK-NEXT: [[REM:%.*]] = select i1 undef, i64 0, i64 [[CALL9]]59; CHECK-NEXT: [[ADD:%.*]] = add i64 [[TMP0]], 160; CHECK-NEXT: [[SHR17:%.*]] = lshr i64 [[ADD]], 161; CHECK-NEXT: [[SUB:%.*]] = add nsw i64 [[SHR17]], -162; CHECK-NEXT: br label [[MAINLOOP:%.*]]63; CHECK: second.exit:64; CHECK-NEXT: br label [[FIRST_EXIT:%.*]]65; CHECK: first.exit:66; CHECK-NEXT: br label [[MAINLOOP]]67; CHECK: mainloop:68; CHECK-NEXT: [[FIRSTPHI:%.*]] = phi i64 [ [[REM]], [[ENTRY:%.*]] ], [ 0, [[FIRST_EXIT]] ]69; CHECK-NEXT: [[FIRSTCMP:%.*]] = icmp eq i64 [[FIRSTPHI]], [[SUB]]70; CHECK-NEXT: br i1 [[FIRSTCMP]], label [[SECOND_PREHEADER:%.*]], label [[FIRST_EXIT]]71; CHECK: second.preheader:72; CHECK-NEXT: br label [[INNERLOOP:%.*]]73; CHECK: innerloop:74; CHECK-NEXT: br label [[CLEANUP:%.*]]75; CHECK: cleanup:76; CHECK-NEXT: br i1 false, label [[INNERLOOP]], label [[SECOND_EXIT:%.*]]77;78entry:79 %0 = load i64, ptr null, align 880 %call9 = tail call i64 @g()81 %rem = select i1 undef, i64 0, i64 %call982 %add = add i64 %0, 183 %shr17 = lshr i64 %add, 184 %sub = add nsw i64 %shr17, -185 br label %mainloop86 87second.exit: ; preds = %cleanup88 br label %first.exit89 90first.exit: ; preds = %mainloop, %second.exit91 br label %mainloop92 93mainloop: ; preds = %first.exit, %entry94 %firstphi = phi i64 [ %rem, %entry ], [ 0, %first.exit ]95 %firstcmp = icmp eq i64 %firstphi, %sub96 br i1 %firstcmp, label %second.preheader, label %first.exit97 98second.preheader: ; preds = %mainloop99 br label %innerloop100 101innerloop: ; preds = %cleanup, %second.preheader102 %secondphi = phi i64 [ %inc, %cleanup ], [ %firstphi, %second.preheader ]103 br label %cleanup104 105cleanup: ; preds = %innerloop106 %inc = add i64 %secondphi, 1107 %secondcmp = icmp eq i64 %inc, %sub108 br i1 %secondcmp, label %innerloop, label %second.exit109}110 111declare hidden i64 @g() local_unnamed_addr align 2112 113define void @barrier3(i64 %arg) {114; CHECK-LABEL: @barrier3(115; CHECK-NEXT: entry:116; CHECK-NEXT: br label [[FIRSTLOOP:%.*]]117; CHECK: firstloop:118; CHECK-NEXT: [[PHI1:%.*]] = phi i64 [ [[ARG:%.*]], [[ENTRY:%.*]] ], [ 0, [[FIRSTLOOP]] ]119; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i64 [[PHI1]], -1120; CHECK-NEXT: br i1 [[CMP1]], label [[SECONDLOOP:%.*]], label [[FIRSTLOOP]]121; CHECK: secondloop:122; CHECK-NEXT: call void @llvm.assume(i1 false)123; CHECK-NEXT: br label [[SECONDLOOP]]124;125entry:126 br label %firstloop127 128firstloop:129 %phi1 = phi i64 [ %arg, %entry ], [ 0, %firstloop ]130 %cmp1 = icmp eq i64 %phi1, -1131 br i1 %cmp1, label %secondloop, label %firstloop132 133secondloop:134 %phi2 = phi i64 [ %inc, %secondloop ], [ %phi1, %firstloop ]135 %inc = add i64 %phi2, 1136 %cmp2 = icmp eq i64 %inc, -1137 call void @llvm.assume(i1 %cmp2)138 br label %secondloop139}140 141declare void @llvm.assume(i1)142