because upper can't be done before otherwise, it will be apply before constant folding and we will have unknown attributes