<html dir="ltr"><head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style title="owaParaStyle"><!--P {
        MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
}
--></style>
</head>
<body ocsi="x">
<div dir="ltr"><font color="#000000" size="2" face="Tahoma">Hi all</font></div>
<div dir="ltr"><font size="2" face="Tahoma"></font> </div>
<div dir="ltr"><font size="2" face="Tahoma">isBounsIndices() function decides to set inbounds flag and uses one-past-the-end </font></div>
<div dir="ltr"><font size="2" face="Tahoma">rule about index. I think one-past-the-end rule is applied to multi-dimensional</font></div>
<div dir="ltr"><font size="2" face="Tahoma">array and struct array.</font></div>
<div dir="ltr"><font size="2" face="Tahoma"></font> </div>
<div dir="ltr"><font size="2" face="Tahoma">What do you think about this?</font></div>
<div dir="ltr"><font size="2" face="Tahoma"></font> </div>
<div dir="ltr"><font size="2" face="Tahoma">I tested the following code.</font></div>
<div dir="ltr"><font size="2" face="Tahoma"></font> </div>
<div dir="ltr"><font size="2" face="Tahoma">char a[3][2];</font></div>
<div dir="ltr"><font size="2" face="Tahoma">struct test {<br>
  char a;<br>
  int b;<br>
};</font></div>
<div dir="ltr"><font size="2" face="Tahoma">struct test foo[3];</font></div>
<div dir="ltr"><font size="2" face="Tahoma">int main(void) {<br>
  a[2][1] = 1;<br>
  a[3][0] = 2;<br>
  a[3][1] = 3;<br>
  a[3][2] = 4;</font></div>
<div dir="ltr"><font size="2" face="Tahoma">  foo[2].a = 5;<br>
  foo[3].a = 6;<br>
  foo[3].b = 7;<br>
}<br>
------------------------------------------------------------------</font></div>
<div dir="ltr"><font size="2" face="Tahoma">define i32 @main() nounwind {<br>
entry:<br>
  %retval = alloca i32<br>
  %"alloca point" = bitcast i32 0 to i32<br>
  store i8 1, i8* getelementptr inbounds ([3 x [2 x i8]]* @a, i32 0, i32 2, i32 1), align 1<br>
  store i8 2, i8* getelementptr inbounds ([3 x [2 x i8]]* @a, i32 1, i32 0, i32 0), align 1<br>
  store i8 3, i8* getelementptr ([3 x [2 x i8]]* @a, i32 1, i32 0, i32 1), align 1<br>
  store i8 4, i8* getelementptr ([3 x [2 x i8]]* @a, i32 1, i32 1, i32 0), align 1<br>
  store i8 5, i8* getelementptr inbounds ([3 x %struct.test]* @foo, i32 0, i32 2, i32 0), align 4<br>
  store i8 6, i8* getelementptr inbounds ([3 x %struct.test]* @foo, i32 1, i32 0, i32 0), align 4<br>
  store i32 7, i32* getelementptr ([3 x %struct.test]* @foo, i32 1, i32 0, i32 1), align 4<br>
  br label %return</font></div>
<div dir="ltr"><font size="2" face="Tahoma">return:                                           ; preds = %entry<br>
  %retval1 = load i32* %retval<br>
  ret i32 %retval1<br>
}<br>
-------------------------------------------------------------------</font></div>
<div dir="ltr"><font size="2" face="Tahoma">isInBoundsIndices() doesn't return inbounds flag as true on</font></div>
<div dir="ltr"><font size="2" face="Tahoma">a[3][1] = 3,  a[3][2] = 4 and  foo[3].b = 7.</font></div>
<div dir="ltr"><font size="2" face="Tahoma"></font> </div>
<div dir="ltr"><font size="2" face="Tahoma">I made a patch to fix this.</font></div>
<div dir="ltr"><font size="2" face="Tahoma"></font> </div>
<div dir="ltr"><font size="2" face="tahoma">This patch has a little "if-else" statements to process some of cases.</font></div>
<div dir="ltr">
<div dir="ltr"><font size="2" face="tahoma">If you find a better solution, please let me know. :)
</font></div>
<div dir="ltr"><font size="2" face="tahoma"></font> </div>
<div dir="ltr">
<div dir="ltr"><font size="2" face="Tahoma">Please review the attached patch.</font></div>
</div>
<div dir="ltr"><font size="2" face="tahoma"></font> </div>
</div>
<div dir="ltr"><font size="2" face="Tahoma">Thanks,</font></div>
<div dir="ltr"><font size="2" face="Tahoma">Jin-Gu Kang</font></div>
<p> </p>
</body>
</html>