1*29f98d6cSYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2*29f98d6cSYingwei Zheng; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3*29f98d6cSYingwei Zheng 4*29f98d6cSYingwei Zhengdefine i32 @test_or_fshl(i32 %a, i32 %b, i32 %c, i32 %d, i32 %sh) { 5*29f98d6cSYingwei Zheng; CHECK-LABEL: define i32 @test_or_fshl( 6*29f98d6cSYingwei Zheng; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]], i32 [[D:%.*]], i32 [[SH:%.*]]) { 7*29f98d6cSYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[A]], [[C]] 8*29f98d6cSYingwei Zheng; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[B]], [[D]] 9*29f98d6cSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = call i32 @llvm.fshl.i32(i32 [[TMP1]], i32 [[TMP2]], i32 [[SH]]) 10*29f98d6cSYingwei Zheng; CHECK-NEXT: ret i32 [[RET]] 11*29f98d6cSYingwei Zheng; 12*29f98d6cSYingwei Zheng %val1 = call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 %sh) 13*29f98d6cSYingwei Zheng %val2 = call i32 @llvm.fshl.i32(i32 %c, i32 %d, i32 %sh) 14*29f98d6cSYingwei Zheng %ret = or i32 %val1, %val2 15*29f98d6cSYingwei Zheng ret i32 %ret 16*29f98d6cSYingwei Zheng} 17*29f98d6cSYingwei Zhengdefine i32 @test_and_fshl(i32 %a, i32 %b, i32 %c, i32 %d, i32 %sh) { 18*29f98d6cSYingwei Zheng; CHECK-LABEL: define i32 @test_and_fshl( 19*29f98d6cSYingwei Zheng; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]], i32 [[D:%.*]], i32 [[SH:%.*]]) { 20*29f98d6cSYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A]], [[C]] 21*29f98d6cSYingwei Zheng; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[B]], [[D]] 22*29f98d6cSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = call i32 @llvm.fshl.i32(i32 [[TMP1]], i32 [[TMP2]], i32 [[SH]]) 23*29f98d6cSYingwei Zheng; CHECK-NEXT: ret i32 [[RET]] 24*29f98d6cSYingwei Zheng; 25*29f98d6cSYingwei Zheng %val1 = call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 %sh) 26*29f98d6cSYingwei Zheng %val2 = call i32 @llvm.fshl.i32(i32 %c, i32 %d, i32 %sh) 27*29f98d6cSYingwei Zheng %ret = and i32 %val1, %val2 28*29f98d6cSYingwei Zheng ret i32 %ret 29*29f98d6cSYingwei Zheng} 30*29f98d6cSYingwei Zhengdefine i32 @test_xor_fshl(i32 %a, i32 %b, i32 %c, i32 %d, i32 %sh) { 31*29f98d6cSYingwei Zheng; CHECK-LABEL: define i32 @test_xor_fshl( 32*29f98d6cSYingwei Zheng; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]], i32 [[D:%.*]], i32 [[SH:%.*]]) { 33*29f98d6cSYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[A]], [[C]] 34*29f98d6cSYingwei Zheng; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[B]], [[D]] 35*29f98d6cSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = call i32 @llvm.fshl.i32(i32 [[TMP1]], i32 [[TMP2]], i32 [[SH]]) 36*29f98d6cSYingwei Zheng; CHECK-NEXT: ret i32 [[RET]] 37*29f98d6cSYingwei Zheng; 38*29f98d6cSYingwei Zheng %val1 = call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 %sh) 39*29f98d6cSYingwei Zheng %val2 = call i32 @llvm.fshl.i32(i32 %c, i32 %d, i32 %sh) 40*29f98d6cSYingwei Zheng %ret = xor i32 %val1, %val2 41*29f98d6cSYingwei Zheng ret i32 %ret 42*29f98d6cSYingwei Zheng} 43*29f98d6cSYingwei Zhengdefine i32 @test_or_fshr(i32 %a, i32 %b, i32 %c, i32 %d, i32 %sh) { 44*29f98d6cSYingwei Zheng; CHECK-LABEL: define i32 @test_or_fshr( 45*29f98d6cSYingwei Zheng; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]], i32 [[D:%.*]], i32 [[SH:%.*]]) { 46*29f98d6cSYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[A]], [[C]] 47*29f98d6cSYingwei Zheng; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[B]], [[D]] 48*29f98d6cSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = call i32 @llvm.fshr.i32(i32 [[TMP1]], i32 [[TMP2]], i32 [[SH]]) 49*29f98d6cSYingwei Zheng; CHECK-NEXT: ret i32 [[RET]] 50*29f98d6cSYingwei Zheng; 51*29f98d6cSYingwei Zheng %val1 = call i32 @llvm.fshr.i32(i32 %a, i32 %b, i32 %sh) 52*29f98d6cSYingwei Zheng %val2 = call i32 @llvm.fshr.i32(i32 %c, i32 %d, i32 %sh) 53*29f98d6cSYingwei Zheng %ret = or i32 %val1, %val2 54*29f98d6cSYingwei Zheng ret i32 %ret 55*29f98d6cSYingwei Zheng} 56*29f98d6cSYingwei Zhengdefine i32 @test_or_fshl_cascade(i32 %a, i32 %b, i32 %c) { 57*29f98d6cSYingwei Zheng; CHECK-LABEL: define i32 @test_or_fshl_cascade( 58*29f98d6cSYingwei Zheng; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]]) { 59*29f98d6cSYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[A]], [[B]] 60*29f98d6cSYingwei Zheng; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[A]], [[B]] 61*29f98d6cSYingwei Zheng; CHECK-NEXT: [[TMP3:%.*]] = or i32 [[TMP1]], [[C]] 62*29f98d6cSYingwei Zheng; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[TMP2]], [[C]] 63*29f98d6cSYingwei Zheng; CHECK-NEXT: [[OR2:%.*]] = call i32 @llvm.fshl.i32(i32 [[TMP3]], i32 [[TMP4]], i32 24) 64*29f98d6cSYingwei Zheng; CHECK-NEXT: ret i32 [[OR2]] 65*29f98d6cSYingwei Zheng; 66*29f98d6cSYingwei Zheng %fshl1 = call i32 @llvm.fshl.i32(i32 %a, i32 %a, i32 24) 67*29f98d6cSYingwei Zheng %fshl2 = call i32 @llvm.fshl.i32(i32 %b, i32 %b, i32 24) 68*29f98d6cSYingwei Zheng %fshl3 = call i32 @llvm.fshl.i32(i32 %c, i32 %c, i32 24) 69*29f98d6cSYingwei Zheng %or1 = or i32 %fshl1, %fshl2 70*29f98d6cSYingwei Zheng %or2 = or i32 %or1, %fshl3 71*29f98d6cSYingwei Zheng ret i32 %or2 72*29f98d6cSYingwei Zheng} 73*29f98d6cSYingwei Zhengdefine i32 @test_or_bitreverse(i32 %a, i32 %b) { 74*29f98d6cSYingwei Zheng; CHECK-LABEL: define i32 @test_or_bitreverse( 75*29f98d6cSYingwei Zheng; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) { 76*29f98d6cSYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[A]], [[B]] 77*29f98d6cSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = call i32 @llvm.bitreverse.i32(i32 [[TMP1]]) 78*29f98d6cSYingwei Zheng; CHECK-NEXT: ret i32 [[RET]] 79*29f98d6cSYingwei Zheng; 80*29f98d6cSYingwei Zheng %val1 = call i32 @llvm.bitreverse.i32(i32 %a) 81*29f98d6cSYingwei Zheng %val2 = call i32 @llvm.bitreverse.i32(i32 %b) 82*29f98d6cSYingwei Zheng %ret = or i32 %val1, %val2 83*29f98d6cSYingwei Zheng ret i32 %ret 84*29f98d6cSYingwei Zheng} 85*29f98d6cSYingwei Zhengdefine i32 @test_or_bitreverse_constant(i32 %a, i32 %b) { 86*29f98d6cSYingwei Zheng; CHECK-LABEL: define i32 @test_or_bitreverse_constant( 87*29f98d6cSYingwei Zheng; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) { 88*29f98d6cSYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[A]], 255 89*29f98d6cSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = call i32 @llvm.bitreverse.i32(i32 [[TMP1]]) 90*29f98d6cSYingwei Zheng; CHECK-NEXT: ret i32 [[RET]] 91*29f98d6cSYingwei Zheng; 92*29f98d6cSYingwei Zheng %val1 = call i32 @llvm.bitreverse.i32(i32 %a) 93*29f98d6cSYingwei Zheng %ret = or i32 %val1, 4278190080 94*29f98d6cSYingwei Zheng ret i32 %ret 95*29f98d6cSYingwei Zheng} 96*29f98d6cSYingwei Zhengdefine i32 @test_or_bswap(i32 %a, i32 %b) { 97*29f98d6cSYingwei Zheng; CHECK-LABEL: define i32 @test_or_bswap( 98*29f98d6cSYingwei Zheng; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) { 99*29f98d6cSYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[A]], [[B]] 100*29f98d6cSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP1]]) 101*29f98d6cSYingwei Zheng; CHECK-NEXT: ret i32 [[RET]] 102*29f98d6cSYingwei Zheng; 103*29f98d6cSYingwei Zheng %val1 = call i32 @llvm.bswap.i32(i32 %a) 104*29f98d6cSYingwei Zheng %val2 = call i32 @llvm.bswap.i32(i32 %b) 105*29f98d6cSYingwei Zheng %ret = or i32 %val1, %val2 106*29f98d6cSYingwei Zheng ret i32 %ret 107*29f98d6cSYingwei Zheng} 108*29f98d6cSYingwei Zhengdefine i32 @test_or_bswap_constant(i32 %a, i32 %b) { 109*29f98d6cSYingwei Zheng; CHECK-LABEL: define i32 @test_or_bswap_constant( 110*29f98d6cSYingwei Zheng; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) { 111*29f98d6cSYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[A]], 255 112*29f98d6cSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP1]]) 113*29f98d6cSYingwei Zheng; CHECK-NEXT: ret i32 [[RET]] 114*29f98d6cSYingwei Zheng; 115*29f98d6cSYingwei Zheng %val1 = call i32 @llvm.bswap.i32(i32 %a) 116*29f98d6cSYingwei Zheng %ret = or i32 %val1, 4278190080 117*29f98d6cSYingwei Zheng ret i32 %ret 118*29f98d6cSYingwei Zheng} 119*29f98d6cSYingwei Zheng 120*29f98d6cSYingwei Zheng; Negative tests 121*29f98d6cSYingwei Zheng 122*29f98d6cSYingwei Zhengdefine i32 @test_or_fshl_fshr(i32 %a, i32 %b, i32 %c, i32 %d, i32 %sh) { 123*29f98d6cSYingwei Zheng; CHECK-LABEL: define i32 @test_or_fshl_fshr( 124*29f98d6cSYingwei Zheng; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]], i32 [[D:%.*]], i32 [[SH:%.*]]) { 125*29f98d6cSYingwei Zheng; CHECK-NEXT: [[VAL1:%.*]] = call i32 @llvm.fshl.i32(i32 [[A]], i32 [[B]], i32 [[SH]]) 126*29f98d6cSYingwei Zheng; CHECK-NEXT: [[VAL2:%.*]] = call i32 @llvm.fshr.i32(i32 [[C]], i32 [[D]], i32 [[SH]]) 127*29f98d6cSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = or i32 [[VAL1]], [[VAL2]] 128*29f98d6cSYingwei Zheng; CHECK-NEXT: ret i32 [[RET]] 129*29f98d6cSYingwei Zheng; 130*29f98d6cSYingwei Zheng %val1 = call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 %sh) 131*29f98d6cSYingwei Zheng %val2 = call i32 @llvm.fshr.i32(i32 %c, i32 %d, i32 %sh) 132*29f98d6cSYingwei Zheng %ret = or i32 %val1, %val2 133*29f98d6cSYingwei Zheng ret i32 %ret 134*29f98d6cSYingwei Zheng} 135*29f98d6cSYingwei Zhengdefine i32 @test_or_bitreverse_bswap(i32 %a, i32 %b) { 136*29f98d6cSYingwei Zheng; CHECK-LABEL: define i32 @test_or_bitreverse_bswap( 137*29f98d6cSYingwei Zheng; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) { 138*29f98d6cSYingwei Zheng; CHECK-NEXT: [[VAL1:%.*]] = call i32 @llvm.bitreverse.i32(i32 [[A]]) 139*29f98d6cSYingwei Zheng; CHECK-NEXT: [[VAL2:%.*]] = call i32 @llvm.bswap.i32(i32 [[B]]) 140*29f98d6cSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = or i32 [[VAL1]], [[VAL2]] 141*29f98d6cSYingwei Zheng; CHECK-NEXT: ret i32 [[RET]] 142*29f98d6cSYingwei Zheng; 143*29f98d6cSYingwei Zheng %val1 = call i32 @llvm.bitreverse.i32(i32 %a) 144*29f98d6cSYingwei Zheng %val2 = call i32 @llvm.bswap.i32(i32 %b) 145*29f98d6cSYingwei Zheng %ret = or i32 %val1, %val2 146*29f98d6cSYingwei Zheng ret i32 %ret 147*29f98d6cSYingwei Zheng} 148*29f98d6cSYingwei Zhengdefine i32 @test_or_fshl_mismatched_shamt(i32 %a, i32 %b, i32 %c, i32 %d, i32 %sh1, i32 %sh2) { 149*29f98d6cSYingwei Zheng; CHECK-LABEL: define i32 @test_or_fshl_mismatched_shamt( 150*29f98d6cSYingwei Zheng; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]], i32 [[D:%.*]], i32 [[SH1:%.*]], i32 [[SH2:%.*]]) { 151*29f98d6cSYingwei Zheng; CHECK-NEXT: [[VAL1:%.*]] = call i32 @llvm.fshl.i32(i32 [[A]], i32 [[B]], i32 [[SH1]]) 152*29f98d6cSYingwei Zheng; CHECK-NEXT: [[VAL2:%.*]] = call i32 @llvm.fshl.i32(i32 [[C]], i32 [[D]], i32 [[SH2]]) 153*29f98d6cSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = or i32 [[VAL1]], [[VAL2]] 154*29f98d6cSYingwei Zheng; CHECK-NEXT: ret i32 [[RET]] 155*29f98d6cSYingwei Zheng; 156*29f98d6cSYingwei Zheng %val1 = call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 %sh1) 157*29f98d6cSYingwei Zheng %val2 = call i32 @llvm.fshl.i32(i32 %c, i32 %d, i32 %sh2) 158*29f98d6cSYingwei Zheng %ret = or i32 %val1, %val2 159*29f98d6cSYingwei Zheng ret i32 %ret 160*29f98d6cSYingwei Zheng} 161*29f98d6cSYingwei Zhengdefine i32 @test_add_fshl(i32 %a, i32 %b, i32 %c, i32 %d, i32 %sh) { 162*29f98d6cSYingwei Zheng; CHECK-LABEL: define i32 @test_add_fshl( 163*29f98d6cSYingwei Zheng; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]], i32 [[D:%.*]], i32 [[SH:%.*]]) { 164*29f98d6cSYingwei Zheng; CHECK-NEXT: [[VAL1:%.*]] = call i32 @llvm.fshl.i32(i32 [[A]], i32 [[B]], i32 [[SH]]) 165*29f98d6cSYingwei Zheng; CHECK-NEXT: [[VAL2:%.*]] = call i32 @llvm.fshl.i32(i32 [[C]], i32 [[D]], i32 [[SH]]) 166*29f98d6cSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = add i32 [[VAL1]], [[VAL2]] 167*29f98d6cSYingwei Zheng; CHECK-NEXT: ret i32 [[RET]] 168*29f98d6cSYingwei Zheng; 169*29f98d6cSYingwei Zheng %val1 = call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 %sh) 170*29f98d6cSYingwei Zheng %val2 = call i32 @llvm.fshl.i32(i32 %c, i32 %d, i32 %sh) 171*29f98d6cSYingwei Zheng %ret = add i32 %val1, %val2 172*29f98d6cSYingwei Zheng ret i32 %ret 173*29f98d6cSYingwei Zheng} 174*29f98d6cSYingwei Zhengdefine i32 @test_or_fshl_multiuse(i32 %a, i32 %b, i32 %c, i32 %d, i32 %sh) { 175*29f98d6cSYingwei Zheng; CHECK-LABEL: define i32 @test_or_fshl_multiuse( 176*29f98d6cSYingwei Zheng; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]], i32 [[D:%.*]], i32 [[SH:%.*]]) { 177*29f98d6cSYingwei Zheng; CHECK-NEXT: [[VAL1:%.*]] = call i32 @llvm.fshl.i32(i32 [[A]], i32 [[B]], i32 [[SH]]) 178*29f98d6cSYingwei Zheng; CHECK-NEXT: call void @use(i32 [[VAL1]]) 179*29f98d6cSYingwei Zheng; CHECK-NEXT: [[VAL2:%.*]] = call i32 @llvm.fshl.i32(i32 [[C]], i32 [[D]], i32 [[SH]]) 180*29f98d6cSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = or i32 [[VAL1]], [[VAL2]] 181*29f98d6cSYingwei Zheng; CHECK-NEXT: ret i32 [[RET]] 182*29f98d6cSYingwei Zheng; 183*29f98d6cSYingwei Zheng %val1 = call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 %sh) 184*29f98d6cSYingwei Zheng call void @use(i32 %val1) 185*29f98d6cSYingwei Zheng %val2 = call i32 @llvm.fshl.i32(i32 %c, i32 %d, i32 %sh) 186*29f98d6cSYingwei Zheng %ret = or i32 %val1, %val2 187*29f98d6cSYingwei Zheng ret i32 %ret 188*29f98d6cSYingwei Zheng} 189*29f98d6cSYingwei Zhengdefine i32 @test_or_bitreverse_multiuse(i32 %a, i32 %b) { 190*29f98d6cSYingwei Zheng; CHECK-LABEL: define i32 @test_or_bitreverse_multiuse( 191*29f98d6cSYingwei Zheng; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) { 192*29f98d6cSYingwei Zheng; CHECK-NEXT: [[VAL1:%.*]] = call i32 @llvm.bitreverse.i32(i32 [[A]]) 193*29f98d6cSYingwei Zheng; CHECK-NEXT: call void @use(i32 [[VAL1]]) 194*29f98d6cSYingwei Zheng; CHECK-NEXT: [[VAL2:%.*]] = call i32 @llvm.bitreverse.i32(i32 [[B]]) 195*29f98d6cSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = or i32 [[VAL1]], [[VAL2]] 196*29f98d6cSYingwei Zheng; CHECK-NEXT: ret i32 [[RET]] 197*29f98d6cSYingwei Zheng; 198*29f98d6cSYingwei Zheng %val1 = call i32 @llvm.bitreverse.i32(i32 %a) 199*29f98d6cSYingwei Zheng call void @use(i32 %val1) 200*29f98d6cSYingwei Zheng %val2 = call i32 @llvm.bitreverse.i32(i32 %b) 201*29f98d6cSYingwei Zheng %ret = or i32 %val1, %val2 202*29f98d6cSYingwei Zheng ret i32 %ret 203*29f98d6cSYingwei Zheng} 204*29f98d6cSYingwei Zhengdefine i32 @test_or_fshl_constant(i32 %a, i32 %b, i32 %sh) { 205*29f98d6cSYingwei Zheng; CHECK-LABEL: define i32 @test_or_fshl_constant( 206*29f98d6cSYingwei Zheng; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i32 [[SH:%.*]]) { 207*29f98d6cSYingwei Zheng; CHECK-NEXT: [[VAL1:%.*]] = call i32 @llvm.fshl.i32(i32 [[A]], i32 [[B]], i32 [[SH]]) 208*29f98d6cSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = or i32 [[VAL1]], -16777216 209*29f98d6cSYingwei Zheng; CHECK-NEXT: ret i32 [[RET]] 210*29f98d6cSYingwei Zheng; 211*29f98d6cSYingwei Zheng %val1 = call i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 %sh) 212*29f98d6cSYingwei Zheng %ret = or i32 %val1, 4278190080 213*29f98d6cSYingwei Zheng ret i32 %ret 214*29f98d6cSYingwei Zheng} 215*29f98d6cSYingwei Zheng 216*29f98d6cSYingwei Zhengdeclare void @use(i32) 217*29f98d6cSYingwei Zhengdeclare i32 @llvm.fshl.i32(i32, i32, i32) 218*29f98d6cSYingwei Zhengdeclare i32 @llvm.fshr.i32(i32, i32, i32) 219*29f98d6cSYingwei Zhengdeclare i32 @llvm.bitreverse.i32(i32) 220*29f98d6cSYingwei Zhengdeclare i32 @llvm.bswap.i32(i32) 221