brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · 7474221 Raw
169 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=gvn < %s | FileCheck %s3 4define i32 @test(ptr %p, i32 %v) {5; CHECK-LABEL: @test(6; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[P:%.*]]7; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[LOAD]], [[V:%.*]]8; CHECK-NEXT:    call void @llvm.assume(i1 [[C]])9; CHECK-NEXT:    ret i32 [[V]]10;11  %load = load i32, ptr %p12  %c = icmp eq i32 %load, %v13  call void @llvm.assume(i1 %c)14  ret i32 %load15}16 17define i32 @reverse(ptr %p, i32 %v) {18; CHECK-LABEL: @reverse(19; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[P:%.*]]20; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[LOAD]], [[V:%.*]]21; CHECK-NEXT:    call void @llvm.assume(i1 [[C]])22; CHECK-NEXT:    ret i32 [[V]]23;24  %load = load i32, ptr %p25  %c = icmp eq i32 %load, %v26  call void @llvm.assume(i1 %c)27  ret i32 %v28}29 30; Lack of equivalance due to +0.0 vs -0.031define float @neg_float_oeq(ptr %p, float %v) {32; CHECK-LABEL: @neg_float_oeq(33; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr [[P:%.*]]34; CHECK-NEXT:    [[C:%.*]] = fcmp oeq float [[LOAD]], [[V:%.*]]35; CHECK-NEXT:    call void @llvm.assume(i1 [[C]])36; CHECK-NEXT:    ret float [[LOAD]]37;38  %load = load float, ptr %p39  %c = fcmp oeq float %load, %v40  call void @llvm.assume(i1 %c)41  ret float %load42}43 44; Lack of equivalance due to +0.0 vs -0.045define float @neg_float_ueq(ptr %p, float %v) {46; CHECK-LABEL: @neg_float_ueq(47; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr [[P:%.*]]48; CHECK-NEXT:    [[C:%.*]] = fcmp ueq float [[LOAD]], [[V:%.*]]49; CHECK-NEXT:    call void @llvm.assume(i1 [[C]])50; CHECK-NEXT:    ret float [[LOAD]]51;52  %load = load float, ptr %p53  %c = fcmp ueq float %load, %v54  call void @llvm.assume(i1 %c)55  ret float %load56}57 58define float @float_oeq_constant(ptr %p) {59; CHECK-LABEL: @float_oeq_constant(60; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr [[P:%.*]]61; CHECK-NEXT:    [[C:%.*]] = fcmp oeq float [[LOAD]], 5.000000e+0062; CHECK-NEXT:    call void @llvm.assume(i1 [[C]])63; CHECK-NEXT:    ret float 5.000000e+0064;65  %load = load float, ptr %p66  %c = fcmp oeq float %load, 5.067  call void @llvm.assume(i1 %c)68  ret float %load69}70 71; Lack of equivalance due to Nan72define float @neq_float_ueq_constant(ptr %p) {73; CHECK-LABEL: @neq_float_ueq_constant(74; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr [[P:%.*]]75; CHECK-NEXT:    [[C:%.*]] = fcmp ueq float [[LOAD]], 5.000000e+0076; CHECK-NEXT:    call void @llvm.assume(i1 [[C]])77; CHECK-NEXT:    ret float [[LOAD]]78;79  %load = load float, ptr %p80  %c = fcmp ueq float %load, 5.081  call void @llvm.assume(i1 %c)82  ret float %load83}84 85define float @float_ueq_constant_nnas(ptr %p) {86; CHECK-LABEL: @float_ueq_constant_nnas(87; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr [[P:%.*]]88; CHECK-NEXT:    [[C:%.*]] = fcmp nnan ueq float [[LOAD]], 5.000000e+0089; CHECK-NEXT:    call void @llvm.assume(i1 [[C]])90; CHECK-NEXT:    ret float 5.000000e+0091;92  %load = load float, ptr %p93  %c = fcmp nnan ueq float %load, 5.094  call void @llvm.assume(i1 %c)95  ret float %load96}97 98define i32 @test2(ptr %p, i32 %v) {99; CHECK-LABEL: @test2(100; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[P:%.*]]101; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[LOAD]], [[V:%.*]]102; CHECK-NEXT:    call void @llvm.assume(i1 [[C]])103; CHECK-NEXT:    ret i32 [[V]]104;105  %load = load i32, ptr %p106  %c = icmp eq i32 %load, %v107  call void @llvm.assume(i1 %c)108  %load2 = load i32, ptr %p109  ret i32 %load2110}111 112define i32 @test3(ptr %p, i32 %v, i1 %arg) {113; CHECK-LABEL: @test3(114; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[P:%.*]]115; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[LOAD]], [[V:%.*]]116; CHECK-NEXT:    call void @llvm.assume(i1 [[C]])117; CHECK-NEXT:    br i1 %arg, label [[TAKEN:%.*]], label [[MERGE:%.*]]118; CHECK:       taken:119; CHECK-NEXT:    br label [[MERGE]]120; CHECK:       merge:121; CHECK-NEXT:    ret i32 [[V]]122;123  %load = load i32, ptr %p124  %c = icmp eq i32 %load, %v125  call void @llvm.assume(i1 %c)126  br i1 %arg, label %taken, label %merge127taken:128  br label %merge129merge:130  ret i32 %load131}132 133define i32 @trivial_constants(ptr %p, i1 %arg) {134; CHECK-LABEL: @trivial_constants(135; CHECK-NEXT:    br i1 %arg, label [[TAKEN:%.*]], label [[MERGE:%.*]]136; CHECK:       taken:137; CHECK-NEXT:    br label [[MERGE]]138; CHECK:       merge:139; CHECK-NEXT:    ret i32 0140;141  %c = icmp eq i32 0, 0142  call void @llvm.assume(i1 %c)143  br i1 %arg, label %taken, label %merge144taken:145  br label %merge146merge:147  ret i32 0148}149 150define i32 @conflicting_constants(ptr %p, i1 %arg) {151; CHECK-LABEL: @conflicting_constants(152; CHECK-NEXT:    store i8 poison, ptr null153; CHECK-NEXT:    br i1 %arg, label [[TAKEN:%.*]], label [[MERGE:%.*]]154; CHECK:       taken:155; CHECK-NEXT:    br label [[MERGE]]156; CHECK:       merge:157; CHECK-NEXT:    ret i32 1158;159  %c = icmp eq i32 0, 5160  call void @llvm.assume(i1 %c)161  br i1 %arg, label %taken, label %merge162taken:163  br label %merge164merge:165  ret i32 1166}167 168declare void @llvm.assume(i1)169