phillipstanleymarbell / Noisy-lang-compiler

Noisy language compiler
MIT License
17 stars 1 forks source link

negative index value after constant substitution #636

Closed PeiMu closed 1 year ago

PeiMu commented 1 year ago

A bug is found after the pass, constant substitution. The test case is e_exp.c with range bmx055xAcceleration == [-134.500000 mjf, -133.800000 mjf ],.

IR

%6 = load i32, i32* %5, align 4, !dbg !54
  call void @llvm.dbg.value(metadata i32 %6, metadata !55, metadata !DIExpression()), !dbg !57
  %7 = lshr i32 %6, 31, !dbg !58
  call void @llvm.dbg.value(metadata i32 %7, metadata !59, metadata !DIExpression()), !dbg !57
  call void @llvm.dbg.value(metadata i32 %6, metadata !55, metadata !DIExpression(DW_OP_constu, 2147483647, DW_OP_and, DW_OP_stack_value)), !dbg !57
  %8 = load double, double* %2, align 8, !dbg !60
  %9 = fmul double 0x3FF71547652B82FE, %8, !dbg !65
  %10 = sext i32 %7 to i64, !dbg !66
  %11 = getelementptr inbounds [2 x double], [2 x double]* @halF, i64 0, i64 %10, !dbg !66

Change to

%6 = load i32, i32* %5, align 4, !dbg !54
  call void @llvm.dbg.value(metadata i32 %6, metadata !55, metadata !DIExpression()), !dbg !57
  call void @llvm.dbg.value(metadata i32 -1, metadata !58, metadata !DIExpression()), !dbg !57
  call void @llvm.dbg.value(metadata i32 %6, metadata !55, metadata !DIExpression(DW_OP_constu, 2147483647, DW_OP_and, DW_OP_stack_value)), !dbg !57
  %7 = load double, double* %2, align 8, !dbg !59
  %8 = fmul double 0x3FF71547652B82FE, %7, !dbg !64
  %9 = getelementptr inbounds [2 x double], [2 x double]* @halF, i64 0, i64 -1, !dbg !65
PeiMu commented 1 year ago

This might also be a case to prove the usage of constant substitution.

PeiMu commented 1 year ago

Fixed in #634