[llvm] bece10c - [NFC][InstCombine] Add miscompile reproducer from https://reviews.llvm.org/D139275#4001580
Roman Lebedev via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 16 09:29:12 PST 2022
Author: Roman Lebedev
Date: 2022-12-16T20:28:39+03:00
New Revision: bece10c0fd4760460fba5d2fc7002eea346a7d6c
URL: https://github.com/llvm/llvm-project/commit/bece10c0fd4760460fba5d2fc7002eea346a7d6c
DIFF: https://github.com/llvm/llvm-project/commit/bece10c0fd4760460fba5d2fc7002eea346a7d6c.diff
LOG: [NFC][InstCombine] Add miscompile reproducer from https://reviews.llvm.org/D139275#4001580
SimplifyCFG change is correct and not at fault here.
The actual miscompile appears to be happening in InstCombine.
```
$ /builddirs/llvm-project/build-Clang15/bin/opt -load /repositories/alive2/build-Clang-release/tv/tv.so -load-pass-plugin /repositories/alive2/build-Clang-release/tv/tv.so -passes='tv,instcombine,tv' -o /dev/null /repositories/llvm-project/llvm/test/Transforms/InstCombine/D139275_c4001580.ll
----------------------------------------
define float @D139275_c4001580(float %arg) {
%0:
%i = fcmp ugt float %arg, 0.000000
%i1 = fcmp ult float %arg, 1.000000
%i2 = and i1 %i, %i1
%i3 = fcmp uge float %arg, 0.100000
%i4 = xor i1 %i, %i2
%i5 = select i1 %i4, float 0.100000, float 0.000000
%i6 = and i1 %i3, %i2
%i7 = fadd float %arg, -0.100000
%i8 = select i1 %i6, float %i7, float %i5
ret float %i8
}
=>
define float @D139275_c4001580(float %arg) {
%0:
%i = fcmp ugt float %arg, 0.000000
%i1 = fcmp ult float %arg, 1.000000
%i2 = and i1 %i, %i1
%i3 = fcmp uge float %arg, 0.100000
%i7 = fadd float %arg, -0.100000
%i5 = select i1 %i3, float %i7, float 0.100000
%i8 = select i1 %i2, float %i5, float 0.000000
ret float %i8
}
Transformation doesn't verify! (unsound)
ERROR: Value mismatch
Example:
float %arg = #x3dcbb820 (0.099472284317?)
Source:
i1 %i = #x1 (1)
i1 %i1 = #x1 (1)
i1 %i2 = #x1 (1)
i1 %i3 = #x0 (0)
i1 %i4 = #x0 (0)
float %i5 = #x00000000 (+0.0)
i1 %i6 = #x0 (0)
float %i7 = #xba0a5680 (-0.000527717173?)
float %i8 = #x00000000 (+0.0)
Target:
i1 %i = #x1 (1)
i1 %i1 = #x1 (1)
i1 %i2 = #x1 (1)
i1 %i3 = #x0 (0)
float %i7 = #xba0a5680 (-0.000527717173?)
float %i5 = #x3dcccccd (0.100000001490?)
float %i8 = #x3dcccccd (0.100000001490?)
Source value: #x00000000 (+0.0)
Target value: #x3dcccccd (0.100000001490?)
Pass: (anonymous namespace)::TVPass
Command line: '/builddirs/llvm-project/build-Clang15/bin/opt' '-load' '/repositories/alive2/build-Clang-release/tv/tv.so' '-load-pass-plugin' '/repositories/alive2/build-Clang-release/tv/tv.so' '-passes=tv,instcombine,tv' '-o' '/dev/null' '/repositories/llvm-project/llvm/test/Transforms/InstCombine/D139275_c4001580.ll'
Alive2: Transform doesn't verify!
```
Added:
llvm/test/Transforms/InstCombine/D139275_c4001580.ll
Modified:
llvm/test/Transforms/SimplifyCFG/fold-branch-to-common-dest-phis.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/InstCombine/D139275_c4001580.ll b/llvm/test/Transforms/InstCombine/D139275_c4001580.ll
new file mode 100644
index 000000000000..427ef6780abb
--- /dev/null
+++ b/llvm/test/Transforms/InstCombine/D139275_c4001580.ll
@@ -0,0 +1,27 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -passes=instcombine -S < %s | FileCheck %s
+
+; Based on reproduced from https://reviews.llvm.org/D139275#4001580
+; FIXME: this is a miscompile.
+define float @D139275_c4001580(float %arg) {
+; CHECK-LABEL: @D139275_c4001580(
+; CHECK-NEXT: [[I:%.*]] = fcmp ugt float [[ARG:%.*]], 0.000000e+00
+; CHECK-NEXT: [[I1:%.*]] = fcmp ult float [[ARG]], 1.000000e+00
+; CHECK-NEXT: [[I2:%.*]] = and i1 [[I]], [[I1]]
+; CHECK-NEXT: [[I3:%.*]] = fcmp uge float [[ARG]], 0x3FB99999A0000000
+; CHECK-NEXT: [[I7:%.*]] = fadd float [[ARG]], 0xBFB99999A0000000
+; CHECK-NEXT: [[I5:%.*]] = select i1 [[I3]], float [[I7]], float 0x3FB99999A0000000
+; CHECK-NEXT: [[I8:%.*]] = select i1 [[I2]], float [[I5]], float 0.000000e+00
+; CHECK-NEXT: ret float [[I8]]
+;
+ %i = fcmp ugt float %arg, 0.000000e+00
+ %i1 = fcmp ult float %arg, 1.000000e+00
+ %i2 = and i1 %i, %i1
+ %i3 = fcmp uge float %arg, 0x3FB99999A0000000
+ %i4 = xor i1 %i, %i2
+ %i5 = select i1 %i4, float 0x3FB99999A0000000, float 0.000000e+00
+ %i6 = and i1 %i3, %i2
+ %i7 = fadd float %arg, 0xBFB99999A0000000
+ %i8 = select i1 %i6, float %i7, float %i5
+ ret float %i8
+}
diff --git a/llvm/test/Transforms/SimplifyCFG/fold-branch-to-common-dest-phis.ll b/llvm/test/Transforms/SimplifyCFG/fold-branch-to-common-dest-phis.ll
index 31b7470283e8..150bdfcff92a 100644
--- a/llvm/test/Transforms/SimplifyCFG/fold-branch-to-common-dest-phis.ll
+++ b/llvm/test/Transforms/SimplifyCFG/fold-branch-to-common-dest-phis.ll
@@ -453,6 +453,47 @@ final_right:
call void @sideeffect1.vec(<2 x i8> %final_right.phi.1)
ret void
}
+
+; From https://reviews.llvm.org/D139275#4001580
+define float @D139275_c4001580(float %val) {
+; ALL-LABEL: @D139275_c4001580(
+; ALL-NEXT: entry:
+; ALL-NEXT: [[CMP:%.*]] = fcmp ugt float [[VAL:%.*]], 0.000000e+00
+; ALL-NEXT: br i1 [[CMP]], label [[IF_END:%.*]], label [[RETURN:%.*]]
+; ALL: if.end:
+; ALL-NEXT: [[CMP1:%.*]] = fcmp ult float [[VAL]], 1.000000e+00
+; ALL-NEXT: br i1 [[CMP1]], label [[IF_END3:%.*]], label [[RETURN]]
+; ALL: if.end3:
+; ALL-NEXT: [[CMP4:%.*]] = fcmp olt float [[VAL]], 0x3FC99999A0000000
+; ALL-NEXT: br i1 [[CMP4]], label [[RETURN]], label [[IF_END6:%.*]]
+; ALL: if.end6:
+; ALL-NEXT: [[SUB:%.*]] = fadd float [[VAL]], 0xBFB99999A0000000
+; ALL-NEXT: br label [[RETURN]]
+; ALL: return:
+; ALL-NEXT: [[RETVAL_0:%.*]] = phi float [ [[SUB]], [[IF_END6]] ], [ 0.000000e+00, [[ENTRY:%.*]] ], [ 0x3FB99999A0000000, [[IF_END]] ], [ 0.000000e+00, [[IF_END3]] ]
+; ALL-NEXT: ret float [[RETVAL_0]]
+;
+entry:
+ %cmp = fcmp ugt float %val, 0.000000e+00
+ br i1 %cmp, label %if.end, label %return
+
+if.end:
+ %cmp1 = fcmp ult float %val, 1.000000e+00
+ br i1 %cmp1, label %if.end3, label %return
+
+if.end3:
+ %cmp4 = fcmp olt float %val, 0x3FC99999A0000000
+ br i1 %cmp4, label %return, label %if.end6
+
+if.end6:
+ %sub = fadd float %val, 0xBFB99999A0000000
+ br label %return
+
+return:
+ %retval.0 = phi float [ %sub, %if.end6 ], [ 0.000000e+00, %entry ], [ 0x3FB99999A0000000, %if.end ], [ 0.000000e+00, %if.end3 ]
+ ret float %retval.0
+}
+
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
; CHEAP: {{.*}}
; COSTLY: {{.*}}
More information about the llvm-commits
mailing list