From 98945926ca30a4b9edc0876a59ca35689cbe9855 Mon Sep 17 00:00:00 2001 From: visualfc Date: Thu, 16 May 2024 15:09:00 +0800 Subject: [PATCH] ssa: binop check shl/shr --- cl/_testrt/mask/in.go | 34 ++++++++ cl/_testrt/mask/out.ll | 137 +++++++++++++++++++++++++++++- internal/runtime/error.go | 15 ++++ internal/runtime/llgo_autogen.lla | Bin 6451 -> 6610 bytes ssa/expr.go | 36 +++++--- ssa/ssa_test.go | 4 +- 6 files changed, 212 insertions(+), 14 deletions(-) create mode 100644 internal/runtime/error.go diff --git a/cl/_testrt/mask/in.go b/cl/_testrt/mask/in.go index 18211c06..f5e266e5 100644 --- a/cl/_testrt/mask/in.go +++ b/cl/_testrt/mask/in.go @@ -2,7 +2,41 @@ package main func main() { println(mask(1)) + println(mask_shl(127, 5)) + println(mask_shl8(127, 5)) + println(mask_shl8u(127, 5)) + println(mask_shl8(127, 16)) + println(mask_shl8u(127, 16)) + println(mask_shr(127, 5)) + println(mask_shr8(127, 5)) + println(mask_shr8u(127, 5)) + println(mask_shr8(127, 16)) } + func mask(x int8) int32 { return int32(x) << 31 >> 31 } + +func mask_shl8(x int8, y int) int8 { + return x << y +} + +func mask_shl8u(x uint8, y int) uint8 { + return x << y +} + +func mask_shl(x int, y int) int { + return x << y +} + +func mask_shr8(x int8, y int) int8 { + return x >> y +} + +func mask_shr8u(x uint8, y int) uint8 { + return x >> y +} + +func mask_shr(x int, y int) int { + return x >> y +} diff --git a/cl/_testrt/mask/out.ll b/cl/_testrt/mask/out.ll index bea4f657..c64b738f 100644 --- a/cl/_testrt/mask/out.ll +++ b/cl/_testrt/mask/out.ll @@ -7,6 +7,21 @@ source_filename = "main" @__llgo_argc = global ptr null @__llgo_argv = global ptr null @0 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@1 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@2 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@3 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@4 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@5 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@6 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@7 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@8 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@9 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@10 = private unnamed_addr constant [22 x i8] c"negative shift amount\00", align 1 +@11 = private unnamed_addr constant [22 x i8] c"negative shift amount\00", align 1 +@12 = private unnamed_addr constant [22 x i8] c"negative shift amount\00", align 1 +@13 = private unnamed_addr constant [22 x i8] c"negative shift amount\00", align 1 +@14 = private unnamed_addr constant [22 x i8] c"negative shift amount\00", align 1 +@15 = private unnamed_addr constant [22 x i8] c"negative shift amount\00", align 1 define void @main.init() { _llgo_0: @@ -32,6 +47,49 @@ _llgo_0: call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %3) %4 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @0, i64 1) call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %4) + %5 = call i64 @main.mask_shl(i64 127, i64 5) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %5) + %6 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @1, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %6) + %7 = call i8 @main.mask_shl8(i8 127, i64 5) + %8 = sext i8 %7 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %8) + %9 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @2, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %9) + %10 = call i8 @main.mask_shl8u(i8 127, i64 5) + %11 = sext i8 %10 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %11) + %12 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @3, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %12) + %13 = call i8 @main.mask_shl8(i8 127, i64 16) + %14 = sext i8 %13 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %14) + %15 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @4, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %15) + %16 = call i8 @main.mask_shl8u(i8 127, i64 16) + %17 = sext i8 %16 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %17) + %18 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @5, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %18) + %19 = call i64 @main.mask_shr(i64 127, i64 5) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %19) + %20 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @6, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %20) + %21 = call i8 @main.mask_shr8(i8 127, i64 5) + %22 = sext i8 %21 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %22) + %23 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @7, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %23) + %24 = call i8 @main.mask_shr8u(i8 127, i64 5) + %25 = sext i8 %24 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %25) + %26 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @8, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %26) + %27 = call i8 @main.mask_shr8(i8 127, i64 16) + %28 = sext i8 %27 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %28) + %29 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @9, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %29) ret void } @@ -39,8 +97,79 @@ define i32 @main.mask(i8 %0) { _llgo_0: %1 = sext i8 %0 to i32 %2 = shl i32 %1, 31 - %3 = ashr i32 %2, 31 - ret i32 %3 + %3 = select i1 false, i32 0, i32 %2 + %4 = ashr i32 %3, 31 + ret i32 %4 +} + +define i64 @main.mask_shl(i64 %0, i64 %1) { +_llgo_0: + %2 = icmp slt i64 %1, 0 + %3 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @10, i64 21) + call void @"github.com/goplus/llgo/internal/runtime.CheckRuntimeError"(i1 %2, %"github.com/goplus/llgo/internal/runtime.String" %3) + %4 = icmp uge i64 %1, 64 + %5 = shl i64 %0, %1 + %6 = select i1 %4, i64 0, i64 %5 + ret i64 %6 +} + +define i8 @main.mask_shl8(i8 %0, i64 %1) { +_llgo_0: + %2 = icmp slt i64 %1, 0 + %3 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @11, i64 21) + call void @"github.com/goplus/llgo/internal/runtime.CheckRuntimeError"(i1 %2, %"github.com/goplus/llgo/internal/runtime.String" %3) + %4 = trunc i64 %1 to i8 + %5 = icmp uge i8 %4, 8 + %6 = shl i8 %0, %4 + %7 = select i1 %5, i8 0, i8 %6 + ret i8 %7 +} + +define i8 @main.mask_shl8u(i8 %0, i64 %1) { +_llgo_0: + %2 = icmp slt i64 %1, 0 + %3 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @12, i64 21) + call void @"github.com/goplus/llgo/internal/runtime.CheckRuntimeError"(i1 %2, %"github.com/goplus/llgo/internal/runtime.String" %3) + %4 = trunc i64 %1 to i8 + %5 = icmp uge i8 %4, 8 + %6 = shl i8 %0, %4 + %7 = select i1 %5, i8 0, i8 %6 + ret i8 %7 +} + +define i64 @main.mask_shr(i64 %0, i64 %1) { +_llgo_0: + %2 = icmp slt i64 %1, 0 + %3 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @13, i64 21) + call void @"github.com/goplus/llgo/internal/runtime.CheckRuntimeError"(i1 %2, %"github.com/goplus/llgo/internal/runtime.String" %3) + %4 = icmp uge i64 %1, 64 + %5 = select i1 %4, i64 63, i64 %1 + %6 = ashr i64 %0, %5 + ret i64 %6 +} + +define i8 @main.mask_shr8(i8 %0, i64 %1) { +_llgo_0: + %2 = icmp slt i64 %1, 0 + %3 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @14, i64 21) + call void @"github.com/goplus/llgo/internal/runtime.CheckRuntimeError"(i1 %2, %"github.com/goplus/llgo/internal/runtime.String" %3) + %4 = trunc i64 %1 to i8 + %5 = icmp uge i8 %4, 8 + %6 = select i1 %5, i8 7, i8 %4 + %7 = ashr i8 %0, %6 + ret i8 %7 +} + +define i8 @main.mask_shr8u(i8 %0, i64 %1) { +_llgo_0: + %2 = icmp slt i64 %1, 0 + %3 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @15, i64 21) + call void @"github.com/goplus/llgo/internal/runtime.CheckRuntimeError"(i1 %2, %"github.com/goplus/llgo/internal/runtime.String" %3) + %4 = trunc i64 %1 to i8 + %5 = icmp uge i8 %4, 8 + %6 = lshr i8 %0, %4 + %7 = select i1 %5, i8 0, i8 %6 + ret i8 %7 } declare void @"github.com/goplus/llgo/internal/runtime.init"() @@ -50,3 +179,7 @@ declare void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64) declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") declare %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr, i64) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64) + +declare void @"github.com/goplus/llgo/internal/runtime.CheckRuntimeError"(i1, %"github.com/goplus/llgo/internal/runtime.String") diff --git a/internal/runtime/error.go b/internal/runtime/error.go new file mode 100644 index 00000000..a33d69db --- /dev/null +++ b/internal/runtime/error.go @@ -0,0 +1,15 @@ +package runtime + +type errorString string + +func (e errorString) RuntimeError() {} + +func (e errorString) Error() string { + return "runtime error: " + string(e) +} + +func CheckRuntimeError(b bool, s string) { + if b { + panic(errorString(s).Error()) + } +} diff --git a/internal/runtime/llgo_autogen.lla b/internal/runtime/llgo_autogen.lla index 908e7b5823995df1ddbcc8cfd8fc08008a4f7e89..652fbb7f298b075dbf157be09e9a5c738bc0f410 100644 GIT binary patch literal 6610 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 G;C}(xo1KCH literal 6451 zcmZ{pWmFUZv-cO4?gkZ*E|(DL?(Pl&X;`{by1Tm@=~_AjmWCw-q`Mm=B(Bf%etYk^ zGiTz%od4IEGd~r1AOZmZ06+m;3fAkSiaJX8lK=oyw*UY(fD~YBYw2KQ?B?oVX>QMA zYpbb&3IL|aN?N4-3pY=6035;{902fNfipoH2h!G-jk`}oV#F;fP;%#WMzkd-y{|xS z(EuK!!gntxmoq7Oo16;)HD+hmmk9zFE}jpI%h)TOJ3oBy zUrrsGgoQy>%EK$^(PvK!1MaPSd#`6Io{+e3BcUT2qZ@+^Wr}c zpaHFclZsVDsk8i8w4A=o{#WM>Y1%>d)(Ph}Ut69G`d;o0O4K@@esS^>9*3{zr&H$W z8$P$#SNRwJV8^#+7Wd!PuH*?EDxsL-MieXlR~`4Di;o+&hB0;qYOt5cGrPY1`50@{SwoiHg=Oo?&i;9UNNh)87-e|WRn8qE zxd$-*-6_}~lzJt5@7c5c*ThW)u4E1H@cCKixdHt5>%M5^cm{M1d)UU2E~y-X?0)h1%1dF}WY1M+}WZ`MY=m z|2@;M<<-|n>mix9?P0+D)n9K)IQ;rx?@2|A6-8=L0wuz(r~tiY2AXwA0KqobtQ~V} zuf*Bh3mY-BAJlmV?~3a>T4m=nELzlpM>X;cy0)u9+pzbDPdEE?B1meF0SoNlM{)8E zfI2#E!ygp79(IeqG<_D#(iCm1q!3MUs(}2R1*cBphTw&%@>A-7a+O4m+F#+OL7z(z zEUKocqohK55@KSJ=teZ?M55{rcNl)GH0S@^|HICaT)flRed?}>u=m`Ijz4x z=%m15$W7qr3f%8K>;6(c5Z;u($1V+gV+vg>EZ8fG#gd}k`l4Tua!5jihI@;6esZeU z9cu&DYz{jXnOtdoX;2x^uWab2vbJD&XSzj#@*EdCCowBf9B5g(Sa$xVZw$~9FP15F+x59oQM*jP#Zqr!GqNOUJ|~r zKyz52y|>O|fm)DXlM<jvD*45zGC8ByLYH%&}J{r5m zGZjHhfMx6(fdK^!u9AhsDK6qiGDHtKZOVR(8h+F$-)8h&;ZI%dj` zj`wdneKfKSp+_=(dO!Q7#7k?)sa ztd@_>S<2}NCwMZb!%p+eZ<=iV(k5Yz%jLFoNiF1Bc2^iW69r3JFLi}Q{I-c}M8^}?);vVWT87+V(aR%C9ci~A1(Q`>Mkg*5N(?of{#Xir9FeMrmu zDRjwlq6)+t)xh5FOg&QN{WRJuT}W00UCL~mUry^2E1usOTt62sWy<%17_1C{2E?7& zK=`lX-B#^*Ty2;`^%B_R#S&#%`BF#1T@RSBf>OIRFBY?&5N=&%r_ybOJsx3V;uZQU z%c}eggg@Ai9P^HH0$=jdF-)tK!uAabQ)<4{g{Mf2O_f=N{y@j7iejceG%~>Psbr~;ZGL1n=?z`fJNvnd>dX{5(k*YVCU7*Z;aB$T zS+GC+T|+u#;*^in;a&cuxW7dbP3|nwr$_@m_3DBMT~UngjKYHhH9vlD714NIr|VMR zRa9tzVZY8>V4Bnr-bFE;CSFt3+teX$IE%DGf&!;4PMJy{-I@L&0dFK#Oe_l#E>~iJ zV){1>My>`QCzV=bajyWAWRGw7s`i#H z={odQ>7MtlS39N`$3R;;%ddfHbS08@Eu&2IjZ?@m8BL}a&7YAszBeUqpT%o*am-{2XL8I^ zkGMnumI%gRhaom`suZLC7}%Qmd5PC?u}TQIv)fX2J7*cI#gfo!K0FCYe&B<1QQtES zy2ixcRaV+O5!tVPY7e(tc9fs29(G0=QO42kiA^F=6Dj`k*@JmuKQ6O5erdzT=~P7N zERc(M`eq%lFVYx*M5{HkV|sMn41FKM(S~Wh-h92t5t7R+cHZc9xkzn9ifAglE<wvF|M=BXJ3+X=zc{ValmyF;NbW$$8!6~v zmV%zCkvR`vQj5;i&&}N}3W>A+%o^Ypy$yiV@^4(~X=MkpY|gz``d`yuem<-4p~1S{iAv$U-hH(_Yl ztZ*%$@0pWSFL)@uRF$e3R}zzyT8h?Rm~%UcQzS6j7jT?+2(W`*WvqA{wYmBa0avM{0w?wjZ#qtg2JQ>GzQY$lkH22J4;;e06QnvAfn&olrSxUz4S z28HyC7bId3Fn~&D^>~(INNrJQpZZn{v4Y!$Kpdkw<{pTYAHa0UQWU%^?}_)YKcj~x zj{P<+BYPG|A=gK{u_n%mZMQb349|&xMsk&JZ$n?kVX=ZcY*SrQ^L`HLk^N7EPiwvpQ zj4Y7y7t}zPo{)4B2jNmp6m)`pzJ+tdyKF&oWz?c%yY0+GuYqQqD^ew8Sh)6@KIYN; z$s_|*`MEOj;9nww4OZCm0oF=%slJUUiA%=1b{8H5#2nPR=&$hZ1BufIC*q-hO8S(N zpH*wo14t@-z7YTv_QZ+xLvrK=2ECy4cugJff4o4Qbyty~93*_1&X4NxJaJ|T^kBzW zD`#MQo+arxj`Hp?XGA*+EB$(LZmPK>Y0 zafw2?`(rvcIt<`;X2K$8Y}!pLnq6%k93X^Zr60&6k6-+ZDbNSG~3-m$BoqK z4E`nJs>(h{3}<0U!+R8if_!X-dp!UqA{d1bkA$*vASa_>xtsdXKBy6?vFxf$e@cWy zmHs5gha2LWq^6r*$g0+!mvekoaFz!WNJ_CcqWi3x^Z{p(a$V#n>%l{5#A@7M=UCBl zxDPqS3A=J(b_*0fz)zH1p>Q6h-r` zl*R)t`mT-%M_WG*LY=^8+Xps6l{Ch zFT2j-S>uB2vy#K`NlkmSscC8vHDjy`JvtmPndOrAb^I4dpCLu9N0f>)jK7j6G`>Hi zr2QCbd{$@u4VP8Z555@zp?JS%Zf9Z!ozpT;P9mo@o8aORxNMW%{ADqMjCq#YQqZfH zd{}&JQCVI0$)^>>Z-~d#%^rmof-r&ZRkAPg1J`p=5}U%*FhLK)Yt|*uY8r;spK$2} ztM`;?L%Z!lbaO)(y(U7lrS_FiQ6({P6OgSSq5~5SB%9O+rAOz!q%W>w3hoj@iOXc)@cXCH^_kWEMli0`A*eZ+PtKD%h`>%h#@XiYo13`@Jht;kB#Z z4S*!MeH|Ij1FrNp0TSk0M_rffBh>&ZG)rrJpcq`Jiw1G268>8=)Zbz0&X!g!b68Sm zxkG;}Ll!A1v8-CX+X=7n>4kG3H2~H4Zg_c}yu-t-^m8 zQg}!H(rBhZ;#FdoX%KtcoxGk#keAkMh#s#Eh?jr2zEHN&#DrmknSSY z>xIbhiSfQ|uhvL?HEX*yi-+jCrM!uNwTXWQVn8lXkdU)6Ee`|Tti_9>e2M0gOXYs^JgG^V3e>Zk6kPskV8Tv2RQgDN>!}i?dDol3H)=J@ zni3_YOBR!Zis407uMG`hOqwF!Ov1+p0miOT2spF+E-(oYfcee#uX>hIt>Vnes^#2WXN0v zaCaKCw>LRw5JdLz1yxba*CIx*5BDnr(_~Ifw~n($MUCh##x`{Pm+)up2ib6ZwEvy_ zF4hHNrBS{2KVMvf)qYtn&e*wfJlvd%p|^-gAw+qTjVp~bj+#=T=ssykvZdh0aLUF& zIdSx5s%U{=ukX8(_@Zf%Wd5dV14A^|Lu}e)c5?o>5XN2&WR4g3?)iSMl;QxAy+RXP_b2XXZ#fmh2!$CQbItgj$^B9@r@V$uKmzRq ztS-{?s!DwnzWs$Af=3beVH%qkW7mwIgWQ<}@)7q0Bne~SfFu|z9M4;bRIZ`DAjjN& z|H3JXu?K+`z9FZ&YEqz~j~N%vd+V>cH0YUUfcq-CB*8z`#|FYn&s#L0@ufmyl~EFi zVbXJ$VM%86l-5#eUcZ#vj0t*Je{4TKQ`U#w5xQHyn0_x2WU+-XT}|Jj|^eS(`6rav61 z$1FlWci<@n^1t0+FglrZ6HW6Rm+-}*$KVop-(y~GNHT|;hEzY~Q zT>eG@TRmLz9MYdzS6M2fR`BZ%Z#%x4#7a1I`aZro4ZDl(&xgEMyAD-<^ke9OX!=z; z9!b-=nr$(9X2I2jvJx~287x8q(n%Roj8$6oyCSELO!%og2B zdcv|+R#@=pmr^Q7*#tm<3s&>FQ_d+JT^^c5#t_VEAb4Mzbt10X%z<<)3fnqP`iC98 zrDg1ros$j=+eVyr1rhzZgHOe_`BD@4MBfJyjq#1~i^F|VmTbH9QZIRoA;qkGL&nZ_ z)|B6g`uLQ$ECYeMVK(ZYw9*=ydmp>P20DO)VX!Z!e~!lj6ZtaAB1TKC+(Oipg%fFB zhQiaM8S<#|8?|`SaTjp?h*vRdc-*QBQn#okB}A*{ep&_YS@%*e*IcU)Y_t$}MdUk3 zu}F(PcNKc@v06HRS&(Kb3~eZxIM!M-tnQwT!V{+Z+gd!g+-c^Z z>h?1srOvd={$cYE+d7$fyfmH2VZUEdHvjuuJXc%2OheuoisVE&BY|sdlUI%=+5SfD zU$FdDIm|ZANj&ZN#&~*NxMx|wFl(n1vz~~~XKNfCL3^K@pvk%{oOw>U`KjLAn`iP? zb^LaQV{Z6B@b7NdT=@ZQ_i0y2dVcz?h~xSIvSpf2f#RiN%bQ)2!;ibx$ezl5hve@R znJ9r=N8E()Dnf88C|P(e$e^%&Ec8Z5<9WRdZ?Ji027L4&D)Y%Z0-c6c3Mi@;l?R_w zQ0iFsQO>tSa+1F5q*VBr)y76<0`*Ew2ErRaEROJ{_)9>-zx-BW4ywex0n~UE&0u3k zgj$dn;Bo={9z?2Z%2dbIXETvm!(bJiW|;yWJg=+ucIQ}~gTt%FE2~!zF4A@`9#*Cw zU54#k%6DM7&68`!;g1>ocG>(N{m-lI?B9PTb-C_xyT;m>i*`lTv&z(@fhP0$8j~t!TV#fhoWm6D$RagMzLb^=5s}UCOj?GF>m1_jk44 z)piA^8mt>TQ5x+WUcA0W=p*LL1Apudp7m;@*Cve(^zHXKB21@+#&$1-$0)nkiL*P2 z&)p1MdzA0+tkU!u+^YN;pyJg-`rUU@VR{>09Jl>Ex~0P(N(-=P=7ZBalMxir37?qu zN-_`23@7zj_+}d$IbYd`3>{SG>UUZUjZbdo^yFnt$K#zR?l>TS=%lIeBx*8dLkKm9 z!zpJcKnq9`9)J(;dFnX&em0p=FDI60r-3@{xau4YwY@e&49E;(G$U6)67= zUPT@bo*ejpk&J&xzP~{{!IB BPy7G? diff --git a/ssa/expr.go b/ssa/expr.go index 7dfa45a0..1ebf1973 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -320,20 +320,36 @@ func (b Builder) BinOp(op token.Token, x, y Expr) Expr { } } case isLogicOp(op): // op: & | ^ << >> &^ - if op == token.AND_NOT { + switch op { + case token.AND_NOT: return Expr{b.impl.CreateAnd(x.impl, b.impl.CreateNot(y.impl, ""), ""), x.Type} - } - kind := x.kind - llop := logicOpToLLVM[op-logicOpBase] - if op == token.SHR && kind == vkUnsigned { - llop = llvm.LShr // Logical Shift Right - } - if op == token.SHL || op == token.SHR { - if b.Prog.SizeOf(x.Type) != b.Prog.SizeOf(y.Type) { + case token.SHL, token.SHR: + if y.kind == vkSigned { + check := Expr{b.impl.CreateICmp(llvm.IntSLT, y.impl, llvm.ConstInt(y.ll, 0, false), ""), b.Prog.Bool()} + b.InlineCall(b.Func.Pkg.rtFunc("CheckRuntimeError"), check, b.Str("negative shift amount")) + } + xsize, ysize := b.Prog.SizeOf(x.Type), b.Prog.SizeOf(y.Type) + if xsize != ysize { y = b.Convert(x.Type, y) } + overflows := b.impl.CreateICmp(llvm.IntUGE, y.impl, llvm.ConstInt(y.ll, xsize*8, false), "") + xzero := llvm.ConstInt(x.ll, 0, false) + if op == token.SHL { + rhs := b.impl.CreateShl(x.impl, y.impl, "") + return Expr{b.impl.CreateSelect(overflows, xzero, rhs, ""), x.Type} + } else { + if x.kind == vkSigned { + rhs := b.impl.CreateSelect(overflows, llvm.ConstInt(y.ll, 8*xsize-1, false), y.impl, "") + return Expr{b.impl.CreateAShr(x.impl, rhs, ""), x.Type} + } else { + rsh := b.impl.CreateLShr(x.impl, y.impl, "") + return Expr{b.impl.CreateSelect(overflows, xzero, rsh, ""), x.Type} + } + } + default: + llop := logicOpToLLVM[op-logicOpBase] + return Expr{llvm.CreateBinOp(b.impl, llop, x.impl, y.impl), x.Type} } - return Expr{llvm.CreateBinOp(b.impl, llop, x.impl, y.impl), x.Type} case isPredOp(op): // op: == != < <= < >= tret := b.Prog.Bool() kind := x.kind diff --git a/ssa/ssa_test.go b/ssa/ssa_test.go index 13a98552..daac56f2 100644 --- a/ssa/ssa_test.go +++ b/ssa/ssa_test.go @@ -446,7 +446,7 @@ func TestUnOp(t *testing.T) { b := fn.MakeBody(1) ptr := fn.Param(0) val := b.UnOp(token.MUL, ptr) - val2 := b.BinOp(token.SHR, val, prog.Val(1)) + val2 := b.BinOp(token.XOR, val, prog.Val(1)) b.Store(ptr, val2) b.Return(val2) assertPkg(t, pkg, `; ModuleID = 'foo/bar' @@ -455,7 +455,7 @@ source_filename = "foo/bar" define i64 @fn(ptr %0) { _llgo_0: %1 = load i64, ptr %0, align 4 - %2 = ashr i64 %1, 1 + %2 = xor i64 %1, 1 store i64 %2, ptr %0, align 4 ret i64 %2 }