165 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=correlated-propagation -S < %s | FileCheck %s3 4declare void @use()5declare void @use_ptr(ptr)6 7; test requires a mix of context sensative refinement, and analysis8; of the originating IR pattern. Neither part is enough in isolation.9define void @test1(i1 %c, i1 %c2) {10; CHECK-LABEL: @test1(11; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i64 -1, i64 112; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[C2:%.*]], i64 [[SEL]], i64 013; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[SEL2]], 014; CHECK-NEXT: br i1 [[CMP]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]15; CHECK: taken:16; CHECK-NEXT: call void @use() [ "deopt"(i64 1) ]17; CHECK-NEXT: ret void18; CHECK: untaken:19; CHECK-NEXT: ret void20;21 %sel = select i1 %c, i64 -1, i64 122 %sel2 = select i1 %c2, i64 %sel, i64 023 %cmp = icmp sgt i64 %sel2, 024 br i1 %cmp, label %taken, label %untaken25taken:26 call void @use() ["deopt" (i64 %sel2)]27 ret void28untaken:29 ret void30}31 32declare void @llvm.assume(i1)33declare void @llvm.experimental.guard(i1,...)34 35; Same as test1, but with assume not branch36define void @test1_assume(i1 %c, i1 %c2) {37; CHECK-LABEL: @test1_assume(38; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i64 -1, i64 139; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[C2:%.*]], i64 [[SEL]], i64 040; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[SEL2]], 041; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])42; CHECK-NEXT: call void @use() [ "deopt"(i64 1) ]43; CHECK-NEXT: ret void44;45 %sel = select i1 %c, i64 -1, i64 146 %sel2 = select i1 %c2, i64 %sel, i64 047 %cmp = icmp sgt i64 %sel2, 048 call void @llvm.assume(i1 %cmp)49 call void @use() ["deopt" (i64 %sel2)]50 ret void51}52 53; Same as test1, but with guard not branch54define void @test1_guard(i1 %c, i1 %c2) {55; CHECK-LABEL: @test1_guard(56; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i64 -1, i64 157; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[C2:%.*]], i64 [[SEL]], i64 058; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[SEL2]], 059; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 [[CMP]]) [ "deopt"(i64 [[SEL2]]) ]60; CHECK-NEXT: call void @use() [ "deopt"(i64 1) ]61; CHECK-NEXT: ret void62;63 %sel = select i1 %c, i64 -1, i64 164 %sel2 = select i1 %c2, i64 %sel, i64 065 %cmp = icmp sgt i64 %sel2, 066 call void (i1, ...) @llvm.experimental.guard(i1 %cmp) ["deopt" (i64 %sel2)]67 call void @use() ["deopt" (i64 %sel2)]68 ret void69}70 71;; The rest of these are slight variations on the patterns72;; producing 1 of several adjacent constants to test generality73 74define void @test2(i1 %c, i1 %c2) {75; CHECK-LABEL: @test2(76; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i64 0, i64 177; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[C2:%.*]], i64 [[SEL]], i64 -178; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[SEL2]], 079; CHECK-NEXT: br i1 [[CMP]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]80; CHECK: taken:81; CHECK-NEXT: call void @use() [ "deopt"(i64 1) ]82; CHECK-NEXT: ret void83; CHECK: untaken:84; CHECK-NEXT: ret void85;86 %sel = select i1 %c, i64 0, i64 187 %sel2 = select i1 %c2, i64 %sel, i64 -188 %cmp = icmp sgt i64 %sel2, 089 br i1 %cmp, label %taken, label %untaken90taken:91 call void @use() ["deopt" (i64 %sel2)]92 ret void93untaken:94 ret void95}96define void @test3(i1 %c, i1 %c2) {97; CHECK-LABEL: @test3(98; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i64 0, i64 199; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[C2:%.*]], i64 [[SEL]], i64 2100; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i64 [[SEL2]], 1101; CHECK-NEXT: br i1 [[CMP]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]102; CHECK: taken:103; CHECK-NEXT: call void @use() [ "deopt"(i64 2) ]104; CHECK-NEXT: ret void105; CHECK: untaken:106; CHECK-NEXT: ret void107;108 %sel = select i1 %c, i64 0, i64 1109 %sel2 = select i1 %c2, i64 %sel, i64 2110 %cmp = icmp sgt i64 %sel2, 1111 br i1 %cmp, label %taken, label %untaken112taken:113 call void @use() ["deopt" (i64 %sel2)]114 ret void115untaken:116 ret void117}118 119define void @test4(i1 %c, i1 %c2) {120; CHECK-LABEL: @test4(121; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i64 0, i64 1122; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[C2:%.*]], i64 0, i64 1123; CHECK-NEXT: [[ADD1:%.*]] = add nuw nsw i64 0, [[SEL]]124; CHECK-NEXT: [[ADD2:%.*]] = add nuw nsw i64 [[ADD1]], [[SEL2]]125; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i64 [[ADD2]], 1126; CHECK-NEXT: br i1 [[CMP]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]127; CHECK: taken:128; CHECK-NEXT: call void @use() [ "deopt"(i64 2) ]129; CHECK-NEXT: ret void130; CHECK: untaken:131; CHECK-NEXT: ret void132;133 %sel = select i1 %c, i64 0, i64 1134 %sel2 = select i1 %c2, i64 0, i64 1135 %add1 = add i64 0, %sel136 %add2 = add i64 %add1, %sel2137 %cmp = icmp sgt i64 %add2, 1138 br i1 %cmp, label %taken, label %untaken139taken:140 call void @use() ["deopt" (i64 %add2)]141 ret void142untaken:143 ret void144}145 146 147define void @test5(i64 %a, ptr nonnull %p) {148; CHECK-LABEL: @test5(149; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[A:%.*]], 0150; CHECK-NEXT: br i1 [[CMP]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]151; CHECK: taken:152; CHECK-NEXT: call void @use_ptr(ptr nonnull [[P:%.*]]) [ "deopt"(i64 0) ]153; CHECK-NEXT: ret void154; CHECK: untaken:155; CHECK-NEXT: ret void156;157 %cmp = icmp eq i64 %a, 0158 br i1 %cmp, label %taken, label %untaken159taken:160 call void @use_ptr(ptr %p) ["deopt" (i64 %a)]161 ret void162untaken:163 ret void164}165