Issue |
86763
|
Summary |
[RISC-V] Miscompile with LTO and -fno-strict-aliasing
|
Labels |
new issue
|
Assignees |
|
Reporter |
patrick-rivos
|
Testcase:
```c
long a, c;
char e = 17;
int f[20];
_Bool g[20];
unsigned b;
int h[500];
void d(char i, int j[]) {
for (int l = 1; l < i; l++) {
a = ({ f[l] ?: e; });
b &= (e ? ~j[0] : 1) ? 1 ? g[l] : 0 : 1;
for (; c;)
;
}
}
int main() {
b = 5;
for (long l = 0; l < 20; ++l)
f[l] = g[l] = 1;
for (long l = 0; l < 13; ++l)
for (long m = 0; m < 13; ++m)
h[l * 13 + m] = 1;
d(e, f);
__builtin_printf("%d\n", b);
}
```
Commands:
```bash
> /scratch/tc-testing/tc-mar-25/build-rv64gcv/bin/clang -march=rv64gcv -flto -O3 -fuse-ld=lld red.c -o red.out -fno-strict-aliasing
> /scratch/tc-testing/tc-mar-25/build-rv64gcv/bin/qemu-riscv64 red.out
5
> /scratch/tc-testing/tc-mar-25/build-rv64gcv/bin/clang -march=rv64gcv -flto -O3 -fuse-ld=lld red.c -o red.out
> /scratch/tc-testing/tc-mar-25/build-rv64gcv/bin/qemu-riscv64 red.out
1
```
Reduced llvm-ir
```llvm ir
target datalayout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128"
target triple = "riscv64-unknown-linux-gnu"
@e = global i8 17
@f = global [20 x i32] zeroinitializer
@g = global [20 x i8] zeroinitializer
@b = global i32 0
@.str = constant [4 x i8] c"%d\0A\00"
define void @d(i8 %i, ptr %j) #0 {
entry:
%conv = sext i8 %i to i64
br label %for.body.us27
for.body.us27: ; preds = %cond.end16.us39, %entry
%indvars.iv = phi i64 [ 1, %entry ], [ %indvars.iv.next, %cond.end16.us39 ]
%0 = load i32, ptr %j, align 4
%tobool8.not.us = icmp eq i32 %0, -1
br i1 %tobool8.not.us, label %cond.end16.us39, label %cond.true10.us36
cond.true10.us36: ; preds = %for.body.us27
%arrayidx12.us37 = getelementptr [20 x i8], ptr @g, i64 0, i64 %indvars.iv
%1 = load i8, ptr %arrayidx12.us37, align 1, !range !1
%conv14.us38 = zext i8 %1 to i32
br label %cond.end16.us39
cond.end16.us39: ; preds = %cond.true10.us36, %for.body.us27
%cond17.us40 = phi i32 [ %conv14.us38, %cond.true10.us36 ], [ 1, %for.body.us27 ]
%2 = load i32, ptr @b, align 4
%and.us41 = and i32 %2, %cond17.us40
store i32 %and.us41, ptr @b, align 4
%indvars.iv.next = add i64 %indvars.iv, 1
%exitcond.not = icmp eq i64 %indvars.iv.next, %conv
br i1 %exitcond.not, label %for.cond.cleanup, label %for.body.us27
for.cond.cleanup: ; preds = %cond.end16.us39
ret void
}
define i32 @main() {
entry:
store i32 5, ptr @b, align 4
tail call void @llvm.memset.p0.i64(ptr @g, i8 1, i64 20, i1 false)
store <8 x i32> zeroinitializer, ptr @f, align 32
%0 = load i8, ptr @e, align 1
tail call void @d(i8 %0, ptr @f)
%1 = load i32, ptr @b, align 4
%call = tail call i32 (ptr, ...) @printf(ptr @.str, i32 %1)
ret i32 0
}
declare i32 @printf(ptr, ...)
; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #1
attributes #0 = { "target-features"="+64bit,+a,+c,+d,+f,+m,+relax,+v,+zicsr,+zifencei,+zve32f,+zve32x,+zve64d,+zve64f,+zve64x,+zvl128b,+zvl32b,+zvl64b,-e,-experimental-smmpm,-experimental-smnpm,-experimental-ssnpm,-experimental-sspm,-experimental-ssqosid,-experimental-supm,-experimental-zaamo,-experimental-zabha,-experimental-zalasr,-experimental-zalrsc,-experimental-zcmop,-experimental-zfbfmin,-experimental-zicfilp,-experimental-zicfiss,-experimental-zimop,-experimental-ztso,-experimental-zvfbfmin,-experimental-zvfbfwma,-h,-shcounterenw,-shgatpa,-shtvala,-shvsatpa,-shvstvala,-shvstvecd,-smaia,-smepmp,-ssaia,-ssccptr,-sscofpmf,-sscounterenw,-ssstateen,-ssstrict,-sstc,-sstvala,-sstvecd,-ssu64xl,-svade,-svadu,-svbare,-svinval,-svnapot,-svpbmt,-xcvalu,-xcvbi,-xcvbitmanip,-xcvelw,-xcvmac,-xcvmem,-xcvsimd,-xsfcease,-xsfvcp,-xsfvfnrclipxfqf,-xsfvfwmaccqqq,-xsfvqmaccdod,-xsfvqmaccqoq,-xsifivecdiscarddlone,-xsifivecflushdlone,-xtheadba,-xtheadbb,-xtheadbs,-xtheadcmo,-xtheadcondmov,-xtheadfmemidx,-xtheadmac,-xtheadmemidx,-xtheadmempair,-xtheadsync,-xtheadvdot,-xventanacondops,-za128rs,-za64rs,-zacas,-zawrs,-zba,-zbb,-zbc,-zbkb,-zbkc,-zbkx,-zbs,-zca,-zcb,-zcd,-zce,-zcf,-zcmp,-zcmt,-zdinx,-zfa,-zfh,-zfhmin,-zfinx,-zhinx,-zhinxmin,-zic64b,-zicbom,-zicbop,-zicboz,-ziccamoa,-ziccif,-zicclsm,-ziccrse,-zicntr,-zicond,-zihintntl,-zihintpause,-zihpm,-zk,-zkn,-zknd,-zkne,-zknh,-zkr,-zks,-zksed,-zksh,-zkt,-zmmul,-zvbb,-zvbc,-zvfh,-zvfhmin,-zvkb,-zvkg,-zvkn,-zvknc,-zvkned,-zvkng,-zvknha,-zvknhb,-zvks,-zvksc,-zvksed,-zvksg,-zvksh,-zvkt,-zvl1024b,-zvl16384b,-zvl2048b,-zvl256b,-zvl32768b,-zvl4096b,-zvl512b,-zvl65536b,-zvl8192b" }
attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: write) }
!llvm.module.flags = !{!0}
!0 = !{i32 1, !"target-abi", !"lp64d"}
!1 = !{i8 0, i8 2}
```
Discovered/tested using 3e6e54eb795ce7a1ccd47df8c22fc08125a88886
Found via fuzzer.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs