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