brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.4 KiB · 0381582 Raw
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