// shortening paths for the values (this helps getUnderlyingObjects() for
// example).
if (TrueSI->getFalseValue() == FalseVal && TrueSI->hasOneUse()) {
- Value *And = Builder.CreateAnd(CondVal, TrueSI->getCondition());
+ // Simply merging into and i1 isn't poison-safe. Do it only when
+ // EnableUnsafeSelectTransform is set.
+ Value *And = EnableUnsafeSelectTransform ?
+ Builder.CreateAnd(CondVal, TrueSI->getCondition()) :
+ Builder.CreateLogicalAnd(CondVal, TrueSI->getCondition());
replaceOperand(SI, 0, And);
replaceOperand(SI, 1, TrueSI->getTrueValue());
return &SI;
}
// select(C0, a, select(C1, a, b)) -> select(C0|C1, a, b)
if (FalseSI->getTrueValue() == TrueVal && FalseSI->hasOneUse()) {
- Value *Or = Builder.CreateOr(CondVal, FalseSI->getCondition());
+ // Simply merging into or i1 isn't poison-safe. Do it only when
+ // EnableUnsafeSelectTransform is set.
+ Value *Or = EnableUnsafeSelectTransform ?
+ Builder.CreateOr(CondVal, FalseSI->getCondition()) :
+ Builder.CreateLogicalOr(CondVal, FalseSI->getCondition());
replaceOperand(SI, 0, Or);
replaceOperand(SI, 2, FalseSI->getFalseValue());
return &SI;
}
define i1 @land_land_right2(i1 %A, i1 %B) {
; CHECK-LABEL: @land_land_right2(
-; CHECK-NEXT: [[TMP1:%.*]] = and i1 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
; CHECK-NEXT: ret i1 [[TMP1]]
;
%c = select i1 %B, i1 %A, i1 false
}
define i1 @lor_lor_right2(i1 %A, i1 %B) {
; CHECK-LABEL: @lor_lor_right2(
-; CHECK-NEXT: [[TMP1:%.*]] = or i1 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
; CHECK-NEXT: ret i1 [[TMP1]]
;
%c = select i1 %B, i1 true, i1 %A