204 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=gvn < %s | FileCheck --check-prefixes=CHECK,MDEP %s3; RUN: opt -S -passes='gvn<memoryssa>' < %s | FileCheck %s4 5 6define i64 @test1(i1 %c, i64 %a, i64 %b) {7; CHECK-LABEL: @test1(8; CHECK-NEXT: br i1 [[C:%.*]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]9; CHECK: taken:10; CHECK-NEXT: br label [[MERGE:%.*]]11; CHECK: untaken:12; CHECK-NEXT: br label [[MERGE]]13; CHECK: merge:14; CHECK-NEXT: [[PHI1:%.*]] = phi i64 [ [[A:%.*]], [[TAKEN]] ], [ [[B:%.*]], [[UNTAKEN]] ]15; CHECK-NEXT: ret i64 016;17 br i1 %c, label %taken, label %untaken18taken:19 br label %merge20untaken:21 br label %merge22merge:23 %phi1 = phi i64 [%a, %taken], [%b, %untaken]24 %phi2 = phi i64 [%a, %taken], [%b, %untaken]25 %ret = sub i64 %phi1, %phi226 ret i64 %ret27}28 29declare void @llvm.assume(i1)30 31define i64 @test2(i1 %c, i64 %a, i64 %b) {32; CHECK-LABEL: @test2(33; CHECK-NEXT: br i1 [[C:%.*]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]34; CHECK: taken:35; CHECK-NEXT: [[ASSUMPTION:%.*]] = icmp eq i64 [[A:%.*]], 036; CHECK-NEXT: call void @llvm.assume(i1 [[ASSUMPTION]])37; CHECK-NEXT: br label [[MERGE:%.*]]38; CHECK: untaken:39; CHECK-NEXT: br label [[MERGE]]40; CHECK: merge:41; CHECK-NEXT: [[PHI1:%.*]] = phi i64 [ 0, [[TAKEN]] ], [ [[B:%.*]], [[UNTAKEN]] ]42; CHECK-NEXT: ret i64 043;44 br i1 %c, label %taken, label %untaken45taken:46 %assumption = icmp eq i64 %a, 047 call void @llvm.assume(i1 %assumption)48 br label %merge49untaken:50 br label %merge51merge:52 %phi1 = phi i64 [%a, %taken], [%b, %untaken]53 %phi2 = phi i64 [0, %taken], [%b, %untaken]54 %ret = sub i64 %phi1, %phi255 ret i64 %ret56}57 58 59define i64 @test3(i1 %c, i64 %a, i64 %b) {60; CHECK-LABEL: @test3(61; CHECK-NEXT: br i1 [[C:%.*]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]62; CHECK: taken:63; CHECK-NEXT: [[ADD1:%.*]] = add i64 [[A:%.*]], 564; CHECK-NEXT: br label [[MERGE:%.*]]65; CHECK: untaken:66; CHECK-NEXT: br label [[MERGE]]67; CHECK: merge:68; CHECK-NEXT: [[PHI1:%.*]] = phi i64 [ [[ADD1]], [[TAKEN]] ], [ [[B:%.*]], [[UNTAKEN]] ]69; CHECK-NEXT: ret i64 070;71 br i1 %c, label %taken, label %untaken72taken:73 %add1 = add i64 %a, 574 %add2 = add i64 %a, 575 br label %merge76untaken:77 br label %merge78merge:79 %phi1 = phi i64 [%add1, %taken], [%b, %untaken]80 %phi2 = phi i64 [%add2, %taken], [%b, %untaken]81 %ret = sub i64 %phi1, %phi282 ret i64 %ret83}84 85define i64 @test4(i1 %c, i64 %a, i64 %b) {86; CHECK-LABEL: @test4(87; CHECK-NEXT: br i1 [[C:%.*]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]88; CHECK: taken:89; CHECK-NEXT: br label [[MERGE:%.*]]90; CHECK: untaken:91; CHECK-NEXT: br label [[MERGE]]92; CHECK: merge:93; CHECK-NEXT: [[PHI1:%.*]] = phi i64 [ [[A:%.*]], [[TAKEN]] ], [ [[B:%.*]], [[UNTAKEN]] ]94; CHECK-NEXT: br i1 [[C]], label [[TAKEN2:%.*]], label [[UNTAKEN2:%.*]]95; CHECK: taken2:96; CHECK-NEXT: [[ADD1:%.*]] = add i64 [[PHI1]], 597; CHECK-NEXT: br label [[MERGE2:%.*]]98; CHECK: untaken2:99; CHECK-NEXT: br label [[MERGE2]]100; CHECK: merge2:101; CHECK-NEXT: [[PHI3:%.*]] = phi i64 [ [[ADD1]], [[TAKEN2]] ], [ [[PHI1]], [[UNTAKEN2]] ]102; CHECK-NEXT: ret i64 0103;104 br i1 %c, label %taken, label %untaken105taken:106 br label %merge107untaken:108 br label %merge109merge:110 %phi1 = phi i64 [%a, %taken], [%b, %untaken]111 %phi2 = phi i64 [%a, %taken], [%b, %untaken]112 br i1 %c, label %taken2, label %untaken2113taken2:114 %add1 = add i64 %phi1, 5115 %add2 = add i64 %phi2, 5116 br label %merge2117untaken2:118 br label %merge2119merge2:120 %phi3 = phi i64 [%add1, %taken2], [%phi2, %untaken2]121 %phi4 = phi i64 [%add2, %taken2], [%phi2, %untaken2]122 %ret = sub i64 %phi4, %phi3123 ret i64 %ret124}125 126define i64 @test5(i1 %c, i64 %a) {127; CHECK-LABEL: @test5(128; CHECK-NEXT: br i1 [[C:%.*]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]129; CHECK: taken:130; CHECK-NEXT: [[ASSUMPTION:%.*]] = icmp eq i64 [[A:%.*]], 0131; CHECK-NEXT: call void @llvm.assume(i1 [[ASSUMPTION]])132; CHECK-NEXT: br label [[MERGE:%.*]]133; CHECK: untaken:134; CHECK-NEXT: br label [[MERGE]]135; CHECK: merge:136; CHECK-NEXT: ret i64 0137;138 br i1 %c, label %taken, label %untaken139taken:140 %assumption = icmp eq i64 %a, 0141 call void @llvm.assume(i1 %assumption)142 br label %merge143untaken:144 br label %merge145merge:146 %phi = phi i64 [%a, %taken], [0, %untaken]147 ret i64 %phi148}149 150define i64 @test6(i1 %c, i64 %a) {151; CHECK-LABEL: @test6(152; CHECK-NEXT: br i1 [[C:%.*]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]153; CHECK: taken:154; CHECK-NEXT: [[ASSUMPTION:%.*]] = icmp eq i64 [[A:%.*]], 0155; CHECK-NEXT: call void @llvm.assume(i1 [[ASSUMPTION]])156; CHECK-NEXT: br label [[MERGE:%.*]]157; CHECK: untaken:158; CHECK-NEXT: br label [[MERGE]]159; CHECK: merge:160; CHECK-NEXT: ret i64 0161;162 br i1 %c, label %taken, label %untaken163taken:164 %assumption = icmp eq i64 %a, 0165 call void @llvm.assume(i1 %assumption)166 br label %next167next:168 br label %merge169untaken:170 br label %merge171merge:172 %phi = phi i64 [%a, %next], [0, %untaken]173 ret i64 %phi174}175 176; negative test, phi use is NOT dominated by assume177define i64 @test7(i1 %c, i64 %a) {178; CHECK-LABEL: @test7(179; CHECK-NEXT: br i1 [[C:%.*]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]180; CHECK: taken:181; CHECK-NEXT: [[ASSUMPTION:%.*]] = icmp eq i64 [[A:%.*]], 0182; CHECK-NEXT: call void @llvm.assume(i1 [[ASSUMPTION]])183; CHECK-NEXT: br label [[MERGE:%.*]]184; CHECK: untaken:185; CHECK-NEXT: br label [[MERGE]]186; CHECK: merge:187; CHECK-NEXT: ret i64 [[A]]188;189 br i1 %c, label %taken, label %untaken190taken:191 %assumption = icmp eq i64 %a, 0192 call void @llvm.assume(i1 %assumption)193 br label %merge194untaken:195 br label %merge196merge:197 br label %next198next:199 %phi = phi i64 [%a, %merge]200 ret i64 %phi201}202;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:203; MDEP: {{.*}}204