Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion llvm/lib/Transforms/Scalar/Reassociate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -241,8 +241,10 @@ void ReassociatePass::canonicalizeOperands(Instruction *I) {
Value *RHS = I->getOperand(1);
if (LHS == RHS || isa<Constant>(RHS))
return;
if (isa<Constant>(LHS) || getRank(RHS) < getRank(LHS))
if (isa<Constant>(LHS) || getRank(RHS) < getRank(LHS)) {
cast<BinaryOperator>(I)->swapOperands();
MadeChange = true;
}
}

static BinaryOperator *CreateAdd(Value *S1, Value *S2, const Twine &Name,
Expand Down
32 changes: 32 additions & 0 deletions llvm/test/Transforms/Reassociate/canonicalize-made-change.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -passes="print<demanded-bits>,reassociate,bdce" -S < %s | FileCheck %s

; We want to verify that demanded-bits analysis is invalidated when
; reassociate is canonicalizing expressions (e.g. putting the constant on the
; RHS of an OR).
;
; Printing demanded-bits will make sure a demanded-bits analysis is cached.
; Then we run reassociate, followed by bdce. When not invalidating demanded-bits
; while doing reassociation of the OR, we got this kind of error:
;
; Running pass: BDCEPass on foo (4 instructions)
; While deleting: i1 %cmp1
; Use still stuck around after Def is destroyed: %or = or i1 %cmp1, true
; UNREACHABLE executed at ../lib/IR/Value.cpp:102!
;
; Check that we get the expected result without failing on assert/unreachable.

define i1 @foo(i1 %c) {
; CHECK-LABEL: define i1 @foo(
; CHECK-SAME: i1 [[C:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[OR:%.*]] = or i1 false, true
; CHECK-NEXT: [[AND:%.*]] = and i1 [[OR]], [[C]]
; CHECK-NEXT: ret i1 [[AND]]
;
entry:
%cmp = icmp ne i16 0, 1
%or = or i1 true, %cmp
%and = and i1 %c, %or
ret i1 %and
}
Loading