#include "llvm/IR/Instruction.def"
static BinaryOperator *
- CreateWithCopiedFlags(BinaryOps Opc, Value *V1, Value *V2, Instruction *CopyO,
+ CreateWithCopiedFlags(BinaryOps Opc, Value *V1, Value *V2, Value *CopyO,
const Twine &Name = "",
Instruction *InsertBefore = nullptr) {
BinaryOperator *BO = Create(Opc, V1, V2, Name, InsertBefore);
llvm_unreachable("Unexpected BinaryOp!");
}
- auto *Add = cast<BinaryOperator>(Op0);
Value *NewBinOp = Builder.CreateBinOp(OpC, X, ConstantInt::get(Ty, *C));
return BinaryOperator::CreateWithCopiedFlags(Instruction::Add, NewBinOp,
- ConstantInt::get(Ty, *C2), Add);
+ ConstantInt::get(Ty, *C2), Op0);
}
// binop(shift(ShiftedC1, ShAmt), shift(ShiftedC2, add(ShAmt, AddC))) ->
%r = xor i8 %a, 32 ; 00100000
ret i8 %r
}
+
+@g = external global i8
+
+define i32 @canonicalize_logic_first_constexpr(i32 %x) {
+; CHECK-LABEL: define {{[^@]+}}@canonicalize_logic_first_constexpr
+; CHECK-SAME: (i32 [[X:%.*]]) {
+; CHECK-NEXT: ret i32 and (i32 add (i32 ptrtoint (ptr @g to i32), i32 48), i32 -10)
+;
+ %a = add i32 ptrtoint (ptr @g to i32), 48
+ %r = and i32 %a, -10
+ ret i32 %r
+}
+
+define i32 @canonicalize_logic_first_constexpr_nuw(i32 %x) {
+; CHECK-LABEL: define {{[^@]+}}@canonicalize_logic_first_constexpr_nuw
+; CHECK-SAME: (i32 [[X:%.*]]) {
+; CHECK-NEXT: ret i32 and (i32 add (i32 ptrtoint (ptr @g to i32), i32 48), i32 -10)
+;
+ %a = add nuw i32 ptrtoint (ptr @g to i32), 48
+ %r = and i32 %a, -10
+ ret i32 %r
+}