1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=newgvn -S < %s | FileCheck %s 3 4declare void @use(i32, i32) 5 6define void @binop(i32 %x, i32 %y) { 7; CHECK-LABEL: @binop( 8; CHECK-NEXT: [[ADD1:%.*]] = add i32 [[X:%.*]], [[Y:%.*]] 9; CHECK-NEXT: call void @use(i32 [[ADD1]], i32 [[ADD1]]) 10; CHECK-NEXT: ret void 11; 12 %add1 = add i32 %x, %y 13 %add2 = add i32 %y, %x 14 call void @use(i32 %add1, i32 %add2) 15 ret void 16} 17 18declare void @vse(i1, i1) 19 20define void @cmp(i32 %x, i32 %y) { 21; CHECK-LABEL: @cmp( 22; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i32 [[X:%.*]], [[Y:%.*]] 23; CHECK-NEXT: call void @vse(i1 [[CMP1]], i1 [[CMP1]]) 24; CHECK-NEXT: ret void 25; 26 %cmp1 = icmp ult i32 %x, %y 27 %cmp2 = icmp ugt i32 %y, %x 28 call void @vse(i1 %cmp1, i1 %cmp2) 29 ret void 30} 31 32declare i32 @llvm.smax.i32(i32, i32) 33 34define void @intrinsic(i32 %x, i32 %y) { 35; CHECK-LABEL: @intrinsic( 36; CHECK-NEXT: [[M1:%.*]] = call i32 @llvm.smax.i32(i32 [[X:%.*]], i32 [[Y:%.*]]) 37; CHECK-NEXT: call void @use(i32 [[M1]], i32 [[M1]]) 38; CHECK-NEXT: ret void 39; 40 %m1 = call i32 @llvm.smax.i32(i32 %x, i32 %y) 41 %m2 = call i32 @llvm.smax.i32(i32 %y, i32 %x) 42 call void @use(i32 %m1, i32 %m2) 43 ret void 44} 45 46declare i16 @llvm.smul.fix.i16(i16, i16, i32) 47declare i16 @llvm.umul.fix.i16(i16, i16, i32) 48 49define i16 @intrinsic_3_args(i16 %x, i16 %y) { 50; CHECK-LABEL: @intrinsic_3_args( 51; CHECK-NEXT: ret i16 0 52; 53 %m1 = call i16 @llvm.smul.fix.i16(i16 %x, i16 %y, i32 1) 54 %m2 = call i16 @llvm.smul.fix.i16(i16 %y, i16 %x, i32 1) 55 %r = sub i16 %m1, %m2 56 ret i16 %r 57} 58 59define i16 @intrinsic_3_args_not_same(i16 %x, i16 %y) { 60; CHECK-LABEL: @intrinsic_3_args_not_same( 61; CHECK-NEXT: [[M1:%.*]] = call i16 @llvm.umul.fix.i16(i16 [[X:%.*]], i16 [[Y:%.*]], i32 2) 62; CHECK-NEXT: [[M2:%.*]] = call i16 @llvm.umul.fix.i16(i16 [[Y]], i16 [[X]], i32 1) 63; CHECK-NEXT: [[R:%.*]] = sub i16 [[M1]], [[M2]] 64; CHECK-NEXT: ret i16 [[R]] 65; 66 %m1 = call i16 @llvm.umul.fix.i16(i16 %x, i16 %y, i32 2) 67 %m2 = call i16 @llvm.umul.fix.i16(i16 %y, i16 %x, i32 1) 68 %r = sub i16 %m1, %m2 69 ret i16 %r 70} 71 72declare float @llvm.fma.f32(float, float, float) 73 74define float @fma(float %x, float %y) { 75; CHECK-LABEL: @fma( 76; CHECK-NEXT: [[M1:%.*]] = call float @llvm.fma.f32(float [[X:%.*]], float [[Y:%.*]], float 1.000000e+00) 77; CHECK-NEXT: [[R:%.*]] = fdiv nnan float [[M1]], [[M1]] 78; CHECK-NEXT: ret float [[R]] 79; 80 %m1 = call float @llvm.fma.f32(float %x, float %y, float 1.0) 81 %m2 = call float @llvm.fma.f32(float %y, float %x, float 1.0) 82 %r = fdiv nnan float %m1, %m2 83 ret float %r 84} 85 86declare i16 @llvm.sdiv.fix.i16(i16, i16, i32) 87 88define i16 @intrinsic_3_args_not_commutative(i16 %x, i16 %y) { 89; CHECK-LABEL: @intrinsic_3_args_not_commutative( 90; CHECK-NEXT: [[M1:%.*]] = call i16 @llvm.sdiv.fix.i16(i16 [[X:%.*]], i16 [[Y:%.*]], i32 1) 91; CHECK-NEXT: [[M2:%.*]] = call i16 @llvm.sdiv.fix.i16(i16 [[Y]], i16 [[X]], i32 1) 92; CHECK-NEXT: [[R:%.*]] = sub i16 [[M1]], [[M2]] 93; CHECK-NEXT: ret i16 [[R]] 94; 95 %m1 = call i16 @llvm.sdiv.fix.i16(i16 %x, i16 %y, i32 1) 96 %m2 = call i16 @llvm.sdiv.fix.i16(i16 %y, i16 %x, i32 1) 97 %r = sub i16 %m1, %m2 98 ret i16 %r 99} 100