| Issue |
124213
|
| Summary |
Miscompile after #122723
|
| Labels |
new issue
|
| Assignees |
artagnon
|
| Reporter |
alexfh
|
#122723 introduced a miscompilation. I've reduced it to this:
```
$ cat q.ll
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
%struct.wombat = type { %struct.snork }
%struct.snork = type { [1 x i32] }
%struct.wobble = type { %struct.snork }
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #0
define void @wobble() {
%alloca = alloca [0 x [0 x [0 x [0 x %struct.wombat]]]], i32 0, align 4
call void @pluto(ptr %alloca)
%call = call i1 @wibble(ptr %alloca, double 5.000000e-01)
br i1 %call, label %bb3, label %bb1
bb1: ; preds = %bb
%call2 = call i1 @hoge(ptr %alloca, double -5.000000e-01)
br i1 %call2, label %bb3, label %bb4
bb3: ; preds = %bb1, %bb
call void @llvm.lifetime.start.p0(i64 0, ptr null)
br label %bb4
bb4: ; preds = %bb3, %bb1
ret void
}
define void @pluto(ptr %arg) {
%load = load volatile i1, ptr %arg, align 1
call void @ham(ptr %arg)
ret void
}
define i1 @wibble(ptr %arg, double %arg1) {
%call = call i1 @hoge(ptr %arg, double %arg1)
%xor = xor i1 %call, true
ret i1 %xor
}
define i1 @hoge(ptr %arg, double %arg1) {
%alloca = alloca [0 x [0 x [0 x [0 x %struct.wobble]]]], i32 0, align 4
%call = call i1 @blam.1(ptr %arg)
%fcmp = fcmp uge double %arg1, 0.000000e+00
%xor = xor i1 %call, %fcmp
br i1 %xor, label %bb4, label %bb2
bb2: ; preds = %bb
%call3 = call i1 @blam.1(ptr %arg)
br label %bb7
bb4: ; preds = %bb
%call5 = call double @quux(double %arg1)
call void @barney(ptr %alloca, double %call5)
%call6 = call i1 @pluto.2(ptr %arg, ptr %alloca)
br label %bb7
bb7: ; preds = %bb4, %bb2
%phi = phi i1 [ %call3, %bb2 ], [ %call6, %bb4 ]
ret i1 %phi
}
define i1 @wombat(ptr %arg, ptr %arg1) {
%call = call i1 @foo(ptr %arg, ptr %arg1)
ret i1 %call
}
define i1 @foo(ptr %arg, ptr %arg1) {
%load = load i32, ptr %arg, align 4
%load2 = load i32, ptr %arg1, align 4
%icmp = icmp slt i32 %load, %load2
ret i1 %icmp
}
define void @barney(ptr %arg, double %arg1) {
call void @blam(double %arg1, ptr %arg)
ret void
}
define void @blam(double %arg, ptr %arg1) {
%fcmp = fcmp olt double %arg, 0.000000e+00
%fmul = fmul double %arg, 0x41F0000000000000
%select = select i1 %fcmp, double 0.000000e+00, double %fmul
%fptoui = fptoui double %select to i32
%sext = sext i1 %fcmp to i32
%xor = xor i32 %fptoui, %sext
store i32 %xor, ptr %arg1, align 4
ret void
}
define void @ham(ptr %arg) {
%load = load i32, ptr %arg, align 4
%ashr = ashr i32 %load, 1
store i32 %ashr, ptr %arg, align 4
ret void
}
define i1 @blam.1(ptr %arg) {
%load = load i32, ptr %arg, align 4
%icmp = icmp slt i32 %load, 0
ret i1 %icmp
}
define double @quux(double %arg) {
%fmul = fmul double %arg, 0x3F10000000000000
ret double %fmul
}
define i1 @pluto.2(ptr %arg, ptr %arg1) {
%call = call i1 @wombat(ptr %arg, ptr %arg1)
ret i1 %call
}
attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
$ diff -u <(./clang-before -O3 q.ll -emit-llvm -S -o -) <(./clang-after -O3 q.ll -emit-llvm -S -o -)
--- /dev/fd/63 2025-01-24 01:18:49.168689114 +0100
+++ /dev/fd/62 2025-01-24 01:18:49.168689114 +0100
@@ -15,10 +15,8 @@
%alloca1 = alloca [0 x [0 x [0 x [0 x [0 x %struct.wombat]]]]], align 4
%load.i = load volatile i1, ptr %alloca1, align 4
%load.i.i = load i32, ptr %alloca1, align 4
- %ashr.i.i = ashr i32 %load.i.i, 1
- %0 = add nsw i32 %ashr.i.i, -131072
- %or.cond5 = icmp ult i32 %0, -131073
- br i1 %or.cond5, label %bb3, label %bb4
+ %spec.select6 = icmp ugt i32 %load.i.i, 262143
+ br i1 %spec.select6, label %bb3, label %bb4
bb3: ; preds = %wibble.exit
tail call void @llvm.lifetime.start.p0(i64 0, ptr null)
```
Further analysis and smaller reproducers here: https://github.com/llvm/llvm-project/pull/122723#issuecomment-2611083638
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs