A possible code generation issue

Dibyendu Majumdar mobile@majumdar.org.uk
Thu Jan 1 00:00:00 GMT 2015


Also attached are the initial gimples .

Looks like in the failure case the code is being incorrectly
optimized. I wonder if this is a manifestation of the get_address bug,
perhaps the real fix will be better than the patch I am using. I will
use the latest gcc 5 branch and see if that helps.

Regards

> I am getting a failure in one of the Lua tests. Attached are two dumps:
>
> 1. bug_fdump.txt and bug_rdump.txt - these are the versions that fail.
>
>
> 2. The bug_fdump_ok.txt and bug_rdump_ok.txt - this runs ok. The only
> difference between this version and the above is a debug printf call
> in this; so the printf call somehow seems to alter the code being
> generated.
>
> I have also attached the corresponding asm files.
>
>
> I am still using my patched version - not the latest from 5 branch.
-------------- next part --------------
ravif2 (struct ravi_lua_State * L)
{
  struct ravi_CallInfo * D.1181;
  struct ravi_TValue * D.1182;
  sizetype D.1183;
  struct ravi_TValue * D.1184;
  struct ravi_Proto * D.1185;
  struct ravi_TValue * D.1186;
  sizetype D.1187;
  struct ravi_TValue * D.1188;
  signed long D.1189;
  signed int D.1190;
  signed int D.1191;
  signed int D.1192;
  <unnamed type> iftmp.3;
  <unnamed type> iftmp.4;
  <unnamed type> iftmp.5;
  <unnamed type> iftmp.6;
  <unnamed type> D.1213;
  signed int D.1214;
  <unnamed type> iftmp.7;
  <unnamed type> iftmp.8;
  sizetype D.1225;
  struct ravi_TValue * D.1226;
  signed int D.1227;
  struct ravi_TValue * D.1228;
  signed int D.1229;
  <unnamed type> comparison_0_26;
  <unnamed type> comparison_0_22;
  <unnamed type> comparison_0_19;
  <unnamed type> comparison_0_18;
  <unnamed type> comparison_0_17;
  <unnamed type> isfalse_0_16;
  <unnamed type> comparison_0_13;
  <unnamed type> comparison_0_12;
  <unnamed type> comparison_0_11;
  <unnamed type> isfalse_0_10;
  <unnamed type> comparison_0_7;
  <unnamed type> comparison_0_6;
  <unnamed type> comparison_0_5;
  <unnamed type> isfalse_0_4;
  struct ravi_LClosure * cl;
  struct ravi_TValue * base;

  entry:
  D.1181 = L->ci;
  D.1182 = D.1181->func;
  cl = D.1182->value_.gc;
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1181 = L->ci;
  raviV_op_loadnil (D.1181, 0, 0);
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1185 = cl->p;
  D.1186 = D.1185->k;
  D.1187 = 0;
  D.1188 = D.1186 + D.1187;
  D.1189 = D.1188->value_.i;
  D.1184->value_.i = D.1189;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1185 = cl->p;
  D.1186 = D.1185->k;
  D.1187 = 0;
  D.1188 = D.1186 + D.1187;
  D.1190 = D.1188->tt_;
  D.1184->tt_ = D.1190;
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1191 = D.1184->tt_;
  comparison_0_5 = D.1191 == 0;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1191 = D.1184->tt_;
  comparison_0_6 = D.1191 == 1;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1192 = D.1184->value_.b;
  comparison_0_7 = D.1192 == 0;
  if (comparison_0_5 != 0) goto <D.1194>; else goto <D.1197>;
  <D.1197>:
  if (comparison_0_6 != 0) goto <D.1201>; else goto <D.1199>;
  <D.1201>:
  if (comparison_0_7 != 0) goto <D.1202>; else goto <D.1199>;
  <D.1202>:
  iftmp.4 = 1;
  goto <D.1200>;
  <D.1199>:
  iftmp.4 = 0;
  <D.1200>:
  if (iftmp.4 != 0) goto <D.1194>; else goto <D.1195>;
  <D.1194>:
  iftmp.3 = 1;
  goto <D.1196>;
  <D.1195>:
  iftmp.3 = 0;
  <D.1196>:
  isfalse_0_4 = iftmp.3;
  if (isfalse_0_4 == 0) goto OP_TEST_do_jmp_2_8; else goto OP_TEST_do_skip_2_9;
  jmp_5_1:
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1184->value_.b = 0;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1184->tt_ = 1;
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1191 = D.1184->tt_;
  comparison_0_11 = D.1191 == 0;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1191 = D.1184->tt_;
  comparison_0_12 = D.1191 == 1;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1192 = D.1184->value_.b;
  comparison_0_13 = D.1192 == 0;
  if (comparison_0_11 != 0) goto <D.1204>; else goto <D.1207>;
  <D.1207>:
  if (comparison_0_12 != 0) goto <D.1211>; else goto <D.1209>;
  <D.1211>:
  if (comparison_0_13 != 0) goto <D.1212>; else goto <D.1209>;
  <D.1212>:
  iftmp.6 = 1;
  goto <D.1210>;
  <D.1209>:
  iftmp.6 = 0;
  <D.1210>:
  if (iftmp.6 != 0) goto <D.1204>; else goto <D.1205>;
  <D.1204>:
  iftmp.5 = 1;
  goto <D.1206>;
  <D.1205>:
  iftmp.5 = 0;
  <D.1206>:
  isfalse_0_10 = iftmp.5;
  D.1213 = ~isfalse_0_10;
  D.1214 = (signed int) D.1213;
  if (D.1214 == 0) goto OP_TEST_do_jmp_5_14; else goto OP_TEST_do_skip_5_15;
  jmp_9_2:
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1185 = cl->p;
  D.1186 = D.1185->k;
  D.1187 = 0;
  D.1188 = D.1186 + D.1187;
  D.1189 = D.1188->value_.i;
  D.1184->value_.i = D.1189;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1185 = cl->p;
  D.1186 = D.1185->k;
  D.1187 = 0;
  D.1188 = D.1186 + D.1187;
  D.1190 = D.1188->tt_;
  D.1184->tt_ = D.1190;
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1191 = D.1184->tt_;
  comparison_0_17 = D.1191 == 0;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1191 = D.1184->tt_;
  comparison_0_18 = D.1191 == 1;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1192 = D.1184->value_.b;
  comparison_0_19 = D.1192 == 0;
  if (comparison_0_17 != 0) goto <D.1216>; else goto <D.1219>;
  <D.1219>:
  if (comparison_0_18 != 0) goto <D.1223>; else goto <D.1221>;
  <D.1223>:
  if (comparison_0_19 != 0) goto <D.1224>; else goto <D.1221>;
  <D.1224>:
  iftmp.8 = 1;
  goto <D.1222>;
  <D.1221>:
  iftmp.8 = 0;
  <D.1222>:
  if (iftmp.8 != 0) goto <D.1216>; else goto <D.1217>;
  <D.1216>:
  iftmp.7 = 1;
  goto <D.1218>;
  <D.1217>:
  iftmp.7 = 0;
  <D.1218>:
  isfalse_0_16 = iftmp.7;
  if (isfalse_0_16 == 0) goto OP_TEST_do_jmp_9_20; else goto OP_TEST_do_skip_9_21;
  jmp_12_3:
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1184->value_.b = 0;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1184->tt_ = 1;
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1225 = 32;
  D.1226 = base + D.1225;
  L->top = D.1226;
  D.1185 = cl->p;
  D.1227 = D.1185->sizep;
  comparison_0_22 = D.1227 > 0;
  if (comparison_0_22 != 0) goto OP_RETURN_if_sizep_gt_0_12_23; else goto OP_RETURN_else_sizep_gt_0_12_24;
  OP_TEST_do_jmp_2_8:
  goto jmp_5_1;
  OP_TEST_do_skip_2_9:
  goto jmp_5_1;
  OP_TEST_do_jmp_5_14:
  goto jmp_9_2;
  OP_TEST_do_skip_5_15:
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1187 = 0;
  D.1228 = base + D.1187;
  D.1228->value_.b = 1;
  D.1187 = 0;
  D.1228 = base + D.1187;
  D.1228->tt_ = 1;
  goto jmp_9_2;
  OP_TEST_do_jmp_9_20:
  goto jmp_12_3;
  OP_TEST_do_skip_9_21:
  goto jmp_12_3;
  OP_RETURN_if_sizep_gt_0_12_23:
  luaF_close (L, base);
  goto OP_RETURN_else_sizep_gt_0_12_24;
  OP_RETURN_else_sizep_gt_0_12_24:
  D.1183 = 16;
  D.1184 = base + D.1183;
  luaD_poscall (L, D.1184);
  D.1229 = 1;
  return D.1229;
  OP_RETURN_13_25:
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1187 = 0;
  D.1228 = base + D.1187;
  L->top = D.1228;
  D.1185 = cl->p;
  D.1227 = D.1185->sizep;
  comparison_0_26 = D.1227 > 0;
  if (comparison_0_26 != 0) goto OP_RETURN_if_sizep_gt_0_13_27; else goto OP_RETURN_else_sizep_gt_0_13_28;
  OP_RETURN_if_sizep_gt_0_13_27:
  luaF_close (L, base);
  goto OP_RETURN_else_sizep_gt_0_13_28;
  OP_RETURN_else_sizep_gt_0_13_28:
  D.1187 = 0;
  D.1228 = base + D.1187;
  luaD_poscall (L, D.1228);
  D.1229 = 1;
  return D.1229;
}


	.file	"fake.c"
	.section	.text.unlikely,"ax",@progbits
.LCOLDB1:
	.text
.LHOTB1:
	.p2align 4,,15
	.globl	ravif2
	.type	ravif2, @function
ravif2:
.LFB1:
	.cfi_startproc
.L35:
	pushq	%r12
	.cfi_def_cfa_offset 16
	.cfi_offset 12, -16
	xorl	%edx, %edx
	xorl	%esi, %esi
	pushq	%rbp
	.cfi_def_cfa_offset 24
	.cfi_offset 6, -24
	movq	%rdi, %rbp
	pushq	%rbx
	.cfi_def_cfa_offset 32
	.cfi_offset 3, -32
	movq	32(%rdi), %rdi
	movq	(%rdi), %rax
	movq	(%rax), %r12
	call	raviV_op_loadnil@PLT
	movq	32(%rbp), %rax
	movq	32(%rax), %rbx
	movq	24(%r12), %rax
	movq	48(%rax), %rdx
	movl	32(%rax), %eax
	movq	(%rdx), %rcx
	movl	$1, 24(%rbx)
	movq	%rcx, 16(%rbx)
	movq	(%rdx), %rdx
	movq	%rdx, 16(%rbx)
	leaq	32(%rbx), %rdx
	movq	%rdx, 16(%rbp)
	testl	%eax, %eax
	jle	.L36
.L37:
	movq	%rbx, %rsi
	movq	%rbp, %rdi
	call	luaF_close@PLT
.L36:
	leaq	16(%rbx), %rsi
	movq	%rbp, %rdi
	call	luaD_poscall@PLT
	popq	%rbx
	.cfi_def_cfa_offset 24
	movl	$1, %eax
	popq	%rbp
	.cfi_def_cfa_offset 16
	popq	%r12
	.cfi_def_cfa_offset 8
	ret
	.cfi_endproc
.LFE1:
	.size	ravif2, .-ravif2
	.section	.text.unlikely
.LCOLDE1:
	.text
.LHOTE1:
	.ident	"GCC: (GNU) 5.1.0"
	.section	.note.GNU-stack,"",@progbits
../build/lua: assertion failed!
stack traceback:
	[C]: in function 'assert'
	bug.lua: in main chunk
	[C]: in ?
-------------- next part --------------
ravif2 (struct ravi_lua_State * L)
{
  struct ravi_CallInfo * D.1181;
  struct ravi_TValue * D.1182;
  sizetype D.1183;
  struct ravi_TValue * D.1184;
  struct ravi_Proto * D.1185;
  struct ravi_TValue * D.1186;
  sizetype D.1187;
  struct ravi_TValue * D.1188;
  signed long D.1189;
  signed int D.1190;
  signed int D.1191;
  signed int D.1192;
  <unnamed type> iftmp.3;
  <unnamed type> iftmp.4;
  <unnamed type> iftmp.5;
  <unnamed type> iftmp.6;
  <unnamed type> D.1213;
  signed int D.1214;
  <unnamed type> iftmp.7;
  <unnamed type> iftmp.8;
  sizetype D.1225;
  struct ravi_TValue * D.1226;
  signed int D.1227;
  struct ravi_TValue * D.1228;
  signed int D.1229;
  <unnamed type> comparison_0_26;
  <unnamed type> comparison_0_22;
  <unnamed type> comparison_0_19;
  <unnamed type> comparison_0_18;
  <unnamed type> comparison_0_17;
  <unnamed type> isfalse_0_16;
  <unnamed type> comparison_0_13;
  <unnamed type> comparison_0_12;
  <unnamed type> comparison_0_11;
  <unnamed type> isfalse_0_10;
  <unnamed type> comparison_0_7;
  <unnamed type> comparison_0_6;
  <unnamed type> comparison_0_5;
  <unnamed type> isfalse_0_4;
  struct ravi_LClosure * cl;
  struct ravi_TValue * base;

  entry:
  D.1181 = L->ci;
  D.1182 = D.1181->func;
  cl = D.1182->value_.gc;
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1181 = L->ci;
  raviV_op_loadnil (D.1181, 0, 0);
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1185 = cl->p;
  D.1186 = D.1185->k;
  D.1187 = 0;
  D.1188 = D.1186 + D.1187;
  D.1189 = D.1188->value_.i;
  D.1184->value_.i = D.1189;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1185 = cl->p;
  D.1186 = D.1185->k;
  D.1187 = 0;
  D.1188 = D.1186 + D.1187;
  D.1190 = D.1188->tt_;
  D.1184->tt_ = D.1190;
  printf ("OP_TEST(%d C=1)) if (!reg(A=%d)) then skip next else jmp to %d\n", 3, 1, 5);
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1191 = D.1184->tt_;
  comparison_0_5 = D.1191 == 0;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1191 = D.1184->tt_;
  comparison_0_6 = D.1191 == 1;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1192 = D.1184->value_.b;
  comparison_0_7 = D.1192 == 0;
  if (comparison_0_5 != 0) goto <D.1194>; else goto <D.1197>;
  <D.1197>:
  if (comparison_0_6 != 0) goto <D.1201>; else goto <D.1199>;
  <D.1201>:
  if (comparison_0_7 != 0) goto <D.1202>; else goto <D.1199>;
  <D.1202>:
  iftmp.4 = 1;
  goto <D.1200>;
  <D.1199>:
  iftmp.4 = 0;
  <D.1200>:
  if (iftmp.4 != 0) goto <D.1194>; else goto <D.1195>;
  <D.1194>:
  iftmp.3 = 1;
  goto <D.1196>;
  <D.1195>:
  iftmp.3 = 0;
  <D.1196>:
  isfalse_0_4 = iftmp.3;
  if (isfalse_0_4 == 0) goto OP_TEST_do_jmp_2_8; else goto OP_TEST_do_skip_2_9;
  jmp_5_1:
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1184->value_.b = 0;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1184->tt_ = 1;
  printf ("OP_TEST(%d C=0) if (reg(A=%d)) then skip next else jmp to %d\n", 6, 1, 9);
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1191 = D.1184->tt_;
  comparison_0_11 = D.1191 == 0;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1191 = D.1184->tt_;
  comparison_0_12 = D.1191 == 1;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1192 = D.1184->value_.b;
  comparison_0_13 = D.1192 == 0;
  if (comparison_0_11 != 0) goto <D.1204>; else goto <D.1207>;
  <D.1207>:
  if (comparison_0_12 != 0) goto <D.1211>; else goto <D.1209>;
  <D.1211>:
  if (comparison_0_13 != 0) goto <D.1212>; else goto <D.1209>;
  <D.1212>:
  iftmp.6 = 1;
  goto <D.1210>;
  <D.1209>:
  iftmp.6 = 0;
  <D.1210>:
  if (iftmp.6 != 0) goto <D.1204>; else goto <D.1205>;
  <D.1204>:
  iftmp.5 = 1;
  goto <D.1206>;
  <D.1205>:
  iftmp.5 = 0;
  <D.1206>:
  isfalse_0_10 = iftmp.5;
  D.1213 = ~isfalse_0_10;
  D.1214 = (signed int) D.1213;
  if (D.1214 == 0) goto OP_TEST_do_jmp_5_14; else goto OP_TEST_do_skip_5_15;
  jmp_9_2:
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1185 = cl->p;
  D.1186 = D.1185->k;
  D.1187 = 0;
  D.1188 = D.1186 + D.1187;
  D.1189 = D.1188->value_.i;
  D.1184->value_.i = D.1189;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1185 = cl->p;
  D.1186 = D.1185->k;
  D.1187 = 0;
  D.1188 = D.1186 + D.1187;
  D.1190 = D.1188->tt_;
  D.1184->tt_ = D.1190;
  printf ("OP_TEST(%d C=1)) if (!reg(A=%d)) then skip next else jmp to %d\n", 10, 1, 12);
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1191 = D.1184->tt_;
  comparison_0_17 = D.1191 == 0;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1191 = D.1184->tt_;
  comparison_0_18 = D.1191 == 1;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1192 = D.1184->value_.b;
  comparison_0_19 = D.1192 == 0;
  if (comparison_0_17 != 0) goto <D.1216>; else goto <D.1219>;
  <D.1219>:
  if (comparison_0_18 != 0) goto <D.1223>; else goto <D.1221>;
  <D.1223>:
  if (comparison_0_19 != 0) goto <D.1224>; else goto <D.1221>;
  <D.1224>:
  iftmp.8 = 1;
  goto <D.1222>;
  <D.1221>:
  iftmp.8 = 0;
  <D.1222>:
  if (iftmp.8 != 0) goto <D.1216>; else goto <D.1217>;
  <D.1216>:
  iftmp.7 = 1;
  goto <D.1218>;
  <D.1217>:
  iftmp.7 = 0;
  <D.1218>:
  isfalse_0_16 = iftmp.7;
  if (isfalse_0_16 == 0) goto OP_TEST_do_jmp_9_20; else goto OP_TEST_do_skip_9_21;
  jmp_12_3:
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1184->value_.b = 0;
  D.1183 = 16;
  D.1184 = base + D.1183;
  D.1184->tt_ = 1;
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1225 = 32;
  D.1226 = base + D.1225;
  L->top = D.1226;
  D.1185 = cl->p;
  D.1227 = D.1185->sizep;
  comparison_0_22 = D.1227 > 0;
  if (comparison_0_22 != 0) goto OP_RETURN_if_sizep_gt_0_12_23; else goto OP_RETURN_else_sizep_gt_0_12_24;
  OP_TEST_do_jmp_2_8:
  goto jmp_5_1;
  OP_TEST_do_skip_2_9:
  goto jmp_5_1;
  OP_TEST_do_jmp_5_14:
  goto jmp_9_2;
  OP_TEST_do_skip_5_15:
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1187 = 0;
  D.1228 = base + D.1187;
  D.1228->value_.b = 1;
  D.1187 = 0;
  D.1228 = base + D.1187;
  D.1228->tt_ = 1;
  goto jmp_9_2;
  OP_TEST_do_jmp_9_20:
  goto jmp_12_3;
  OP_TEST_do_skip_9_21:
  goto jmp_12_3;
  OP_RETURN_if_sizep_gt_0_12_23:
  luaF_close (L, base);
  goto OP_RETURN_else_sizep_gt_0_12_24;
  OP_RETURN_else_sizep_gt_0_12_24:
  D.1183 = 16;
  D.1184 = base + D.1183;
  luaD_poscall (L, D.1184);
  D.1229 = 1;
  return D.1229;
  OP_RETURN_13_25:
  D.1181 = L->ci;
  base = D.1181->u.l.base;
  D.1187 = 0;
  D.1228 = base + D.1187;
  L->top = D.1228;
  D.1185 = cl->p;
  D.1227 = D.1185->sizep;
  comparison_0_26 = D.1227 > 0;
  if (comparison_0_26 != 0) goto OP_RETURN_if_sizep_gt_0_13_27; else goto OP_RETURN_else_sizep_gt_0_13_28;
  OP_RETURN_if_sizep_gt_0_13_27:
  luaF_close (L, base);
  goto OP_RETURN_else_sizep_gt_0_13_28;
  OP_RETURN_else_sizep_gt_0_13_28:
  D.1187 = 0;
  D.1228 = base + D.1187;
  luaD_poscall (L, D.1228);
  D.1229 = 1;
  return D.1229;
}


	.file	"fake.c"
	.section	.rodata
	.align 8
.LC1:
	.ascii	"OP_TEST(%d C=1)) if (!reg(A=%d)) then skip next else jmp to "
	.ascii	"%d\n"
	.zero	138
	.align 8
.LC2:
	.ascii	"OP_TEST(%d C=0) if (reg(A=%d)) then skip next else jmp to %d"
	.ascii	"\n"
	.zero	140
	.section	.text.unlikely,"ax",@progbits
.LCOLDB3:
	.text
.LHOTB3:
	.p2align 4,,15
	.globl	ravif2
	.type	ravif2, @function
ravif2:
.LFB1:
	.cfi_startproc
.L35:
	pushq	%r12
	.cfi_def_cfa_offset 16
	.cfi_offset 12, -16
	xorl	%edx, %edx
	xorl	%esi, %esi
	pushq	%rbp
	.cfi_def_cfa_offset 24
	.cfi_offset 6, -24
	pushq	%rbx
	.cfi_def_cfa_offset 32
	.cfi_offset 3, -32
	movq	%rdi, %rbx
	movq	32(%rdi), %rdi
	movq	(%rdi), %rax
	movq	(%rax), %r12
	call	raviV_op_loadnil@PLT
	movq	32(%rbx), %rax
	movl	$3, %esi
	leaq	.LC1(%rip), %rdi
	movq	24(%r12), %rdx
	movq	32(%rax), %rax
	movq	48(%rdx), %rdx
	movq	(%rdx), %rcx
	movl	8(%rdx), %edx
	movq	%rcx, 16(%rax)
	movl	$5, %ecx
	movl	%edx, 24(%rax)
	movl	$1, %edx
	xorl	%eax, %eax
	call	printf@PLT
	movq	32(%rbx), %rax
	movl	$1, %edx
	movl	$9, %ecx
	leaq	.LC2(%rip), %rdi
	movl	$6, %esi
	movq	32(%rax), %rax
	movl	$0, 16(%rax)
	movl	$1, 24(%rax)
	xorl	%eax, %eax
	call	printf@PLT
	movq	32(%rbx), %rax
	movq	32(%rax), %rax
	movl	24(%rax), %edx
	testl	%edx, %edx
	je	.L38
	movl	16(%rax), %ecx
	testl	%ecx, %ecx
	je	.L51
.L37:
	movl	$1, (%rax)
	movl	$1, 8(%rax)
.L36:
.L38:
	movq	24(%r12), %rdx
	movl	$10, %esi
	leaq	.LC1(%rip), %rdi
	movq	48(%rdx), %rdx
	movq	(%rdx), %rcx
	movl	8(%rdx), %edx
	movq	%rcx, 16(%rax)
	movl	$12, %ecx
	movl	%edx, 24(%rax)
	movl	$1, %edx
	xorl	%eax, %eax
	call	printf@PLT
	movq	32(%rbx), %rax
	movq	32(%rax), %rbp
	leaq	32(%rbp), %rax
	movl	$0, 16(%rbp)
	movl	$1, 24(%rbp)
	movq	%rax, 16(%rbx)
	movq	24(%r12), %rax
	movl	32(%rax), %eax
	testl	%eax, %eax
	jle	.L40
.L39:
	movq	%rbp, %rsi
	movq	%rbx, %rdi
	call	luaF_close@PLT
.L40:
	leaq	16(%rbp), %rsi
	movq	%rbx, %rdi
	call	luaD_poscall@PLT
	popq	%rbx
	.cfi_remember_state
	.cfi_def_cfa_offset 24
	movl	$1, %eax
	popq	%rbp
	.cfi_def_cfa_offset 16
	popq	%r12
	.cfi_def_cfa_offset 8
	ret
	.p2align 4,,10
	.p2align 3
.L51:
	.cfi_restore_state
	cmpl	$1, %edx
	jne	.L37
	jmp	.L38
	.cfi_endproc
.LFE1:
	.size	ravif2, .-ravif2
	.section	.text.unlikely
.LCOLDE3:
	.text
.LHOTE3:
	.ident	"GCC: (GNU) 5.1.0"
	.section	.note.GNU-stack,"",@progbits


More information about the Jit mailing list