<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/124213>124213</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Miscompile after #122723
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
artagnon
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
alexfh
</td>
</tr>
</table>
<pre>
#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
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysWM2OqzoSfhpnY4HsMhCyyCLpo0izGM3iPsDIgJN4jsFcY7rTbz-yDUkgv61zoygx2FX1Vbnq8w_vOnlohFijdIsAuLH80OgGAaD014L39qjNmitx2h8Xha6-1wgYBVgCw7KxRld9KSrMcS27UtetVNxK3cT4XwiWnwIbEQZIi63G9ig7xDaIbFBGhi_ZIEhwyS3-O1YKkY3l5iAsrrjlin_r3mLEfmEEIKIasY2IWlgSxDYM_I97pNNH18oS_xPJc4NCjtiGQh7tczK0Gv8qG8WzJPrLDQO44LBGtkqMGE559t8sifrmd6O_mkjJpj9Fh6YPIt6ZtLOmL238peuCB_D2uxUYLbf40ts12vzGaPlrIjO8nYikW4pPWDI3ITcCX7ooBnSvjJBNJUrFjcCfWlYYJUSpzzpWci-srEXcWW5s3BIEucwSLOuamwOCD9xagxtd8tb2RiBYYQSMjBr3srkoDGiQi-DKQUFkgx0crpQuuUc5NtMtwacHf7MQovTX5QsfLhSYuAZX8tDgxFspuVJnHK3qrUaQO-Rn8whWbiSC1I91YHxDUg9dDtBnMh-40r0LcRoT_xERoYMqXBgvHTS6sYoXQrkXRcFmzzREzDXYBv_og9gWt0ZU3ZCFaVGMkXWGYe7LUR-eeRLdcWXiCbxwJRldYc6VO-ioE7jgnMzN06Qj53zrXUDPUb5nPHlgnJ2NUy9uhPXGndylEiZ5O88Xl_fnBEaQKs0rb8A3PrUjOSWwpCPcUWjMSXrr95HXcwtu0BN0DxIz2BnmMrygs3q7l-CzpHigZdRw0sYrcP_TFLemF-e4hq6TNg_hv2f2nyELH6h3yOJBiArF65jemyX3tC_r1kv4Rn8QN258YDJWFoItIa-DOaidkokL57zgps8w1gA8qIFrL9kP3JyW2vJVqV2bSS9mxrgk5O--PyHI76fZpDwKbhrx_YS1RjNXM-Kes7l3vpZjuMm5e2vBI3-XD_xNztQCI4b2KH2_-3cA0u057pfBeEjGq97s3Jv43mlFtUf5mBDCovjIv_fYYK_nfDfXMEPkM_YRpNfarvFM2dRtbB6waHItAU9E6B0ZOZarb3TKeioYlA3B93pnjspQj4-Wips8fcVo0yxXfhW4JY7bUnxj2bqn7XnopxymlcU3wvcpbF_3IYd841bolNAduf6Mgp1Qogy74KEZwuxp7xK4mdVJRJ3JM47W6j5U3NC8jBv0W-0T5Gz_NFo_XdueDZtQdMiToH_IFCftx3ZWGzEOGZj6SSK-MYt3NgZ_Vi28OwZnfGOW9fTWCzfsudKXm5T7S8qfufGygMl7lft8NZoXyKs8Zzt6m-cOw02-3o_Uq-XpPfp-aw14weDcWiOL3orOH-jCKrfc-qOeUgUvf-NG740QuNHdd1PiRvfNl2wq_CWVMsL2psG1qLVxdMjNoRbufI6N4NWXkTYcFYfzaoIrud_jqMeIfSDIYwS7UvHmEBVi73Ix-g_zFwA4ErW0kTsl4OgvHGkceT0zKb63wrwQQmQTRRFGsKvEJ4LdvkKwyxgGAmlEaAQJJu4wRnPENskqplme5StKE-xIiJJwN7EN37kawD_TkxCUEBzRFMEHJa7HN3McevxcXfYn9O3t7xtH5rD3uK6usYpi-fJUE-A8VnCtYlbV90SjkXDOknOSch0jUUXeUEhNXlW46b6uSWscGlFGyRJG9drEpW6q9EIe_YU8yEWABQvnffco987pF7ZhdWlFGYd1J7syd7D3PIIMaMJG6bPZax3vHbzxo5N3OCvG4iTDYoUtl-rPjt-Tizqy2fXGHoXBvOHqu5Md5k2Fu5orJQw2og0XgqbDR2GEw3i0tvV3frBDsDtIe-yLuNQ1gp2DMvxFrdH_E6VFsGu96V24Y0TAZNf1otR1LRobQUYpyVnG8kW1ZtWKrfhCrOmSLbNlTtLl4rheZXnOIYFUlCuyTKokL1JBeVZUacWTNFnItStcQiEhBEi6jCkTOaUJVMALRoVACRE1lyr2sdLmsPAY1hQSoGzh56Mb7ksb8YV973BhatbenaI_dC7YsrPdRY2VVon1v8ebUoEDi51vVBe9UesfB8yb73zIPL7PNfw_AAD__6cOH3M">