[PATCH] D36975: [InstCombine] Fold branches with irrelevant conditions to a constant
Davide Italiano via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 21 12:01:55 PDT 2017
davide created this revision.
InstCombine folds instructions with irrelevant conditions to `undef`.
This, as Nuno confirmed is a bug.
https://bugs.llvm.org/show_bug.cgi?id=33409#c1
Given the original motivation for the change is that of removing an USE, I suggested to just fold to a constant instead (which seems to reach the same goal without side effects).
Fixes PR33409 (which also contains a more detailed discussion of the bug).
https://reviews.llvm.org/D36975
Files:
lib/Transforms/InstCombine/InstructionCombining.cpp
test/Transforms/InstCombine/branch.ll
test/Transforms/InstCombine/pr33765.ll
test/Transforms/InstCombine/select-cmp-br.ll
Index: test/Transforms/InstCombine/select-cmp-br.ll
===================================================================
--- test/Transforms/InstCombine/select-cmp-br.ll
+++ test/Transforms/InstCombine/select-cmp-br.ll
@@ -248,7 +248,7 @@
define i32 @test6(i32 %arg, i1 %arg1) {
; CHECK-LABEL: @test6(
; CHECK-NEXT: entry:
-; CHECK-NEXT: br i1 undef, label [[BB:%.*]], label [[BB]]
+; CHECK-NEXT: br i1 false, label [[BB:%.*]], label [[BB]]
; CHECK: bb:
; CHECK-NEXT: [[TMP:%.*]] = select i1 [[ARG1:%.*]], i32 [[ARG:%.*]], i32 0
; CHECK-NEXT: ret i32 [[TMP]]
Index: test/Transforms/InstCombine/pr33765.ll
===================================================================
--- test/Transforms/InstCombine/pr33765.ll
+++ test/Transforms/InstCombine/pr33765.ll
@@ -6,7 +6,7 @@
define void @patatino(i8 %beth) {
; CHECK-LABEL: @patatino(
; CHECK-NEXT: [[CONV:%.*]] = zext i8 [[BETH:%.*]] to i32
-; CHECK-NEXT: br i1 undef, label [[IF_THEN9:%.*]], label [[IF_THEN9]]
+; CHECK-NEXT: br i1 false, label [[IF_THEN9:%.*]], label [[IF_THEN9]]
; CHECK: if.then9:
; CHECK-NEXT: [[MUL:%.*]] = mul nuw nsw i32 [[CONV]], [[CONV]]
; CHECK-NEXT: [[TINKY:%.*]] = load i16, i16* @glob, align 2
Index: test/Transforms/InstCombine/branch.ll
===================================================================
--- test/Transforms/InstCombine/branch.ll
+++ test/Transforms/InstCombine/branch.ll
@@ -1,10 +1,12 @@
+; Check that we fold the condition of branches of the
+; form: br <condition> dest1, dest2, where dest1 == dest2.
; RUN: opt -instcombine -S < %s | FileCheck %s
define i32 @test(i32 %x) {
; CHECK-LABEL: @test
entry:
; CHECK-NOT: icmp
-; CHECK: br i1 undef,
+; CHECK: br i1 false
%cmp = icmp ult i32 %x, 7
br i1 %cmp, label %merge, label %merge
merge:
Index: lib/Transforms/InstCombine/InstructionCombining.cpp
===================================================================
--- lib/Transforms/InstCombine/InstructionCombining.cpp
+++ lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -2260,10 +2260,9 @@
// If the condition is irrelevant, remove the use so that other
// transforms on the condition become more effective.
- if (BI.isConditional() &&
- BI.getSuccessor(0) == BI.getSuccessor(1) &&
- !isa<UndefValue>(BI.getCondition())) {
- BI.setCondition(UndefValue::get(BI.getCondition()->getType()));
+ if (BI.isConditional() && !isa<Constant>(BI.getCondition()) &&
+ BI.getSuccessor(0) == BI.getSuccessor(1)) {
+ BI.setCondition(ConstantInt::getFalse(BI.getCondition()->getType()));
return &BI;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D36975.112026.patch
Type: text/x-patch
Size: 2608 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170821/a0de623c/attachment.bin>
More information about the llvm-commits
mailing list