From 77e899c398432fbf7cf9a98737430c21ad8d7c94 Mon Sep 17 00:00:00 2001 From: David Terei Date: Fri, 2 Jul 2010 16:05:11 +0000 Subject: [PATCH] LLVM: Use the inbounds keyword for getelementptr instructions. --- compiler/llvmGen/Llvm/AbsSyn.hs | 3 ++- compiler/llvmGen/Llvm/PpLlvm.hs | 9 +++++---- compiler/llvmGen/LlvmCodeGen/CodeGen.hs | 6 +++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/compiler/llvmGen/Llvm/AbsSyn.hs b/compiler/llvmGen/Llvm/AbsSyn.hs index 1fed3a8..7a5b700 100644 --- a/compiler/llvmGen/Llvm/AbsSyn.hs +++ b/compiler/llvmGen/Llvm/AbsSyn.hs @@ -171,12 +171,13 @@ data LlvmExpression {- | Navigate in an structure, selecting elements + * inbound: Is the pointer inbounds? (computed pointer doesn't overflow) * ptr: Location of the structure * indexes: A list of indexes to select the correct value. For example the first element of the third element of the structure ptr is selected with [3,1] (zero indexed) -} - | GetElemPtr LlvmVar [Int] + | GetElemPtr Bool LlvmVar [Int] {- | Cast the variable from to the to type. This is an abstraction of three diff --git a/compiler/llvmGen/Llvm/PpLlvm.hs b/compiler/llvmGen/Llvm/PpLlvm.hs index 2227fb6..4391fc5 100644 --- a/compiler/llvmGen/Llvm/PpLlvm.hs +++ b/compiler/llvmGen/Llvm/PpLlvm.hs @@ -177,7 +177,7 @@ ppLlvmExpression expr Call tp fp args attrs -> ppCall tp fp args attrs Cast op from to -> ppCast op from to Compare op left right -> ppCmpOp op left right - GetElemPtr ptr indexes -> ppGetElementPtr ptr indexes + GetElemPtr inb ptr indexes -> ppGetElementPtr inb ptr indexes Load ptr -> ppLoad ptr Malloc tp amount -> ppMalloc tp amount Phi tp precessors -> ppPhi tp precessors @@ -268,10 +268,11 @@ ppAlloca tp amount = in text "alloca" <+> texts tp <> comma <+> texts amount' -ppGetElementPtr :: LlvmVar -> [Int] -> Doc -ppGetElementPtr ptr idx = +ppGetElementPtr :: Bool -> LlvmVar -> [Int] -> Doc +ppGetElementPtr inb ptr idx = let indexes = hcat $ map ((comma <+> texts i32 <+>) . texts) idx - in text "getelementptr" <+> texts ptr <> indexes + inbound = if inb then text "inbounds" else empty + in text "getelementptr" <+> inbound <+> texts ptr <> indexes ppReturn :: Maybe LlvmVar -> Doc diff --git a/compiler/llvmGen/LlvmCodeGen/CodeGen.hs b/compiler/llvmGen/LlvmCodeGen/CodeGen.hs index 437570f..8259716 100644 --- a/compiler/llvmGen/LlvmCodeGen/CodeGen.hs +++ b/compiler/llvmGen/LlvmCodeGen/CodeGen.hs @@ -482,7 +482,7 @@ genStore_fast env addr r n val True -> do (env', vval, stmts, top) <- exprToVar env val (gv, s1) <- doExpr grt $ Load gr - (ptr, s2) <- doExpr grt $ GetElemPtr gv [ix] + (ptr, s2) <- doExpr grt $ GetElemPtr True gv [ix] -- We might need a different pointer type, so check case pLower grt == getVarType vval of -- were fine @@ -722,7 +722,7 @@ genMachOp_fast env opt op r n e in case isPointer grt && rem == 0 of True -> do (gv, s1) <- doExpr grt $ Load gr - (ptr, s2) <- doExpr grt $ GetElemPtr gv [ix] + (ptr, s2) <- doExpr grt $ GetElemPtr True gv [ix] (var, s3) <- doExpr llvmWord $ Cast LM_Ptrtoint ptr llvmWord return (env, var, unitOL s1 `snocOL` s2 `snocOL` s3, []) @@ -920,7 +920,7 @@ genLoad_fast env e r n ty = in case isPointer grt && rem == 0 of True -> do (gv, s1) <- doExpr grt $ Load gr - (ptr, s2) <- doExpr grt $ GetElemPtr gv [ix] + (ptr, s2) <- doExpr grt $ GetElemPtr True gv [ix] -- We might need a different pointer type, so check case grt == ty' of -- were fine -- 1.7.10.4