1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s 3 4;----------------------------------------------------------------------------- 5; Simple test using scalar layout. 6;----------------------------------------------------------------------------- 7 8declare i32 @llvm.smul.fix.i32(i32, i32, i32) 9 10define i32 @test_smul_fix_i32_0() { 11; CHECK-LABEL: @test_smul_fix_i32_0( 12; CHECK-NEXT: ret i32 536870912 13; 14 %r = call i32 @llvm.smul.fix.i32(i32 1073741824, i32 1073741824, i32 31) ; 0.5 * 0.5 15 ret i32 %r 16} 17 18define i32 @test_smul_fix_i32_undef_x() { 19; CHECK-LABEL: @test_smul_fix_i32_undef_x( 20; CHECK-NEXT: ret i32 0 21; 22 %r = call i32 @llvm.smul.fix.i32(i32 undef, i32 1073741824, i32 31) ; undef * 0.5 23 ret i32 %r 24} 25 26define i32 @test_smul_fix_i32_x_undef() { 27; CHECK-LABEL: @test_smul_fix_i32_x_undef( 28; CHECK-NEXT: ret i32 0 29; 30 %r = call i32 @llvm.smul.fix.i32(i32 1073741824, i32 undef, i32 31) 31 ret i32 %r 32} 33 34 35;----------------------------------------------------------------------------- 36; More extensive tests based on vectors (basically using the scalar fold 37; for each index). 38;----------------------------------------------------------------------------- 39 40declare <8 x i3> @llvm.smul.fix.v8i3(<8 x i3>, <8 x i3>, i32) 41 42define <8 x i3> @test_smul_fix_v8i3_0() { 43; CHECK-LABEL: @test_smul_fix_v8i3_0( 44; CHECK-NEXT: ret <8 x i3> <i3 0, i3 -4, i3 0, i3 -4, i3 0, i3 -4, i3 0, i3 -4> 45; 46 %r = call <8 x i3> @llvm.smul.fix.v8i3( 47 <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>, 48 <8 x i3> <i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4>, 49 i32 0) 50 ret <8 x i3> %r 51} 52 53define <8 x i3> @test_smul_fix_v8i3_1() { 54; CHECK-LABEL: @test_smul_fix_v8i3_1( 55; CHECK-NEXT: ret <8 x i3> <i3 0, i3 -2, i3 -4, i3 2, i3 0, i3 -2, i3 -4, i3 2> 56; 57 %r = call <8 x i3> @llvm.smul.fix.v8i3( 58 <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>, 59 <8 x i3> <i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4>, 60 i32 1) 61 ret <8 x i3> %r 62} 63 64define <8 x i3> @test_smul_fix_v8i3_2() { 65; CHECK-LABEL: @test_smul_fix_v8i3_2( 66; CHECK-NEXT: ret <8 x i3> <i3 -4, i3 3, i3 2, i3 1, i3 0, i3 -1, i3 -2, i3 -3> 67; 68 %r = call <8 x i3> @llvm.smul.fix.v8i3( 69 <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>, 70 <8 x i3> <i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4>, 71 i32 2) 72 ret <8 x i3> %r 73} 74 75define <8 x i3> @test_smul_fix_v8i3_3() { 76; CHECK-LABEL: @test_smul_fix_v8i3_3( 77; CHECK-NEXT: ret <8 x i3> <i3 -4, i3 3, i3 2, i3 1, i3 0, i3 -1, i3 -2, i3 -3> 78; 79 %r = call <8 x i3> @llvm.smul.fix.v8i3( 80 <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>, 81 <8 x i3> <i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1>, 82 i32 0) 83 ret <8 x i3> %r 84} 85 86define <8 x i3> @test_smul_fix_v8i3_4() { 87; CHECK-LABEL: @test_smul_fix_v8i3_4( 88; CHECK-NEXT: ret <8 x i3> <i3 2, i3 1, i3 1, i3 0, i3 0, i3 -1, i3 -1, i3 -2> 89; 90 %r = call <8 x i3> @llvm.smul.fix.v8i3( 91 <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>, 92 <8 x i3> <i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1>, 93 i32 1) 94 ret <8 x i3> %r 95} 96 97define <8 x i3> @test_smul_fix_v8i3_5() { 98; CHECK-LABEL: @test_smul_fix_v8i3_5( 99; CHECK-NEXT: ret <8 x i3> <i3 1, i3 0, i3 0, i3 0, i3 0, i3 -1, i3 -1, i3 -1> 100; 101 %r = call <8 x i3> @llvm.smul.fix.v8i3( 102 <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>, 103 <8 x i3> <i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1>, 104 i32 2) 105 ret <8 x i3> %r 106} 107 108define <8 x i3> @test_smul_fix_v8i3_6() { 109; CHECK-LABEL: @test_smul_fix_v8i3_6( 110; CHECK-NEXT: ret <8 x i3> <i3 -4, i3 -1, i3 2, i3 -3, i3 0, i3 3, i3 -2, i3 1> 111; 112 %r = call <8 x i3> @llvm.smul.fix.v8i3( 113 <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>, 114 <8 x i3> <i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3>, 115 i32 0) 116 ret <8 x i3> %r 117} 118 119define <8 x i3> @test_smul_fix_v8i3_7() { 120; CHECK-LABEL: @test_smul_fix_v8i3_7( 121; CHECK-NEXT: ret <8 x i3> <i3 2, i3 3, i3 -3, i3 -2, i3 0, i3 1, i3 3, i3 -4> 122; 123 %r = call <8 x i3> @llvm.smul.fix.v8i3( 124 <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>, 125 <8 x i3> <i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3>, 126 i32 1) 127 ret <8 x i3> %r 128} 129 130define <8 x i3> @test_smul_fix_v8i3_8() { 131; CHECK-LABEL: @test_smul_fix_v8i3_8( 132; CHECK-NEXT: ret <8 x i3> <i3 -3, i3 -3, i3 -2, i3 -1, i3 0, i3 0, i3 1, i3 2> 133; 134 %r = call <8 x i3> @llvm.smul.fix.v8i3( 135 <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>, 136 <8 x i3> <i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3>, 137 i32 2) 138 ret <8 x i3> %r 139} 140 141define <8 x i3> @test_smul_fix_v8i3_9() { 142; CHECK-LABEL: @test_smul_fix_v8i3_9( 143; CHECK-NEXT: ret <8 x i3> <i3 0, i3 0, i3 poison, i3 poison, i3 1, i3 1, i3 1, i3 1> 144; 145 %r = call <8 x i3> @llvm.smul.fix.v8i3( 146 <8 x i3> <i3 2, i3 undef, i3 2, i3 poison, i3 2, i3 2, i3 2, i3 2>, 147 <8 x i3> <i3 undef, i3 2, i3 poison, i3 2, i3 2, i3 2, i3 2, i3 2>, 148 i32 2) 149 ret <8 x i3> %r 150} 151