google / google/xls

JIT miscompare, crasher aeea

Open
#376 0 comments 0 reactions 0 assignees View on GitHub
fuzz jit
Dominant language
C++
Stars
1.9k
Forks
283
Avg merge
2d 10h
Merged PRs (30d)
135

Description

Minimized IR:
```
package sample

fn __sample__main(x0: bits[34], x1: bits[52][6], x3: bits[40], x4: (bits[3]), x5: bits[17]) -> (bits[41], bits[41]) {
x15: bits[41] = literal(value=1099511627775, id=40, pos=0,36,21)
zero_ext.127: bits[41] = zero_ext(x5, new_bit_count=41, id=127)
x19: bits[40] = reverse(x3, id=44, pos=0,40,20)
x31: bits[41] = add(x15, zero_ext.127, id=53, pos=0,44,23)
zero_ext.62: bits[41] = zero_ext(x19, new_bit_count=41, id=62)
x36: bits[41] = and(x31, zero_ext.62, id=63, pos=0,49,23)
ret tuple.126: (bits[41], bits[41]) = tuple(x36, x31, id=126, pos=0,54,2)
}
```

Repro:

```
xls/tools/eval_ir_main --random_inputs=100 minimized.ir --test_llvm_jit
```

FWIW Alive doesn't find an issue with the before opt / after opt LLVM IR: https://alive2.llvm.org/ce/z/v-76Xq

```
define void @src([5 x i8*]* %0, { i41, i41 }* %1, i64 %2, i64 %3) {
so_basic:
%4 = getelementptr [5 x i8*], [5 x i8*]* %0, i64 0, i64 0
%5 = load i8*, i8** %4, align 8
%6 = bitcast i8* %5 to i34*
%x0 = load i34, i34* %6, align 8
%7 = getelementptr [5 x i8*], [5 x i8*]* %0, i64 0, i64 1
%8 = load i8*, i8** %7, align 8
%9 = bitcast i8* %8 to [6 x i52]*
%x1 = load [6 x i52], [6 x i52]* %9, align 8
%10 = getelementptr [5 x i8*], [5 x i8*]* %0, i64 0, i64 3
%11 = load i8*, i8** %10, align 8
%12 = bitcast i8* %11 to { i3 }*
%x4 = load { i3 }, { i3 }* %12, align 1
%13 = getelementptr [5 x i8*], [5 x i8*]* %0, i64 0, i64 4
%14 = load i8*, i8** %13, align 8
%15 = bitcast i8* %14 to i17*
%x5 = load i17, i17* %15, align 4
%zero_ext_127 = zext i17 %x5 to i41
%x31 = add i41 1099511627775, %zero_ext_127
%16 = getelementptr [5 x i8*], [5 x i8*]* %0, i64 0, i64 2
%17 = load i8*, i8** %16, align 8
%18 = bitcast i8* %17 to i40*
%x3 = load i40, i40* %18, align 8
%x19 = call i40 @llvm.bitreverse.i40(i40 %x3)
%zero_ext_62 = zext i40 %x19 to i41
%x36 = and i41 %x31, %zero_ext_62
%19 = insertvalue { i41, i41 } zeroinitializer, i41 %x36, 0
%tuple_126 = insertvalue { i41, i41 } %19, i41 %x31, 1
store { i41, i41 } %tuple_126, { i41, i41 }* %1, align 8
ret void
}

define void @tgt([5 x i8*]* nocapture readonly %0, { i41, i41 }* nocapture %1, i64 %2, i64 %3) local_unnamed_addr #0 {
so_basic:
%4 = getelementptr [5 x i8*], [5 x i8*]* %0, i64 0, i64 4
%5 = bitcast i8** %4 to i17**
%6 = load i17*, i17** %5, align 8
%x5 = load i17, i17* %6, align 4
%zero_ext_127 = zext i17 %x5 to i41
%x31 = add nuw i41 %zero_ext_127, 1099511627775
%7 = getelementptr [5 x i8*], [5 x i8*]* %0, i64 0, i64 2
%8 = bitcast i8** %7 to i40**
%9 = load i40*, i40** %8, align 8
%x3 = load i40, i40* %9, align 8
%x19 = tail call i40 @llvm.bitreverse.i40(i40 %x3)
%zero_ext_62 = zext i40 %x19 to i41
%x36 = and i41 %x31, %zero_ext_62
%.repack3 = bitcast { i41, i41 }* %1 to i41*
store i41 %x36, i41* %.repack3, align 8
%.repack1 = getelementptr inbounds { i41, i41 }, { i41, i41 }* %1, i64 0, i32 1
store i41 %x31, i41* %.repack1, align 8
ret void
}

; Function Attrs: nofree nosync nounwind readnone speculatable willreturn
declare i40 @llvm.bitreverse.i40(i40) #0
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.